)]}'
{"gnocchi/ceilometer/alarm_api.py":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"523cc5b71cb12f2607165f32b01ea156be599125","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    resource_id_or_selector \u003d wsme.wsattr(wtypes.text, mandatory\u003dTrue)"},{"line_number":29,"context_line":"    \"The id of a resource or a expression to select multiple resources\""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    comparison_operator \u003d basetypes.AdvEnum(\u0027comparison_operator\u0027, str,"},{"line_number":32,"context_line":"                                            \u0027lt\u0027, \u0027le\u0027, \u0027eq\u0027, \u0027ne\u0027, \u0027ge\u0027, \u0027gt\u0027,"},{"line_number":33,"context_line":"                                            default\u003d\u0027eq\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a930d6b_b87235ab","line":30,"updated":"2015-01-22 14:05:10.000000000","message":"You lack the basic selector of a simple metric based on its UUID.\n\nI wonder if we can make this in a single class?","commit_id":"1f6125b9f60101797de88b3e850fce9dbeac634e"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"c15a85fe758003404693e7c4030d8b641ad2cf5e","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    resource_id_or_selector \u003d wsme.wsattr(wtypes.text, mandatory\u003dTrue)"},{"line_number":29,"context_line":"    \"The id of a resource or a expression to select multiple resources\""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    comparison_operator \u003d basetypes.AdvEnum(\u0027comparison_operator\u0027, str,"},{"line_number":32,"context_line":"                                            \u0027lt\u0027, \u0027le\u0027, \u0027eq\u0027, \u0027ne\u0027, \u0027ge\u0027, \u0027gt\u0027,"},{"line_number":33,"context_line":"                                            default\u003d\u0027eq\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a930d6b_e85f2e0d","line":30,"in_reply_to":"1a930d6b_1b1c1e13","updated":"2015-01-26 12:44:56.000000000","message":"Done","commit_id":"1f6125b9f60101797de88b3e850fce9dbeac634e"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"1800f6f69f431861b7240fdab33276c813c82dd5","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    resource_id_or_selector \u003d wsme.wsattr(wtypes.text, mandatory\u003dTrue)"},{"line_number":29,"context_line":"    \"The id of a resource or a expression to select multiple resources\""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    comparison_operator \u003d basetypes.AdvEnum(\u0027comparison_operator\u0027, str,"},{"line_number":32,"context_line":"                                            \u0027lt\u0027, \u0027le\u0027, \u0027eq\u0027, \u0027ne\u0027, \u0027ge\u0027, \u0027gt\u0027,"},{"line_number":33,"context_line":"                                            default\u003d\u0027eq\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a930d6b_1b1c1e13","line":30,"in_reply_to":"1a930d6b_b87235ab","updated":"2015-01-22 16:27:19.000000000","message":"Adding that in my TODO, Pecan/wsme is not really flexible.\nBut If I use a single class, I have to do the mandatory checks manually in the \u0027validate\u0027 method of this wsme types.","commit_id":"1f6125b9f60101797de88b3e850fce9dbeac634e"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"523cc5b71cb12f2607165f32b01ea156be599125","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    \"The threshold of the alarm\""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    statistic \u003d basetypes.AdvEnum(\u0027statistic\u0027, str, \u0027max\u0027, \u0027min\u0027, \u0027mean\u0027,"},{"line_number":40,"context_line":"                                  \u0027sum\u0027, \u0027count\u0027, default\u003d\u0027mean\u0027)"},{"line_number":41,"context_line":"    \"The statistic to compare to the threshold\""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    evaluation_periods \u003d wsme.wsattr(wtypes.IntegerType(minimum\u003d1), default\u003d1)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a930d6b_bd16a753","line":40,"updated":"2015-01-22 14:05:10.000000000","message":"It sounds weird to have str and a non complete list here.","commit_id":"1f6125b9f60101797de88b3e850fce9dbeac634e"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"1800f6f69f431861b7240fdab33276c813c82dd5","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    \"The threshold of the alarm\""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    statistic \u003d basetypes.AdvEnum(\u0027statistic\u0027, str, \u0027max\u0027, \u0027min\u0027, \u0027mean\u0027,"},{"line_number":40,"context_line":"                                  \u0027sum\u0027, \u0027count\u0027, default\u003d\u0027mean\u0027)"},{"line_number":41,"context_line":"    \"The statistic to compare to the threshold\""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    evaluation_periods \u003d wsme.wsattr(wtypes.IntegerType(minimum\u003d1), default\u003d1)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a930d6b_e5f975c9","line":40,"in_reply_to":"1a930d6b_bd16a753","updated":"2015-01-22 16:27:19.000000000","message":"Sure, it\u0027s just a copy/paste of the ceilometer threshold rule. I will build the list from\nextension of \u0027gnocchi.aggregates\u0027 and archive_policy.ArchivePolicy.VALID_AGGREGATION_METHODS\n\nMore generally, all the vocable need to be changed to the gnocchi one I think, WDYT ?","commit_id":"1f6125b9f60101797de88b3e850fce9dbeac634e"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"ee27bf3d60858651f04ced45eb6429eee94475cb","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    \"The threshold of the alarm\""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    statistic \u003d basetypes.AdvEnum(\u0027statistic\u0027, str, \u0027max\u0027, \u0027min\u0027, \u0027mean\u0027,"},{"line_number":40,"context_line":"                                  \u0027sum\u0027, \u0027count\u0027, default\u003d\u0027mean\u0027)"},{"line_number":41,"context_line":"    \"The statistic to compare to the threshold\""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    evaluation_periods \u003d wsme.wsattr(wtypes.IntegerType(minimum\u003d1), default\u003d1)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a930d6b_864a5bc3","line":40,"in_reply_to":"1a930d6b_e5f975c9","updated":"2015-01-23 10:14:49.000000000","message":"Yep!","commit_id":"1f6125b9f60101797de88b3e850fce9dbeac634e"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"d2af44dfec5510436cbf96d29468c7854fa36eed","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#"},{"line_number":2,"context_line":"# Copyright 2013 Red Hat, Inc"},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":5,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a930d6b_9f561ad1","line":2,"updated":"2015-01-23 11:34:20.000000000","message":"I\u0027d love to be younger, but it\u0027s not 2013 anymore :(","commit_id":"4ee6181fff97a4d608e6dd89d9aac04298d6fac2"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"1ab86bb4947e9e2de90c29e33d66b2f90f463683","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#"},{"line_number":2,"context_line":"# Copyright 2013 Red Hat, Inc"},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":5,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a930d6b_287696a4","line":2,"in_reply_to":"1a930d6b_9f561ad1","updated":"2015-01-26 12:44:50.000000000","message":"Done","commit_id":"4ee6181fff97a4d608e6dd89d9aac04298d6fac2"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"7858c1a1503801fbf776a1e12964faa0fe7b7477","unresolved":false,"context_lines":[{"line_number":59,"context_line":"                                        aggregation_method)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    @staticmethod"},{"line_number":62,"context_line":"    @cachetools.ttl_cache(maxsize\u003d1, ttl\u003d600)"},{"line_number":63,"context_line":"    def _get_aggregation_methods():"},{"line_number":64,"context_line":"        ks_client \u003d utils.get_keystone_client()"},{"line_number":65,"context_line":"        gnocchi_url \u003d cfg.CONF.alarm_gnocchi.url"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa81d914_f5f2e36d","line":62,"updated":"2015-01-29 14:53:23.000000000","message":"Nice! :)","commit_id":"b1c22660e0a240f4119aa552fb5be9b3780a0fc2"}],"gnocchi/ceilometer/alarm_evaluator.py":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"523cc5b71cb12f2607165f32b01ea156be599125","unresolved":false,"context_lines":[{"line_number":48,"context_line":"cfg.CONF.import_group(\u0027service_credentials\u0027, \u0027ceilometer.service\u0027)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"class GnocchiThresholdEvaluator(evaluator.Evaluator):"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    # the sliding evaluation window is extended to allow"},{"line_number":54,"context_line":"    # for reporting/ingestion lag"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a930d6b_f8359ddb","line":51,"updated":"2015-01-22 14:05:10.000000000","message":"We should have a base class or a mixin in Ceilometer with a Keystone based Evaluator.","commit_id":"1f6125b9f60101797de88b3e850fce9dbeac634e"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"1800f6f69f431861b7240fdab33276c813c82dd5","unresolved":false,"context_lines":[{"line_number":48,"context_line":"cfg.CONF.import_group(\u0027service_credentials\u0027, \u0027ceilometer.service\u0027)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"class GnocchiThresholdEvaluator(evaluator.Evaluator):"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    # the sliding evaluation window is extended to allow"},{"line_number":54,"context_line":"    # for reporting/ingestion lag"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a930d6b_c2baaf6d","line":51,"in_reply_to":"1a930d6b_f8359ddb","updated":"2015-01-22 16:27:19.000000000","message":"In the base class we have an helper for ceilometerclient but we don\u0027t have access to keystone itself. This is why I use keystoneclient here.","commit_id":"1f6125b9f60101797de88b3e850fce9dbeac634e"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"1ba2e96ed079daac95af7613c1350685ba2d3b5f","unresolved":false,"context_lines":[{"line_number":193,"context_line":"        start, end \u003d self._bound_duration(alarm)"},{"line_number":194,"context_line":"        statistics \u003d self._statistics(alarm, start, end)"},{"line_number":195,"context_line":"        statistics \u003d [stats[2] for stats in statistics"},{"line_number":196,"context_line":"                      if stats[1] \u003d\u003d alarm.rule[\u0027period\u0027]]"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"        if self._sufficient(alarm, statistics):"},{"line_number":199,"context_line":"            def _compare(value):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a930d6b_8f8c5037","line":196,"updated":"2015-01-22 14:59:17.000000000","message":"Can we do better than simply discarding all the statistics if there is no archive policy for the metric matching the alarm period?\n\ne.g. if there\u0027s no direct match, but there is a policy with granularity that\u0027s an even divisor or the period, we could potentially do a mean-of-means (or max-of-maxes or whatever, but not a stddev-of-stddevs).","commit_id":"4ee6181fff97a4d608e6dd89d9aac04298d6fac2"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"8de938ebd5720a1f940a124431356b71c275e96a","unresolved":false,"context_lines":[{"line_number":193,"context_line":"        start, end \u003d self._bound_duration(alarm)"},{"line_number":194,"context_line":"        statistics \u003d self._statistics(alarm, start, end)"},{"line_number":195,"context_line":"        statistics \u003d [stats[2] for stats in statistics"},{"line_number":196,"context_line":"                      if stats[1] \u003d\u003d alarm.rule[\u0027period\u0027]]"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"        if self._sufficient(alarm, statistics):"},{"line_number":199,"context_line":"            def _compare(value):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a930d6b_db5b762c","line":196,"in_reply_to":"1a930d6b_8f8c5037","updated":"2015-01-22 16:24:38.000000000","message":"Good idea, I add that in my todo.","commit_id":"4ee6181fff97a4d608e6dd89d9aac04298d6fac2"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"7858c1a1503801fbf776a1e12964faa0fe7b7477","unresolved":false,"context_lines":[{"line_number":85,"context_line":"                   \"aggregation\u003d%s\u0026start\u003d%s\u0026end\u003d%s\") % ("},{"line_number":86,"context_line":"                       self.gnocchi_url,"},{"line_number":87,"context_line":"                       alarm.rule[\u0027resource_type\u0027],"},{"line_number":88,"context_line":"                       alarm.rule[\u0027resource\u0027],"},{"line_number":89,"context_line":"                       alarm.rule[\u0027metric\u0027],"},{"line_number":90,"context_line":"                       alarm.rule[\u0027aggregation\u0027],"},{"line_number":91,"context_line":"                       start, end)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa81d914_b8e30232","line":88,"updated":"2015-01-29 14:53:23.000000000","message":"In order to produce a cross-metric aggregation based on a resource attribute constraint e.g.:\n\n   /v1/resource/instance/server_group\u003dfoobar/metrics/cpu_util?aggregation\u003dmax\n\nwould it be more readable/intuitive for the alarm.rule \u0027resource\u0027 key to be say \u0027resource_constraint\u0027 or \u0027matching_resource\u0027 or some-such instead?","commit_id":"b1c22660e0a240f4119aa552fb5be9b3780a0fc2"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"e254a4e1f8b7644364152d05c321c450e0a47df3","unresolved":false,"context_lines":[{"line_number":85,"context_line":"                   \"aggregation\u003d%s\u0026start\u003d%s\u0026end\u003d%s\") % ("},{"line_number":86,"context_line":"                       self.gnocchi_url,"},{"line_number":87,"context_line":"                       alarm.rule[\u0027resource_type\u0027],"},{"line_number":88,"context_line":"                       alarm.rule[\u0027resource\u0027],"},{"line_number":89,"context_line":"                       alarm.rule[\u0027metric\u0027],"},{"line_number":90,"context_line":"                       alarm.rule[\u0027aggregation\u0027],"},{"line_number":91,"context_line":"                       start, end)"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_159ae06d","line":88,"in_reply_to":"fa81d914_b8e30232","updated":"2015-02-04 15:31:42.000000000","message":"+1 for resource_constraint, done","commit_id":"b1c22660e0a240f4119aa552fb5be9b3780a0fc2"}],"gnocchi/ceilometer/utils.py":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"f00067163a7c0a895288c15759413d8ffb7bf47b","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        insecure\u003dcfg.CONF.service_credentials.insecure)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"def cached_property(duration\u003dNone):"},{"line_number":38,"context_line":"    def inner(func):"},{"line_number":39,"context_line":"        @functools.wraps(func)"},{"line_number":40,"context_line":"        def get(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa81d914_e4c99d5b","line":37,"updated":"2015-01-28 09:53:21.000000000","message":"What about using a module that implements rather than our owns?","commit_id":"26494e1f30526ce324700450d3c72f0b0c97c19b"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"725fc90108e7fe9b28bd43bb8e3ba415b51dca6c","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        insecure\u003dcfg.CONF.service_credentials.insecure)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"def cached_property(duration\u003dNone):"},{"line_number":38,"context_line":"    def inner(func):"},{"line_number":39,"context_line":"        @functools.wraps(func)"},{"line_number":40,"context_line":"        def get(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa81d914_7510c4a8","line":37,"in_reply_to":"fa81d914_e4c99d5b","updated":"2015-01-29 10:02:04.000000000","message":"This one looks good: http://pythonhosted.org/cachetools/ \n100% coverage, active, same API as python lru_cache, but a bit young and not yet in requirements","commit_id":"26494e1f30526ce324700450d3c72f0b0c97c19b"}],"setup.cfg":[{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"7858c1a1503801fbf776a1e12964faa0fe7b7477","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"ceilometer.alarm.evaluator \u003d"},{"line_number":59,"context_line":"    gnocchi_resources_threshold \u003d gnocchi.ceilometer.alarm_evaluator:GnocchiThresholdEvaluator"},{"line_number":60,"context_line":"    gnocchi_metrics_threshold \u003d gnocchi.ceilometer.alarm_evaluator:GnocchiThresholdEvaluator"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"gnocchi.ceilometer.resource \u003d"},{"line_number":63,"context_line":"    instance \u003d gnocchi.ceilometer.resources.instance:Instance"}],"source_content_type":"text/x-ttcn-cfg","patch_set":10,"id":"fa81d914_755a7351","line":60,"updated":"2015-01-29 14:53:23.000000000","message":"Dumb question ... where are these entry points currently loaded?","commit_id":"b1c22660e0a240f4119aa552fb5be9b3780a0fc2"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"60e42ae34c0c85a9369c0aad57772b31bc27278c","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"ceilometer.alarm.evaluator \u003d"},{"line_number":59,"context_line":"    gnocchi_resources_threshold \u003d gnocchi.ceilometer.alarm_evaluator:GnocchiThresholdEvaluator"},{"line_number":60,"context_line":"    gnocchi_metrics_threshold \u003d gnocchi.ceilometer.alarm_evaluator:GnocchiThresholdEvaluator"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"gnocchi.ceilometer.resource \u003d"},{"line_number":63,"context_line":"    instance \u003d gnocchi.ceilometer.resources.instance:Instance"}],"source_content_type":"text/x-ttcn-cfg","patch_set":10,"id":"da86d52c_fb63573f","line":60,"in_reply_to":"da86d52c_550c58ed","updated":"2015-02-05 12:04:52.000000000","message":"OK, I see ... so basically the gnocchi alarm rules and evaluators would be loaded into the ceilometer API service and alarm evaluation service respectively?","commit_id":"b1c22660e0a240f4119aa552fb5be9b3780a0fc2"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"e254a4e1f8b7644364152d05c321c450e0a47df3","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"ceilometer.alarm.evaluator \u003d"},{"line_number":59,"context_line":"    gnocchi_resources_threshold \u003d gnocchi.ceilometer.alarm_evaluator:GnocchiThresholdEvaluator"},{"line_number":60,"context_line":"    gnocchi_metrics_threshold \u003d gnocchi.ceilometer.alarm_evaluator:GnocchiThresholdEvaluator"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"gnocchi.ceilometer.resource \u003d"},{"line_number":63,"context_line":"    instance \u003d gnocchi.ceilometer.resources.instance:Instance"}],"source_content_type":"text/x-ttcn-cfg","patch_set":10,"id":"da86d52c_550c58ed","line":60,"in_reply_to":"fa81d914_755a7351","updated":"2015-02-04 15:31:42.000000000","message":"The alarm rules here:  https://review.openstack.org/#/c/149063/\n\nAnd the evaluators here: https://github.com/openstack/ceilometer/blob/master/ceilometer/alarm/service.py#L64","commit_id":"b1c22660e0a240f4119aa552fb5be9b3780a0fc2"}]}
