)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"6a68d93d97224badf2368a8d6c27311b752b45ec","unresolved":false,"context_lines":[{"line_number":10,"context_line":"via a new kind of endpoint:"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"  /v1/resource/instance/server_group\u003dfoobar∧display_name\u003dex/ \\"},{"line_number":13,"context_line":"     entities/cpu_util\u0026aggregation\u003d60"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"to aggregated the measurements of entities that are instance with"},{"line_number":16,"context_line":"attributes server_group set to foobar and display_name set to ex"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"9aa7fdbe_bbca204d","line":13,"updated":"2014-10-22 09:22:11.000000000","message":"Nitpick: IIUC the aggregation\u003d\u003cseconds\u003e query param mentioned in the mid-cycle etherpad referred to the idea that we\u0027d allow the granularity to be selectable in the query, in the sense of this old patch: \n\n  https://review.openstack.org/103435\n\nWhereas in the current patch, you\u0027re allowing the aggregation-method for cross-entity aggregation to be selected via this query param.\n\nSo maybe an example more like:\n\n   /v1/resource/instance/server_group\u003dfoobar?display_name\u003dex/ \\\n     entities/cpu_util\u0026aggregation\u003dmax\n\nwould make more sense?","commit_id":"667e40e34abcba54aeff9031056d932bb31d78ed"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"b0ba3a02bbb9129e0c9ac874a7939fb40fc3bab2","unresolved":false,"context_lines":[{"line_number":10,"context_line":"via a new kind of endpoint:"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"  /v1/resource/instance/server_group\u003dfoobar∧display_name\u003dex/ \\"},{"line_number":13,"context_line":"     entities/cpu_util\u0026aggregation\u003d60"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"to aggregated the measurements of entities that are instance with"},{"line_number":16,"context_line":"attributes server_group set to foobar and display_name set to ex"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"9aa7fdbe_83831355","line":13,"in_reply_to":"9aa7fdbe_bbca204d","updated":"2014-12-04 12:22:24.000000000","message":"Sure, I have just missed to change that one after the etherpad copy/paste","commit_id":"667e40e34abcba54aeff9031056d932bb31d78ed"}],"gnocchi/carbonara.py":[{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"543db97c99270338e6105fc180dc3ddfddb7be32","unresolved":false,"context_lines":[{"line_number":338,"context_line":"            ts \u003d AggregatedTimeSerie(None, None, *dim)"},{"line_number":339,"context_line":"            grouped \u003d pandas.concat(tss).groupby(level\u003d0)"},{"line_number":340,"context_line":"            # NOTE(sileht): Does that make sense to do that on"},{"line_number":341,"context_line":"            # std and median ?"},{"line_number":342,"context_line":"            values \u003d getattr(grouped, aggregation)().sort_index().iteritems()"},{"line_number":343,"context_line":"            ts.set_values(values)"},{"line_number":344,"context_line":"            merged_agg_timeseries.append(ts)"}],"source_content_type":"text/x-python","patch_set":3,"id":"baa201ad_eddea910","line":341,"updated":"2014-10-02 13:26:53.000000000","message":"Well it wouldn\u0027t make sense to calculate the std and median from the already-aggreated std and median values for the individual series, but it would if we were to re-aggregate over the raw datapoints.","commit_id":"50c52cf9224b2218e0be37a541e628da4461cda0"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"4b5cc0fd2c109826cd0aa896b553d35c50ebbc74","unresolved":false,"context_lines":[{"line_number":345,"context_line":""},{"line_number":346,"context_line":"        r \u003d pandas.concat(timeseries)"},{"line_number":347,"context_line":"        r \u003d r.sort_index()"},{"line_number":348,"context_line":"        return TimeSerieArchive(r, merged_agg_timeseries)"}],"source_content_type":"text/x-python","patch_set":3,"id":"baa201ad_9ed701bf","line":348,"updated":"2014-10-02 14:35:39.000000000","message":"I guess you meant cls()","commit_id":"50c52cf9224b2218e0be37a541e628da4461cda0"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"2480244c77afe0834e4b40e72749b07865912f61","unresolved":false,"context_lines":[{"line_number":345,"context_line":""},{"line_number":346,"context_line":"        r \u003d pandas.concat(timeseries)"},{"line_number":347,"context_line":"        r \u003d r.sort_index()"},{"line_number":348,"context_line":"        return TimeSerieArchive(r, merged_agg_timeseries)"}],"source_content_type":"text/x-python","patch_set":3,"id":"baa201ad_a3cd5787","line":348,"in_reply_to":"baa201ad_9ed701bf","updated":"2014-10-07 08:02:31.000000000","message":"Done","commit_id":"50c52cf9224b2218e0be37a541e628da4461cda0"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"78dfe1f9a08099f992fb5f5a20903d920a2fa420","unresolved":false,"context_lines":[{"line_number":320,"context_line":"            return (agg_ts.max_size, agg_ts.block_size,"},{"line_number":321,"context_line":"                    agg_ts.sampling, agg_ts.aggregation_method)"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"        # TODO(sileht): check that all TimeSerieArchive"},{"line_number":324,"context_line":"        # have the same number of aggregate with the same"},{"line_number":325,"context_line":"        # archive configuration"},{"line_number":326,"context_line":"        timeseries \u003d []"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_9f84230c","line":323,"updated":"2014-10-15 19:51:44.000000000","message":"Once you have this, I guess you can remove the aggregation argument on this method. I think it\u0027d be a good idea to add it in this patchset. :)","commit_id":"d1a1b0cf63fe966173ac3d7fcfaa744870f4e8f3"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"ae7dac4da813cac1ea502d9e8af8b6c2e2096dbb","unresolved":false,"context_lines":[{"line_number":320,"context_line":"            return (agg_ts.max_size, agg_ts.block_size,"},{"line_number":321,"context_line":"                    agg_ts.sampling, agg_ts.aggregation_method)"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"        # TODO(sileht): check that all TimeSerieArchive"},{"line_number":324,"context_line":"        # have the same number of aggregate with the same"},{"line_number":325,"context_line":"        # archive configuration"},{"line_number":326,"context_line":"        timeseries \u003d []"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_b00726c9","line":323,"in_reply_to":"baa201ad_9f84230c","updated":"2014-10-17 09:21:10.000000000","message":"Done","commit_id":"d1a1b0cf63fe966173ac3d7fcfaa744870f4e8f3"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"6a68d93d97224badf2368a8d6c27311b752b45ec","unresolved":false,"context_lines":[{"line_number":334,"context_line":"            for agg_ts in ts.agg_timeseries:"},{"line_number":335,"context_line":"                dim \u003d dimension(agg_ts)"},{"line_number":336,"context_line":"                if dim not in agg_timeseries:"},{"line_number":337,"context_line":"                    raise UnAggregableTimeseries"},{"line_number":338,"context_line":"                agg_timeseries[dim].append(agg_ts)"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"        n_ts_per_dimension \u003d None"}],"source_content_type":"text/x-python","patch_set":8,"id":"9aa7fdbe_164a23ac","line":337,"updated":"2014-10-22 09:22:11.000000000","message":"I don\u0027t know if this could be handled in a graceful way, but not all mismatches necessarily require bailing here.\n\nFor example if the granularity matches, the number of points retained doesn\u0027t match, but there\u0027s enough of an overlap to satisfy the timerange span of the query.","commit_id":"667e40e34abcba54aeff9031056d932bb31d78ed"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"b0ba3a02bbb9129e0c9ac874a7939fb40fc3bab2","unresolved":false,"context_lines":[{"line_number":334,"context_line":"            for agg_ts in ts.agg_timeseries:"},{"line_number":335,"context_line":"                dim \u003d dimension(agg_ts)"},{"line_number":336,"context_line":"                if dim not in agg_timeseries:"},{"line_number":337,"context_line":"                    raise UnAggregableTimeseries"},{"line_number":338,"context_line":"                agg_timeseries[dim].append(agg_ts)"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"        n_ts_per_dimension \u003d None"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_4d4655c1","line":337,"in_reply_to":"9aa7fdbe_164a23ac","updated":"2014-12-04 12:22:24.000000000","message":"I have added a TODO, to be less restritive.","commit_id":"667e40e34abcba54aeff9031056d932bb31d78ed"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"6a68d93d97224badf2368a8d6c27311b752b45ec","unresolved":false,"context_lines":[{"line_number":350,"context_line":"            ts \u003d AggregatedTimeSerie(None, None, *dim)"},{"line_number":351,"context_line":"            grouped \u003d pandas.concat(tss).groupby(level\u003d0)"},{"line_number":352,"context_line":"            # NOTE(sileht): Does that make sense to do that on"},{"line_number":353,"context_line":"            # std and median ?"},{"line_number":354,"context_line":"            values \u003d getattr(grouped, aggregation)().sort_index().iteritems()"},{"line_number":355,"context_line":"            ts.set_values(values)"},{"line_number":356,"context_line":"            merged_agg_timeseries.append(ts)"}],"source_content_type":"text/x-python","patch_set":8,"id":"9aa7fdbe_f6491fd1","line":353,"updated":"2014-10-22 09:22:11.000000000","message":"Do you mean, does it make sense to compute the median of medians or the stddev of stddevs?","commit_id":"667e40e34abcba54aeff9031056d932bb31d78ed"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"b0ba3a02bbb9129e0c9ac874a7939fb40fc3bab2","unresolved":false,"context_lines":[{"line_number":350,"context_line":"            ts \u003d AggregatedTimeSerie(None, None, *dim)"},{"line_number":351,"context_line":"            grouped \u003d pandas.concat(tss).groupby(level\u003d0)"},{"line_number":352,"context_line":"            # NOTE(sileht): Does that make sense to do that on"},{"line_number":353,"context_line":"            # std and median ?"},{"line_number":354,"context_line":"            values \u003d getattr(grouped, aggregation)().sort_index().iteritems()"},{"line_number":355,"context_line":"            ts.set_values(values)"},{"line_number":356,"context_line":"            merged_agg_timeseries.append(ts)"}],"source_content_type":"text/x-python","patch_set":8,"id":"9aa7fdbe_c310bb03","line":353,"in_reply_to":"9aa7fdbe_f6491fd1","updated":"2014-12-04 12:22:24.000000000","message":"yep, I have rephrase this note.","commit_id":"667e40e34abcba54aeff9031056d932bb31d78ed"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"8ab7fdc850c080ea7ebc8390f0e968801d7bb4f1","unresolved":false,"context_lines":[{"line_number":378,"context_line":"            # the number of points retained doesn\u0027t match, but there\u0027s enough"},{"line_number":379,"context_line":"            # of an overlap to satisfy the timerange span of the query we can"},{"line_number":380,"context_line":"            # allow it too."},{"line_number":381,"context_line":"            definition \u003d timeserie.to_dict(only_definitions\u003dTrue)"},{"line_number":382,"context_line":"            if ref_definition is None:"},{"line_number":383,"context_line":"                ref_definition \u003d definition"},{"line_number":384,"context_line":"            elif ref_definition !\u003d definition:"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_3bdf7e67","line":381,"updated":"2014-12-04 15:57:34.000000000","message":"this to_dict() extra parameter just to compare the granularity sounds like a hack indeed. What about just checking that as stated in the todo and let the to_dict() method alone? :)","commit_id":"80c01bd9221cbcdf1135ac635681d058d5ee3386"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"d110c059f5432212754a084ed2f0a62f185855e2","unresolved":false,"context_lines":[{"line_number":378,"context_line":"            # the number of points retained doesn\u0027t match, but there\u0027s enough"},{"line_number":379,"context_line":"            # of an overlap to satisfy the timerange span of the query we can"},{"line_number":380,"context_line":"            # allow it too."},{"line_number":381,"context_line":"            definition \u003d timeserie.to_dict(only_definitions\u003dTrue)"},{"line_number":382,"context_line":"            if ref_definition is None:"},{"line_number":383,"context_line":"                ref_definition \u003d definition"},{"line_number":384,"context_line":"            elif ref_definition !\u003d definition:"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_8a5b6786","line":381,"in_reply_to":"5a890539_3bdf7e67","updated":"2014-12-09 12:12:42.000000000","message":"Done","commit_id":"80c01bd9221cbcdf1135ac635681d058d5ee3386"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"50f37361385bf77ed7cb02e2be1d07501059d623","unresolved":false,"context_lines":[{"line_number":305,"context_line":"                       aggregation_method\u003daggregation_method)"},{"line_number":306,"context_line":"                    for sampling, size in definitions])"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"    def fetch(self, from_timestamp\u003dNone, to_timestamp\u003dNone, agg_filter\u003dNone):"},{"line_number":309,"context_line":"        \"\"\"Fetch aggregated time value."},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"        Returns a sorted list of tuples (timestamp, granularity, value)."}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_9578db90","line":308,"updated":"2014-12-09 17:04:27.000000000","message":"This is actually a timeserie filter, not an agg one.","commit_id":"485ea24871b290cf713847ca5905d5d033d944e2"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"435ddd503f1f68a3999d243a8e1af5557975fe8b","unresolved":false,"context_lines":[{"line_number":305,"context_line":"                       aggregation_method\u003daggregation_method)"},{"line_number":306,"context_line":"                    for sampling, size in definitions])"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"    def fetch(self, from_timestamp\u003dNone, to_timestamp\u003dNone, agg_filter\u003dNone):"},{"line_number":309,"context_line":"        \"\"\"Fetch aggregated time value."},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"        Returns a sorted list of tuples (timestamp, granularity, value)."}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_31000667","line":308,"in_reply_to":"3a961159_9578db90","updated":"2014-12-10 10:39:02.000000000","message":"Done","commit_id":"485ea24871b290cf713847ca5905d5d033d944e2"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"50f37361385bf77ed7cb02e2be1d07501059d623","unresolved":false,"context_lines":[{"line_number":350,"context_line":"    def to_dict(self):"},{"line_number":351,"context_line":"        return {"},{"line_number":352,"context_line":"            \"timeserie\": self.full_res_timeserie.to_dict(),"},{"line_number":353,"context_line":"            \"archives\": [ts.to_dict()"},{"line_number":354,"context_line":"                         for ts in self.agg_timeseries],"},{"line_number":355,"context_line":"        }"},{"line_number":356,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_1564ebe3","line":353,"updated":"2014-12-09 17:04:27.000000000","message":"unrelated change!","commit_id":"485ea24871b290cf713847ca5905d5d033d944e2"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"435ddd503f1f68a3999d243a8e1af5557975fe8b","unresolved":false,"context_lines":[{"line_number":350,"context_line":"    def to_dict(self):"},{"line_number":351,"context_line":"        return {"},{"line_number":352,"context_line":"            \"timeserie\": self.full_res_timeserie.to_dict(),"},{"line_number":353,"context_line":"            \"archives\": [ts.to_dict()"},{"line_number":354,"context_line":"                         for ts in self.agg_timeseries],"},{"line_number":355,"context_line":"        }"},{"line_number":356,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_11094a95","line":353,"in_reply_to":"3a961159_1564ebe3","updated":"2014-12-10 10:39:02.000000000","message":"Done","commit_id":"485ea24871b290cf713847ca5905d5d033d944e2"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"50f37361385bf77ed7cb02e2be1d07501059d623","unresolved":false,"context_lines":[{"line_number":367,"context_line":"        return msgpack.dumps(self.to_dict())"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"    @classmethod"},{"line_number":370,"context_line":"    def aggregated(cls, timeseries, from_timestamp\u003dNone, to_timestamp\u003dNone,"},{"line_number":371,"context_line":"                   aggregation\u003d\u0027mean\u0027):"},{"line_number":372,"context_line":"        index \u003d [\u0027timestamp\u0027, \u0027granularity\u0027]"},{"line_number":373,"context_line":"        columns \u003d [\u0027timestamp\u0027, \u0027granularity\u0027, \u0027value\u0027]"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_15d94b83","line":370,"updated":"2014-12-09 17:04:27.000000000","message":"Actually this is a staticmethod","commit_id":"485ea24871b290cf713847ca5905d5d033d944e2"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"435ddd503f1f68a3999d243a8e1af5557975fe8b","unresolved":false,"context_lines":[{"line_number":367,"context_line":"        return msgpack.dumps(self.to_dict())"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"    @classmethod"},{"line_number":370,"context_line":"    def aggregated(cls, timeseries, from_timestamp\u003dNone, to_timestamp\u003dNone,"},{"line_number":371,"context_line":"                   aggregation\u003d\u0027mean\u0027):"},{"line_number":372,"context_line":"        index \u003d [\u0027timestamp\u0027, \u0027granularity\u0027]"},{"line_number":373,"context_line":"        columns \u003d [\u0027timestamp\u0027, \u0027granularity\u0027, \u0027value\u0027]"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_5103d272","line":370,"in_reply_to":"3a961159_15d94b83","updated":"2014-12-10 10:39:02.000000000","message":"Done","commit_id":"485ea24871b290cf713847ca5905d5d033d944e2"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"50f37361385bf77ed7cb02e2be1d07501059d623","unresolved":false,"context_lines":[{"line_number":390,"context_line":"                dataframes.append(dataframe)"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"        if not dataframes:"},{"line_number":393,"context_line":"            # NOTE(sileht): Should we raise UnAggregableTimeseries ?"},{"line_number":394,"context_line":"            return []"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"        points_count \u003d pandas.concat(dataframes).groupby("}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_558cb37f","line":393,"updated":"2014-12-09 17:04:27.000000000","message":"I guess it just means that there\u0027s no result for the timestamp being specified, so returning [] sounds correct.","commit_id":"485ea24871b290cf713847ca5905d5d033d944e2"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"50f37361385bf77ed7cb02e2be1d07501059d623","unresolved":false,"context_lines":[{"line_number":399,"context_line":"        minimum \u003d len(points_count[points_count \u003c len(timeseries)].dropna())"},{"line_number":400,"context_line":"        percent_overlap \u003d float(maximum - minimum) * 100.0 / float(maximum)"},{"line_number":401,"context_line":"        if percent_overlap \u003c 80.0:"},{"line_number":402,"context_line":"            # NOTE(sileht): less than 90% of overlap"},{"line_number":403,"context_line":"            raise UnAggregableTimeseries(\u0027Only %d%% of datapoints overlap in \u0027"},{"line_number":404,"context_line":"                                         \u0027this timespan\u0027 % percent_overlap)"},{"line_number":405,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_7538cfa0","line":402,"updated":"2014-12-09 17:04:27.000000000","message":"80? 90?\nI don\u0027t even get why you picked this value. :)\n\nMaybe it should be an attribute of the result or a custom value passed in arg.","commit_id":"485ea24871b290cf713847ca5905d5d033d944e2"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"435ddd503f1f68a3999d243a8e1af5557975fe8b","unresolved":false,"context_lines":[{"line_number":399,"context_line":"        minimum \u003d len(points_count[points_count \u003c len(timeseries)].dropna())"},{"line_number":400,"context_line":"        percent_overlap \u003d float(maximum - minimum) * 100.0 / float(maximum)"},{"line_number":401,"context_line":"        if percent_overlap \u003c 80.0:"},{"line_number":402,"context_line":"            # NOTE(sileht): less than 90% of overlap"},{"line_number":403,"context_line":"            raise UnAggregableTimeseries(\u0027Only %d%% of datapoints overlap in \u0027"},{"line_number":404,"context_line":"                                         \u0027this timespan\u0027 % percent_overlap)"},{"line_number":405,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_913b7a37","line":402,"in_reply_to":"3a961159_7538cfa0","updated":"2014-12-10 10:39:02.000000000","message":"It comes from my magic hat :)\n\nI have added a TODO. to make it accessible throught API, and propose a additionnal review to implement it","commit_id":"485ea24871b290cf713847ca5905d5d033d944e2"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"e66680b828bb0a6807663f2abccf33024bae1da6","unresolved":false,"context_lines":[{"line_number":410,"context_line":"        # result can looks wierd, but this is the best we can do"},{"line_number":411,"context_line":"        # because we don\u0027t have anymore the raw datapoints in those case."},{"line_number":412,"context_line":"        # FIXME(sileht): so should we bailout is case of stddev and median ?"},{"line_number":413,"context_line":"        agg_timeserie \u003d getattr(grouped, aggregation)()"},{"line_number":414,"context_line":"        points \u003d (agg_timeserie.dropna().reset_index()"},{"line_number":415,"context_line":"                  .sort([\u0027granularity\u0027, \u0027timestamp\u0027], ascending\u003d[0, 1])"},{"line_number":416,"context_line":"                  .itertuples())"}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_1077993c","line":413,"updated":"2014-12-17 16:49:01.000000000","message":"It seems that waiting until now to extract the particular aggregation-function that we\u0027re interested in (mean, max, count, whatever) means we potentially manipulate a fair bit of data that\u0027ll just end up being dropped on the floor.\n\nI wonder would it make sense to focus in a bit earlier on the particular AggregatedTimeSerie within the TimeSerieArchive that we\u0027re going to be finally selecting the response from?\n\nHow about adding a new aggregation parameter to TimeSerieArchive.fetch() to allow only a particular aggregation-function, so that on line 383 we can start out with only points relevant to that aggregation-function? (i.e. discarding the points associated with the other aggregation-functions that we\u0027re not interested in)\n\nIIUC the degree overlap would generally be the same for each aggregate-function.","commit_id":"546cb38bb3289ae8d1ee73633273684ea5e4928c"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"02c846574d71d9bcf3a22b4093bce446ce2cae5d","unresolved":false,"context_lines":[{"line_number":410,"context_line":"        # result can looks wierd, but this is the best we can do"},{"line_number":411,"context_line":"        # because we don\u0027t have anymore the raw datapoints in those case."},{"line_number":412,"context_line":"        # FIXME(sileht): so should we bailout is case of stddev and median ?"},{"line_number":413,"context_line":"        agg_timeserie \u003d getattr(grouped, aggregation)()"},{"line_number":414,"context_line":"        points \u003d (agg_timeserie.dropna().reset_index()"},{"line_number":415,"context_line":"                  .sort([\u0027granularity\u0027, \u0027timestamp\u0027], ascending\u003d[0, 1])"},{"line_number":416,"context_line":"                  .itertuples())"}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_b6831ea8","line":413,"in_reply_to":"3a961159_1077993c","updated":"2014-12-17 17:18:41.000000000","message":"That should have been AggregatedTimeSeries plural in \"focus in a bit earlier on the particular AggregatedTimeSerie\" in the sense that IIUC there may be multiple AggregatedTimeSeries for the same aggregation-function within a given TimeSerieArchive if there are multiple granularities defined on the archive policy.","commit_id":"546cb38bb3289ae8d1ee73633273684ea5e4928c"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"5910161c32759163ff6799833e44aa9072bb8535","unresolved":false,"context_lines":[{"line_number":410,"context_line":"        # result can looks wierd, but this is the best we can do"},{"line_number":411,"context_line":"        # because we don\u0027t have anymore the raw datapoints in those case."},{"line_number":412,"context_line":"        # FIXME(sileht): so should we bailout is case of stddev and median ?"},{"line_number":413,"context_line":"        agg_timeserie \u003d getattr(grouped, aggregation)()"},{"line_number":414,"context_line":"        points \u003d (agg_timeserie.dropna().reset_index()"},{"line_number":415,"context_line":"                  .sort([\u0027granularity\u0027, \u0027timestamp\u0027], ascending\u003d[0, 1])"},{"line_number":416,"context_line":"                  .itertuples())"}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_620d5e37","line":413,"in_reply_to":"3a961159_1077993c","updated":"2014-12-18 07:12:17.000000000","message":"The \u0027timeseries\u0027 passed to the method \u0027aggregated\u0027 \nare already TimeSerieArchive of the desired aggregation-function. The storage driver have already retrieved only the timeseries of the aggregated-function we are interested in.","commit_id":"546cb38bb3289ae8d1ee73633273684ea5e4928c"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"096af8153fc51043862934b9d35b0296da825928","unresolved":false,"context_lines":[{"line_number":410,"context_line":"        # result can looks wierd, but this is the best we can do"},{"line_number":411,"context_line":"        # because we don\u0027t have anymore the raw datapoints in those case."},{"line_number":412,"context_line":"        # FIXME(sileht): so should we bailout is case of stddev and median ?"},{"line_number":413,"context_line":"        agg_timeserie \u003d getattr(grouped, aggregation)()"},{"line_number":414,"context_line":"        points \u003d (agg_timeserie.dropna().reset_index()"},{"line_number":415,"context_line":"                  .sort([\u0027granularity\u0027, \u0027timestamp\u0027], ascending\u003d[0, 1])"},{"line_number":416,"context_line":"                  .itertuples())"}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_99b9d830","line":413,"in_reply_to":"3a961159_620d5e37","updated":"2014-12-18 12:22:04.000000000","message":"A-ha, cool, got it :)","commit_id":"546cb38bb3289ae8d1ee73633273684ea5e4928c"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"5910161c32759163ff6799833e44aa9072bb8535","unresolved":false,"context_lines":[{"line_number":410,"context_line":"        # result can looks wierd, but this is the best we can do"},{"line_number":411,"context_line":"        # because we don\u0027t have anymore the raw datapoints in those case."},{"line_number":412,"context_line":"        # FIXME(sileht): so should we bailout is case of stddev and median ?"},{"line_number":413,"context_line":"        agg_timeserie \u003d getattr(grouped, aggregation)()"},{"line_number":414,"context_line":"        points \u003d (agg_timeserie.dropna().reset_index()"},{"line_number":415,"context_line":"                  .sort([\u0027granularity\u0027, \u0027timestamp\u0027], ascending\u003d[0, 1])"},{"line_number":416,"context_line":"                  .itertuples())"}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_c23452e0","line":413,"in_reply_to":"3a961159_b6831ea8","updated":"2014-12-18 07:12:17.000000000","message":"You means moving this method into a AggregatedTimeSeries (plural) class ? If yes, that make sense to me too.","commit_id":"546cb38bb3289ae8d1ee73633273684ea5e4928c"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"e66680b828bb0a6807663f2abccf33024bae1da6","unresolved":false,"context_lines":[{"line_number":412,"context_line":"        # FIXME(sileht): so should we bailout is case of stddev and median ?"},{"line_number":413,"context_line":"        agg_timeserie \u003d getattr(grouped, aggregation)()"},{"line_number":414,"context_line":"        points \u003d (agg_timeserie.dropna().reset_index()"},{"line_number":415,"context_line":"                  .sort([\u0027granularity\u0027, \u0027timestamp\u0027], ascending\u003d[0, 1])"},{"line_number":416,"context_line":"                  .itertuples())"},{"line_number":417,"context_line":"        points \u003d [(timestamp, granularity, value)"},{"line_number":418,"context_line":"                  for __, timestamp, granularity, value in points]"}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_70b61dde","line":415,"updated":"2014-12-17 16:49:01.000000000","message":"Does the ascending\u003d[0,1] sort order give us finest-to-coarsest granularity first, with the oldest-to-youngest ordering within each granularity?\n\nIf so, coolness :)","commit_id":"546cb38bb3289ae8d1ee73633273684ea5e4928c"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"5910161c32759163ff6799833e44aa9072bb8535","unresolved":false,"context_lines":[{"line_number":412,"context_line":"        # FIXME(sileht): so should we bailout is case of stddev and median ?"},{"line_number":413,"context_line":"        agg_timeserie \u003d getattr(grouped, aggregation)()"},{"line_number":414,"context_line":"        points \u003d (agg_timeserie.dropna().reset_index()"},{"line_number":415,"context_line":"                  .sort([\u0027granularity\u0027, \u0027timestamp\u0027], ascending\u003d[0, 1])"},{"line_number":416,"context_line":"                  .itertuples())"},{"line_number":417,"context_line":"        points \u003d [(timestamp, granularity, value)"},{"line_number":418,"context_line":"                  for __, timestamp, granularity, value in points]"}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_572ae22c","line":415,"in_reply_to":"3a961159_70b61dde","updated":"2014-12-18 07:12:17.000000000","message":"Yes, like fetch does.","commit_id":"546cb38bb3289ae8d1ee73633273684ea5e4928c"}],"gnocchi/rest/__init__.py":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"78dfe1f9a08099f992fb5f5a20903d920a2fa420","unresolved":false,"context_lines":[{"line_number":32,"context_line":"from gnocchi import indexer"},{"line_number":33,"context_line":"from gnocchi import storage"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"LOGICAL_AND \u003d \u0027∧\u0027"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"def get_user_and_project():"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_65661053","line":35,"updated":"2014-10-15 19:51:44.000000000","message":"Class attribute?","commit_id":"d1a1b0cf63fe966173ac3d7fcfaa744870f4e8f3"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"ae7dac4da813cac1ea502d9e8af8b6c2e2096dbb","unresolved":false,"context_lines":[{"line_number":32,"context_line":"from gnocchi import indexer"},{"line_number":33,"context_line":"from gnocchi import storage"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"LOGICAL_AND \u003d \u0027∧\u0027"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"def get_user_and_project():"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_2b69248c","line":35,"in_reply_to":"baa201ad_65661053","updated":"2014-10-17 09:21:10.000000000","message":"I hope I will remove that once the webob bug is fixed.\nAnd I prefer use the shorter rest.LOGICAL_AND rather the longer path with the class.","commit_id":"d1a1b0cf63fe966173ac3d7fcfaa744870f4e8f3"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"78dfe1f9a08099f992fb5f5a20903d920a2fa420","unresolved":false,"context_lines":[{"line_number":286,"context_line":"        # the filters into the query)"},{"line_number":287,"context_line":"        try:"},{"line_number":288,"context_line":"            ctrl \u003d getattr(ResourcesController, self.resource_type)"},{"line_number":289,"context_line":"            subctrl \u003d getattr(ctrl, \u0027_resource_rest_class\u0027)"},{"line_number":290,"context_line":"            schema \u003d subctrl.ResourcePatch"},{"line_number":291,"context_line":"        except AttributeError:"},{"line_number":292,"context_line":"            pecan.abort(404)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_4283c255","line":289,"updated":"2014-10-15 19:51:44.000000000","message":"No need for getattr() I guess ;)","commit_id":"d1a1b0cf63fe966173ac3d7fcfaa744870f4e8f3"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"ae7dac4da813cac1ea502d9e8af8b6c2e2096dbb","unresolved":false,"context_lines":[{"line_number":286,"context_line":"        # the filters into the query)"},{"line_number":287,"context_line":"        try:"},{"line_number":288,"context_line":"            ctrl \u003d getattr(ResourcesController, self.resource_type)"},{"line_number":289,"context_line":"            subctrl \u003d getattr(ctrl, \u0027_resource_rest_class\u0027)"},{"line_number":290,"context_line":"            schema \u003d subctrl.ResourcePatch"},{"line_number":291,"context_line":"        except AttributeError:"},{"line_number":292,"context_line":"            pecan.abort(404)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_0bcf0057","line":289,"in_reply_to":"baa201ad_4283c255","updated":"2014-10-17 09:21:10.000000000","message":"Done","commit_id":"d1a1b0cf63fe966173ac3d7fcfaa744870f4e8f3"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"78dfe1f9a08099f992fb5f5a20903d920a2fa420","unresolved":false,"context_lines":[{"line_number":292,"context_line":"            pecan.abort(404)"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"        # TODO(sileht): Implements more filters not just ∧"},{"line_number":295,"context_line":"        query \u003d dict([six.text_type(q).split(\u0027\u003d\u0027, 1)"},{"line_number":296,"context_line":"                      for q in query.split(LOGICAL_AND)])"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_65953032","line":295,"updated":"2014-10-15 19:51:44.000000000","message":"That seems very fragile and can raise ValueError easily is the string is wrongly formatted.","commit_id":"d1a1b0cf63fe966173ac3d7fcfaa744870f4e8f3"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"7f9166cbf3fa45f1709441f13789ac3efc389c27","unresolved":false,"context_lines":[{"line_number":215,"context_line":"                        for k, v in six.iteritems("},{"line_number":216,"context_line":"                            pecan.request.storage.get_cross_entity_measures("},{"line_number":217,"context_line":"                                self.entity_ids, start, stop, aggregation)))"},{"line_number":218,"context_line":"        except carbonara.UnAggregableTimeseries as e:"},{"line_number":219,"context_line":"            pecan.abort(400, \"One of the entity to aggregated doesn\u0027t have \""},{"line_number":220,"context_line":"                        \"the archive policies\")"},{"line_number":221,"context_line":"        except storage.EntityDoesNotExist as e:"}],"source_content_type":"text/x-python","patch_set":8,"id":"9aa7fdbe_2789b326","line":218,"updated":"2014-10-22 10:09:56.000000000","message":"There\u0027s a layer leak here: carbonara is used internally by some drivers but maybe not by some not, so this error should be wrapped by the storage driver.\n\n(now I realize we have this issue for NoDeloreanAvailable, I\u0027ll fix it at some point)","commit_id":"667e40e34abcba54aeff9031056d932bb31d78ed"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"b0ba3a02bbb9129e0c9ac874a7939fb40fc3bab2","unresolved":false,"context_lines":[{"line_number":215,"context_line":"                        for k, v in six.iteritems("},{"line_number":216,"context_line":"                            pecan.request.storage.get_cross_entity_measures("},{"line_number":217,"context_line":"                                self.entity_ids, start, stop, aggregation)))"},{"line_number":218,"context_line":"        except carbonara.UnAggregableTimeseries as e:"},{"line_number":219,"context_line":"            pecan.abort(400, \"One of the entity to aggregated doesn\u0027t have \""},{"line_number":220,"context_line":"                        \"the archive policies\")"},{"line_number":221,"context_line":"        except storage.EntityDoesNotExist as e:"}],"source_content_type":"text/x-python","patch_set":8,"id":"9aa7fdbe_43776b3a","line":218,"in_reply_to":"9aa7fdbe_2789b326","updated":"2014-12-04 12:22:24.000000000","message":"Fixed.","commit_id":"667e40e34abcba54aeff9031056d932bb31d78ed"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"6a68d93d97224badf2368a8d6c27311b752b45ec","unresolved":false,"context_lines":[{"line_number":216,"context_line":"                            pecan.request.storage.get_cross_entity_measures("},{"line_number":217,"context_line":"                                self.entity_ids, start, stop, aggregation)))"},{"line_number":218,"context_line":"        except carbonara.UnAggregableTimeseries as e:"},{"line_number":219,"context_line":"            pecan.abort(400, \"One of the entity to aggregated doesn\u0027t have \""},{"line_number":220,"context_line":"                        \"the archive policies\")"},{"line_number":221,"context_line":"        except storage.EntityDoesNotExist as e:"},{"line_number":222,"context_line":"            pecan.abort(404, str(e))"}],"source_content_type":"text/x-python","patch_set":8,"id":"9aa7fdbe_5b085491","line":219,"updated":"2014-10-22 09:22:11.000000000","message":"Nitpick, maybe clearer as:\n\n  s/One of the entity to aggregated doesn\u0027t have the archive policies/\n    One of the entities to be aggregated doesn\u0027t have matching granularity/","commit_id":"667e40e34abcba54aeff9031056d932bb31d78ed"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"7f9166cbf3fa45f1709441f13789ac3efc389c27","unresolved":false,"context_lines":[{"line_number":216,"context_line":"                            pecan.request.storage.get_cross_entity_measures("},{"line_number":217,"context_line":"                                self.entity_ids, start, stop, aggregation)))"},{"line_number":218,"context_line":"        except carbonara.UnAggregableTimeseries as e:"},{"line_number":219,"context_line":"            pecan.abort(400, \"One of the entity to aggregated doesn\u0027t have \""},{"line_number":220,"context_line":"                        \"the archive policies\")"},{"line_number":221,"context_line":"        except storage.EntityDoesNotExist as e:"},{"line_number":222,"context_line":"            pecan.abort(404, str(e))"}],"source_content_type":"text/x-python","patch_set":8,"id":"9aa7fdbe_07c02f29","line":219,"in_reply_to":"9aa7fdbe_5b085491","updated":"2014-10-22 10:09:56.000000000","message":"Also I wonder if it wouldn\u0027t be better to check directly if the archive policies match using the indexer rather than relying on the storage driver to make it work.\n\nWDYT?","commit_id":"667e40e34abcba54aeff9031056d932bb31d78ed"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"6a68d93d97224badf2368a8d6c27311b752b45ec","unresolved":false,"context_lines":[{"line_number":385,"context_line":"            except ValueError:"},{"line_number":386,"context_line":"                pecan.abort(400, \"Invalid input: %s\" % query)"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"            fragment \u003d fragment.split(\u0027\u003d\u0027, 1)"},{"line_number":389,"context_line":"            if len(fragment) !\u003d 2:"},{"line_number":390,"context_line":"                pecan.abort(400, \"Invalid input: %s\" % query)"},{"line_number":391,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9aa7fdbe_56090bdc","line":388,"updated":"2014-10-22 09:22:11.000000000","message":"Nitpick: following your pattern of using LOGICAL_AND above, how about spliting on a similar EQUALITY constant here for readablity?","commit_id":"667e40e34abcba54aeff9031056d932bb31d78ed"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"6a68d93d97224badf2368a8d6c27311b752b45ec","unresolved":false,"context_lines":[{"line_number":400,"context_line":"            ctrl \u003d getattr(ResourcesController, self.resource_type)"},{"line_number":401,"context_line":"            schema \u003d ctrl._resource_rest_class.ResourcePatch"},{"line_number":402,"context_line":"        except AttributeError:"},{"line_number":403,"context_line":"            pecan.abort(404)"},{"line_number":404,"context_line":""},{"line_number":405,"context_line":"        try:"},{"line_number":406,"context_line":"            filters \u003d schema(parsed_query)"}],"source_content_type":"text/x-python","patch_set":8,"id":"9aa7fdbe_d677bb39","line":403,"updated":"2014-10-22 09:22:11.000000000","message":"Nitpick: message for the abort for clarity, e.g.\n\n  \u0027unsupported resource type %s\u0027 % self.resource_type","commit_id":"667e40e34abcba54aeff9031056d932bb31d78ed"}],"gnocchi/storage/__init__.py":[{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"543db97c99270338e6105fc180dc3ddfddb7be32","unresolved":false,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    @staticmethod"},{"line_number":135,"context_line":"    def get_aggregated_measures(entities, from_timestamp\u003dNone,"},{"line_number":136,"context_line":"                                to_timestamp\u003dNone, aggregation\u003d\u0027average\u0027):"},{"line_number":137,"context_line":"        \"\"\"Get aggregated measures of entities."},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        :param entities: The entities measured to aggregate."}],"source_content_type":"text/x-python","patch_set":3,"id":"baa201ad_8a6423e6","line":136,"updated":"2014-10-02 13:26:53.000000000","message":"The function naming could be clearer here, as the measures returned from get_measures are generally aggregated also, but just aggregated from a single timeserie instead of across multiple timeseries.\n\nHow about:\n\n  get_cross_entity_measures","commit_id":"50c52cf9224b2218e0be37a541e628da4461cda0"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"2480244c77afe0834e4b40e72749b07865912f61","unresolved":false,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    @staticmethod"},{"line_number":135,"context_line":"    def get_aggregated_measures(entities, from_timestamp\u003dNone,"},{"line_number":136,"context_line":"                                to_timestamp\u003dNone, aggregation\u003d\u0027average\u0027):"},{"line_number":137,"context_line":"        \"\"\"Get aggregated measures of entities."},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        :param entities: The entities measured to aggregate."}],"source_content_type":"text/x-python","patch_set":3,"id":"baa201ad_63136f0d","line":136,"in_reply_to":"baa201ad_8a6423e6","updated":"2014-10-07 08:02:31.000000000","message":"Done","commit_id":"50c52cf9224b2218e0be37a541e628da4461cda0"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"e66680b828bb0a6807663f2abccf33024bae1da6","unresolved":false,"context_lines":[{"line_number":143,"context_line":"    @staticmethod"},{"line_number":144,"context_line":"    def get_cross_metric_measures(metrics, from_timestamp\u003dNone,"},{"line_number":145,"context_line":"                                  to_timestamp\u003dNone, aggregation\u003d\u0027mean\u0027):"},{"line_number":146,"context_line":"        \"\"\"Get aggregated measures of multiple entities."},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        :param entities: The entities measured to aggregate."},{"line_number":149,"context_line":"        :param from timestamp: The timestamp to get the measure from."}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_7a88be22","line":146,"updated":"2014-12-17 16:49:01.000000000","message":"Non-blocking nitpick: s/entities/metrics/","commit_id":"546cb38bb3289ae8d1ee73633273684ea5e4928c"}],"gnocchi/storage/file.py":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"4b5cc0fd2c109826cd0aa896b553d35c50ebbc74","unresolved":false,"context_lines":[{"line_number":105,"context_line":"            raise"},{"line_number":106,"context_line":"        return carbonara.TimeSerieArchive.unserialize(contents)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    def get_measures(self, entity, from_timestamp\u003dNone, to_timestamp\u003dNone,"},{"line_number":109,"context_line":"                     aggregation\u003d\u0027mean\u0027):"},{"line_number":110,"context_line":"        tsc \u003d self._get_time_serie_archive(entity, aggregation)"},{"line_number":111,"context_line":"        return dict(tsc.fetch(from_timestamp, to_timestamp))"}],"source_content_type":"text/x-python","patch_set":3,"id":"baa201ad_7e8a5dc0","line":108,"updated":"2014-10-02 14:35:39.000000000","message":"We should factorize this between file and swift, it\u0027s ok not to do it right now but if you could add a FIXME so we think about doing it later :)","commit_id":"50c52cf9224b2218e0be37a541e628da4461cda0"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"2480244c77afe0834e4b40e72749b07865912f61","unresolved":false,"context_lines":[{"line_number":105,"context_line":"            raise"},{"line_number":106,"context_line":"        return carbonara.TimeSerieArchive.unserialize(contents)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    def get_measures(self, entity, from_timestamp\u003dNone, to_timestamp\u003dNone,"},{"line_number":109,"context_line":"                     aggregation\u003d\u0027mean\u0027):"},{"line_number":110,"context_line":"        tsc \u003d self._get_time_serie_archive(entity, aggregation)"},{"line_number":111,"context_line":"        return dict(tsc.fetch(from_timestamp, to_timestamp))"}],"source_content_type":"text/x-python","patch_set":3,"id":"baa201ad_e3ecbff5","line":108,"in_reply_to":"baa201ad_7e8a5dc0","updated":"2014-10-07 08:02:31.000000000","message":"Done","commit_id":"50c52cf9224b2218e0be37a541e628da4461cda0"}],"gnocchi/storage/swift.py":[{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"6a68d93d97224badf2368a8d6c27311b752b45ec","unresolved":false,"context_lines":[{"line_number":140,"context_line":"                                  to_timestamp\u003dNone, aggregation\u003d\u0027mean\u0027):"},{"line_number":141,"context_line":"        tss \u003d [self._get_time_serie_archive(entity, aggregation)"},{"line_number":142,"context_line":"               for entity in entities]"},{"line_number":143,"context_line":"        tsc \u003d carbonara.TimeSerieArchive.aggregated(tss, aggregation)"},{"line_number":144,"context_line":"        return dict(tsc.fetch(from_timestamp, to_timestamp))"}],"source_content_type":"text/x-python","patch_set":8,"id":"9aa7fdbe_56990b1e","line":143,"updated":"2014-10-22 09:22:11.000000000","message":"It seems wasteful to do the cross-entity aggregation across the entire timeseries, and only then to fetch out the timerange requested.\n\ne.g. the retention for an archive policy might be one year, but the query timerange might just be a single day.\n\nWould it make more sense to reverse this ordering? i.e. pass in the from and to timestamps to  TimeSerieArchive.aggregated and then only aggregate across the time-span actually needed?","commit_id":"667e40e34abcba54aeff9031056d932bb31d78ed"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"7f9166cbf3fa45f1709441f13789ac3efc389c27","unresolved":false,"context_lines":[{"line_number":140,"context_line":"                                  to_timestamp\u003dNone, aggregation\u003d\u0027mean\u0027):"},{"line_number":141,"context_line":"        tss \u003d [self._get_time_serie_archive(entity, aggregation)"},{"line_number":142,"context_line":"               for entity in entities]"},{"line_number":143,"context_line":"        tsc \u003d carbonara.TimeSerieArchive.aggregated(tss, aggregation)"},{"line_number":144,"context_line":"        return dict(tsc.fetch(from_timestamp, to_timestamp))"}],"source_content_type":"text/x-python","patch_set":8,"id":"9aa7fdbe_67365b54","line":143,"in_reply_to":"9aa7fdbe_56990b1e","updated":"2014-10-22 10:09:56.000000000","message":"I think it\u0027s a good idea, but I\u0027d be ok to have it in a later patch has it is an optimization.\n\nAt least add a TODO if you don\u0027t do it in this patch.","commit_id":"667e40e34abcba54aeff9031056d932bb31d78ed"}],"gnocchi/tests/test_carbonara.py":[{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"543db97c99270338e6105fc180dc3ddfddb7be32","unresolved":false,"context_lines":[{"line_number":386,"context_line":"        #  self.assertEqual(7, r[datetime.datetime(2014, 1, 1, 12, 2, 0)])"},{"line_number":387,"context_line":"        # But it\u0027s not because the we aggregate the already aggregated values"},{"line_number":388,"context_line":"        # so when you ask to get the means of two entities, that do"},{"line_number":389,"context_line":"        # the mean of aggregated means of those entities"}],"source_content_type":"text/x-python","patch_set":3,"id":"baa201ad_ad5661d0","line":389,"updated":"2014-10-02 13:26:53.000000000","message":"I\u0027m confused on that point, as it doesn\u0027t look like there\u0027s any difference in outcome for these data, whether we\u0027re calculating the mean-of-means or the mean-of-raw-data.\n\ne.g. for the 12:01:00-12:01:59 span:\n tcs1: [4, 7] \u003d\u003e mean \u003d 5.5\n tcs2: [6, 1] \u003d\u003e mean \u003d 3.5\n mean-of-means \u003d (5.5+3.5)/2 \u003d 4.5\n mean-of-raw-data \u003d (4+7+6+1)/4 \u003d 4.5\n\nSimilarly for the 12:02:00-12:02:59 span:\n tcs1: [15, 1] \u003d\u003e mean \u003d 8\n tcs2: [3, 11] \u003d\u003e mean \u003d 7\n mean-of-means \u003d (8+7)/2 \u003d 7.5\n mean-of-raw-data \u003d (15+1+3+11)/4 \u003d 7.5\n\nSo in order for there to be a difference between the mean-of-means and the mean-of-raw-data, would there have to a different number of datapoints in a certain time span across the two timeseries?","commit_id":"50c52cf9224b2218e0be37a541e628da4461cda0"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"4b5cc0fd2c109826cd0aa896b553d35c50ebbc74","unresolved":false,"context_lines":[{"line_number":386,"context_line":"        #  self.assertEqual(7, r[datetime.datetime(2014, 1, 1, 12, 2, 0)])"},{"line_number":387,"context_line":"        # But it\u0027s not because the we aggregate the already aggregated values"},{"line_number":388,"context_line":"        # so when you ask to get the means of two entities, that do"},{"line_number":389,"context_line":"        # the mean of aggregated means of those entities"}],"source_content_type":"text/x-python","patch_set":3,"id":"baa201ad_be304502","line":389,"in_reply_to":"baa201ad_ad5661d0","updated":"2014-10-02 14:35:39.000000000","message":"Yeah I agree with Eoghan, I don\u0027t think we can see a difference (except maybe some rounding) with mean-of-mean or mean-of-raw-data here.","commit_id":"50c52cf9224b2218e0be37a541e628da4461cda0"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"2480244c77afe0834e4b40e72749b07865912f61","unresolved":false,"context_lines":[{"line_number":386,"context_line":"        #  self.assertEqual(7, r[datetime.datetime(2014, 1, 1, 12, 2, 0)])"},{"line_number":387,"context_line":"        # But it\u0027s not because the we aggregate the already aggregated values"},{"line_number":388,"context_line":"        # so when you ask to get the means of two entities, that do"},{"line_number":389,"context_line":"        # the mean of aggregated means of those entities"}],"source_content_type":"text/x-python","patch_set":3,"id":"baa201ad_a3f7178a","line":389,"in_reply_to":"baa201ad_be304502","updated":"2014-10-07 08:02:31.000000000","message":"Yes, this comments in completly wrong...","commit_id":"50c52cf9224b2218e0be37a541e628da4461cda0"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"6a68d93d97224badf2368a8d6c27311b752b45ec","unresolved":false,"context_lines":[{"line_number":370,"context_line":"                        (datetime.datetime(2014, 1, 1, 12, 1, 4), 6),"},{"line_number":371,"context_line":"                        (datetime.datetime(2014, 1, 1, 12, 1, 9), 1),"},{"line_number":372,"context_line":"                        (datetime.datetime(2014, 1, 1, 12, 2, 1), 3),"},{"line_number":373,"context_line":"                        (datetime.datetime(2014, 1, 1, 12, 2, 12), 11)])"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"        tsc \u003d carbonara.TimeSerieArchive.aggregated([tsc1, tsc2])"},{"line_number":376,"context_line":"        r \u003d tsc.fetch(datetime.datetime(2014, 1, 1, 12, 0, 0))"}],"source_content_type":"text/x-python","patch_set":8,"id":"9aa7fdbe_31ead10f","line":373,"updated":"2014-10-22 09:22:11.000000000","message":"It would be good to break the symmetry in this test, e.g. in tsc2 have 3 datapoints in the minute starting from 2014-01-01T12:02:00 while only having one such point in tsc1.","commit_id":"667e40e34abcba54aeff9031056d932bb31d78ed"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"b0ba3a02bbb9129e0c9ac874a7939fb40fc3bab2","unresolved":false,"context_lines":[{"line_number":370,"context_line":"                        (datetime.datetime(2014, 1, 1, 12, 1, 4), 6),"},{"line_number":371,"context_line":"                        (datetime.datetime(2014, 1, 1, 12, 1, 9), 1),"},{"line_number":372,"context_line":"                        (datetime.datetime(2014, 1, 1, 12, 2, 1), 3),"},{"line_number":373,"context_line":"                        (datetime.datetime(2014, 1, 1, 12, 2, 12), 11)])"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"        tsc \u003d carbonara.TimeSerieArchive.aggregated([tsc1, tsc2])"},{"line_number":376,"context_line":"        r \u003d tsc.fetch(datetime.datetime(2014, 1, 1, 12, 0, 0))"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a8c0949_2b2c6e4a","line":373,"in_reply_to":"9aa7fdbe_31ead10f","updated":"2014-12-04 12:22:24.000000000","message":"The next test \u0027test_aggregated_different_datapoints\u0027 does it","commit_id":"667e40e34abcba54aeff9031056d932bb31d78ed"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"6a68d93d97224badf2368a8d6c27311b752b45ec","unresolved":false,"context_lines":[{"line_number":375,"context_line":"        tsc \u003d carbonara.TimeSerieArchive.aggregated([tsc1, tsc2])"},{"line_number":376,"context_line":"        r \u003d tsc.fetch(datetime.datetime(2014, 1, 1, 12, 0, 0))"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"        self.assertEqual(4, r[datetime.datetime(2014, 1, 1, 12, 0, 0)])"},{"line_number":379,"context_line":"        self.assertEqual(4.5, r[datetime.datetime(2014, 1, 1, 12, 1, 0)])"},{"line_number":380,"context_line":"        self.assertEqual(7.5, r[datetime.datetime(2014, 1, 1, 12, 2, 0)])"},{"line_number":381,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9aa7fdbe_91729dab","line":378,"updated":"2014-10-22 09:22:11.000000000","message":"I\u0027m a bit confused by this assertion, as the entity has both 1min and 5min archives.\n\nSo what\u0027s happened to the 5min average for the 5min period starting at 2014-01-01T12:00:00?\n\nHas it been overwritten in the dict returned from the fetch, by the same key being used for the 1min period starting at 2014-01-01T12:00:00?\n\nThat would seem to indicate a flaw in the overall strategy of returning a dict keyed on timestamp but containing mixed granularities (orthogonal to this patch, but worth considering overall I think).","commit_id":"667e40e34abcba54aeff9031056d932bb31d78ed"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"b0ba3a02bbb9129e0c9ac874a7939fb40fc3bab2","unresolved":false,"context_lines":[{"line_number":375,"context_line":"        tsc \u003d carbonara.TimeSerieArchive.aggregated([tsc1, tsc2])"},{"line_number":376,"context_line":"        r \u003d tsc.fetch(datetime.datetime(2014, 1, 1, 12, 0, 0))"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"        self.assertEqual(4, r[datetime.datetime(2014, 1, 1, 12, 0, 0)])"},{"line_number":379,"context_line":"        self.assertEqual(4.5, r[datetime.datetime(2014, 1, 1, 12, 1, 0)])"},{"line_number":380,"context_line":"        self.assertEqual(7.5, r[datetime.datetime(2014, 1, 1, 12, 2, 0)])"},{"line_number":381,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_6dddd1dc","line":378,"in_reply_to":"9aa7fdbe_87717fe2","updated":"2014-12-04 12:22:24.000000000","message":"This just return the same format as fetch, and now fetch doesn\u0027t mixes granularities anymore :)","commit_id":"667e40e34abcba54aeff9031056d932bb31d78ed"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"7f9166cbf3fa45f1709441f13789ac3efc389c27","unresolved":false,"context_lines":[{"line_number":375,"context_line":"        tsc \u003d carbonara.TimeSerieArchive.aggregated([tsc1, tsc2])"},{"line_number":376,"context_line":"        r \u003d tsc.fetch(datetime.datetime(2014, 1, 1, 12, 0, 0))"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"        self.assertEqual(4, r[datetime.datetime(2014, 1, 1, 12, 0, 0)])"},{"line_number":379,"context_line":"        self.assertEqual(4.5, r[datetime.datetime(2014, 1, 1, 12, 1, 0)])"},{"line_number":380,"context_line":"        self.assertEqual(7.5, r[datetime.datetime(2014, 1, 1, 12, 2, 0)])"},{"line_number":381,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9aa7fdbe_87717fe2","line":378,"in_reply_to":"9aa7fdbe_91729dab","updated":"2014-10-22 10:09:56.000000000","message":"I *think* it\u0027s a flaw you already pointed in fetch() while it does aggregation of the different timeseries inside an archive and that it does not a problem in this patch. You can probably give it a look in another test already there.","commit_id":"667e40e34abcba54aeff9031056d932bb31d78ed"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"6a68d93d97224badf2368a8d6c27311b752b45ec","unresolved":false,"context_lines":[{"line_number":419,"context_line":"            [(pandas.tseries.offsets.Minute(1), 50),"},{"line_number":420,"context_line":"             (pandas.tseries.offsets.Minute(2), 24)])"},{"line_number":421,"context_line":"        tsc2 \u003d carbonara.TimeSerieArchive.from_definitions("},{"line_number":422,"context_line":"            [(pandas.tseries.offsets.Minute(1), 50)])"},{"line_number":423,"context_line":""},{"line_number":424,"context_line":"        self.assertRaises(carbonara.UnAggregableTimeseries,"},{"line_number":425,"context_line":"                          carbonara.TimeSerieArchive.aggregated,"}],"source_content_type":"text/x-python","patch_set":8,"id":"9aa7fdbe_7159b9fd","line":422,"updated":"2014-10-22 09:22:11.000000000","message":"If we were to stop mixing granularities in the returned timeseries, and instead require that a single granularity is chosen for the query, we could allow such mismatches where the number of archive was different but the individual archive for the requested granularity did match across the entities.","commit_id":"667e40e34abcba54aeff9031056d932bb31d78ed"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"b0ba3a02bbb9129e0c9ac874a7939fb40fc3bab2","unresolved":false,"context_lines":[{"line_number":419,"context_line":"            [(pandas.tseries.offsets.Minute(1), 50),"},{"line_number":420,"context_line":"             (pandas.tseries.offsets.Minute(2), 24)])"},{"line_number":421,"context_line":"        tsc2 \u003d carbonara.TimeSerieArchive.from_definitions("},{"line_number":422,"context_line":"            [(pandas.tseries.offsets.Minute(1), 50)])"},{"line_number":423,"context_line":""},{"line_number":424,"context_line":"        self.assertRaises(carbonara.UnAggregableTimeseries,"},{"line_number":425,"context_line":"                          carbonara.TimeSerieArchive.aggregated,"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_6df4f154","line":422,"in_reply_to":"9aa7fdbe_7159b9fd","updated":"2014-12-04 12:22:24.000000000","message":"Yes, I have added a TODO in carbonara.py, to allow that in the futur.","commit_id":"667e40e34abcba54aeff9031056d932bb31d78ed"}],"gnocchi/tests/test_rest.py":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"78dfe1f9a08099f992fb5f5a20903d920a2fa420","unresolved":false,"context_lines":[{"line_number":944,"context_line":"            LOGICAL_AND \u003d \u0027+\u0027"},{"line_number":945,"context_line":"            rest.LOGICAL_AND \u003d \u0027+\u0027"},{"line_number":946,"context_line":"        else:"},{"line_number":947,"context_line":"            LOGICAL_AND \u003d rest.LOGICAL_AND"},{"line_number":948,"context_line":""},{"line_number":949,"context_line":"        result \u003d self.app.post_json(\"/v1/entity\","},{"line_number":950,"context_line":"                                    params\u003d{\"archive_policy\": \"medium\"})"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_c5897ccb","line":947,"updated":"2014-10-15 19:51:44.000000000","message":"You can simplify this: )\n\nif six.PY3:\n  rest.LOGICAL_AND \u003d \u0027+\u0027\nLOGICAL_AND \u003d rest.LOGICAL_AND","commit_id":"d1a1b0cf63fe966173ac3d7fcfaa744870f4e8f3"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"ae7dac4da813cac1ea502d9e8af8b6c2e2096dbb","unresolved":false,"context_lines":[{"line_number":944,"context_line":"            LOGICAL_AND \u003d \u0027+\u0027"},{"line_number":945,"context_line":"            rest.LOGICAL_AND \u003d \u0027+\u0027"},{"line_number":946,"context_line":"        else:"},{"line_number":947,"context_line":"            LOGICAL_AND \u003d rest.LOGICAL_AND"},{"line_number":948,"context_line":""},{"line_number":949,"context_line":"        result \u003d self.app.post_json(\"/v1/entity\","},{"line_number":950,"context_line":"                                    params\u003d{\"archive_policy\": \"medium\"})"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_ab3ef488","line":947,"in_reply_to":"baa201ad_c5897ccb","updated":"2014-10-17 09:21:10.000000000","message":"Done","commit_id":"d1a1b0cf63fe966173ac3d7fcfaa744870f4e8f3"}],"gnocchi/tests/test_storage.py":[{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"543db97c99270338e6105fc180dc3ddfddb7be32","unresolved":false,"context_lines":[{"line_number":108,"context_line":"            storage.Measure(datetime.datetime(2014, 1, 1, 12, 7, 41), 2),"},{"line_number":109,"context_line":"            storage.Measure(datetime.datetime(2014, 1, 1, 12, 10, 31), 4),"},{"line_number":110,"context_line":"            storage.Measure(datetime.datetime(2014, 1, 1, 12, 13, 10), 4),"},{"line_number":111,"context_line":"        ])"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        values \u003d self.storage.get_aggregated_measures([\u0027foo\u0027, \u0027bar\u0027])"},{"line_number":114,"context_line":"        self.assertEqual(4, len(values))"}],"source_content_type":"text/x-python","patch_set":3,"id":"baa201ad_cd73a513","line":111,"updated":"2014-10-02 13:26:53.000000000","message":"Would it be useful to have a testcase where there were \"holes\" in one series or the other in certain periods (i.e. datapoints for a certain 5 minute span in foo, but not in bar, or vice-versa)","commit_id":"50c52cf9224b2218e0be37a541e628da4461cda0"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"2480244c77afe0834e4b40e72749b07865912f61","unresolved":false,"context_lines":[{"line_number":108,"context_line":"            storage.Measure(datetime.datetime(2014, 1, 1, 12, 7, 41), 2),"},{"line_number":109,"context_line":"            storage.Measure(datetime.datetime(2014, 1, 1, 12, 10, 31), 4),"},{"line_number":110,"context_line":"            storage.Measure(datetime.datetime(2014, 1, 1, 12, 13, 10), 4),"},{"line_number":111,"context_line":"        ])"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        values \u003d self.storage.get_aggregated_measures([\u0027foo\u0027, \u0027bar\u0027])"},{"line_number":114,"context_line":"        self.assertEqual(4, len(values))"}],"source_content_type":"text/x-python","patch_set":3,"id":"baa201ad_d655b050","line":111,"in_reply_to":"baa201ad_cd73a513","updated":"2014-10-07 08:02:31.000000000","message":"Done","commit_id":"50c52cf9224b2218e0be37a541e628da4461cda0"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"6a68d93d97224badf2368a8d6c27311b752b45ec","unresolved":false,"context_lines":[{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        values \u003d self.storage.get_cross_entity_measures([\u0027foo\u0027, \u0027bar\u0027])"},{"line_number":115,"context_line":"        self.assertEqual(4, len(values))"},{"line_number":116,"context_line":"        self.assertEqual(22.25, values[datetime.datetime(2014, 1, 1, 0, 0, 0)])"},{"line_number":117,"context_line":"        self.assertEqual(39, values[datetime.datetime(2014, 1, 1, 12, 0, 0)])"},{"line_number":118,"context_line":"        self.assertEqual(12.5, values[datetime.datetime(2014, 1, 1, 12, 5, 0)])"},{"line_number":119,"context_line":"        self.assertEqual(24, values[datetime.datetime(2014, 1, 1, 12, 10, 0)])"}],"source_content_type":"text/x-python","patch_set":8,"id":"9aa7fdbe_11eeadb4","line":116,"updated":"2014-10-22 09:22:11.000000000","message":"So this is another example of the strangeness we get from mixing granularities in the result dict.\n\ni.e. we have a 1day datapoint for 2014-01-01T00:00:00 of 22.25 in the result, but only because there happened to no raw datapoint in the time-range 00:00:00-00:04:59 on that day - otherwise IIUC, the 1day aggregate would be overwritten in the result dict by the 5min aggregate for the 5min period with the same starting time (hence the same dict key).","commit_id":"667e40e34abcba54aeff9031056d932bb31d78ed"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"b0ba3a02bbb9129e0c9ac874a7939fb40fc3bab2","unresolved":false,"context_lines":[{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        values \u003d self.storage.get_cross_entity_measures([\u0027foo\u0027, \u0027bar\u0027])"},{"line_number":115,"context_line":"        self.assertEqual(4, len(values))"},{"line_number":116,"context_line":"        self.assertEqual(22.25, values[datetime.datetime(2014, 1, 1, 0, 0, 0)])"},{"line_number":117,"context_line":"        self.assertEqual(39, values[datetime.datetime(2014, 1, 1, 12, 0, 0)])"},{"line_number":118,"context_line":"        self.assertEqual(12.5, values[datetime.datetime(2014, 1, 1, 12, 5, 0)])"},{"line_number":119,"context_line":"        self.assertEqual(24, values[datetime.datetime(2014, 1, 1, 12, 10, 0)])"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_6d8b11c0","line":116,"in_reply_to":"9aa7fdbe_11eeadb4","updated":"2014-12-04 12:22:24.000000000","message":"With the new jd__ fetch we don\u0027t have this kind of mix anymore.","commit_id":"667e40e34abcba54aeff9031056d932bb31d78ed"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"6a68d93d97224badf2368a8d6c27311b752b45ec","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        self.assertEqual(4, len(values))"},{"line_number":116,"context_line":"        self.assertEqual(22.25, values[datetime.datetime(2014, 1, 1, 0, 0, 0)])"},{"line_number":117,"context_line":"        self.assertEqual(39, values[datetime.datetime(2014, 1, 1, 12, 0, 0)])"},{"line_number":118,"context_line":"        self.assertEqual(12.5, values[datetime.datetime(2014, 1, 1, 12, 5, 0)])"},{"line_number":119,"context_line":"        self.assertEqual(24, values[datetime.datetime(2014, 1, 1, 12, 10, 0)])"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        values \u003d self.storage.get_cross_entity_measures("}],"source_content_type":"text/x-python","patch_set":8,"id":"9aa7fdbe_2cea780f","line":118,"updated":"2014-10-22 09:22:11.000000000","message":"So this 12.5 is the obviously mean of means: (2+(42+4)/2)/2\n\nIIUC, this is a different value to what classic ceilometer would compute for such a query ... i.e. (2+42+4)/3\n\nThat could be a problem if we\u0027re trying to match behaviours.","commit_id":"667e40e34abcba54aeff9031056d932bb31d78ed"}],"tox.ini":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"4b5cc0fd2c109826cd0aa896b553d35c50ebbc74","unresolved":false,"context_lines":[{"line_number":62,"context_line":"  six.moves.mox"},{"line_number":63,"context_line":"  # If hacking try to load that one we got a"},{"line_number":64,"context_line":"  # \u0027DuplicateOptError: duplicate option: default_log_levels\u0027"},{"line_number":65,"context_line":"  tooz.drivers"}],"source_content_type":"text/x-properties","patch_set":3,"id":"baa201ad_9e08e12e","line":65,"updated":"2014-10-02 14:35:39.000000000","message":"I\u0027m curious, where does that come from in tooz?","commit_id":"50c52cf9224b2218e0be37a541e628da4461cda0"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"2480244c77afe0834e4b40e72749b07865912f61","unresolved":false,"context_lines":[{"line_number":62,"context_line":"  six.moves.mox"},{"line_number":63,"context_line":"  # If hacking try to load that one we got a"},{"line_number":64,"context_line":"  # \u0027DuplicateOptError: duplicate option: default_log_levels\u0027"},{"line_number":65,"context_line":"  tooz.drivers"}],"source_content_type":"text/x-properties","patch_set":3,"id":"baa201ad_cb5a5829","line":65,"in_reply_to":"baa201ad_9e08e12e","updated":"2014-10-07 08:02:31.000000000","message":"Seems not needed anymore, removed.","commit_id":"50c52cf9224b2218e0be37a541e628da4461cda0"}]}
