)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"abe9626550f03c21c24e1ef260c6d61b2defab4a","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"  GET /v1/entity/UUID/measures?aggregation\u003dmean\u0026granularity\u003d60"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"If there is no archive of that granularity defined for the entity,"},{"line_number":18,"context_line":"then the storage driver is free to return an empty response, or to"},{"line_number":19,"context_line":"downsample to the requested granularity on-demand (in the case where"},{"line_number":20,"context_line":"the driver has retained sufficient finer-grained data to do so)."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"baada198_93e7d2e2","line":17,"updated":"2014-07-25 11:06:10.000000000","message":"Is there a test for this particular happenstance? How does the requestor distinguish between a response that is empty because there is no archive at any granularity, and a response that is empty because there is no archive at the requested granularity?","commit_id":"5e5db6f282f9005acbe38ee901cd34f0fd9352a3"}],"122461.patch":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"1bdca376916549010f743241cddf57086ee8ca97","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Change-Id: I5a328bc37d59f8a680c5e5adcd31e13600bf6189"},{"line_number":10,"context_line":"---"},{"line_number":11,"context_line":" gnocchi/indexer/sqlalchemy.py |   20 +++++++++++---------"},{"line_number":12,"context_line":" 1 file changed, 11 insertions(+), 9 deletions(-)"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"diff --git a/gnocchi/indexer/sqlalchemy.py b/gnocchi/indexer/sqlalchemy.py"},{"line_number":15,"context_line":"index e630ff1..d33b7af 100644"}],"source_content_type":"text/x-diff","patch_set":17,"id":"baa201ad_93873712","line":12,"updated":"2014-10-10 16:19:53.000000000","message":"?","commit_id":"52729af16f10e5d5d2275a11b2df3c8177f46c15"}],"gnocchi/carbonara.py":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"f206f47a5b752b84f775ed615bf1ec638fc5f369","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        return self.fetch(key)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    @classmethod"},{"line_number":152,"context_line":"    def unserialize(cls, data, granularity\u003dNone):"},{"line_number":153,"context_line":"        return cls([TimeSerie.from_dict(ts)"},{"line_number":154,"context_line":"                    for ts in msgpack.loads(data, encoding\u003d\u0027utf-8\u0027)"},{"line_number":155,"context_line":"                    if (granularity is None or"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_de570e01","line":152,"updated":"2014-07-01 12:37:10.000000000","message":"This more likely should be done at fetch time IMHO.","commit_id":"7b2abf1dde906358e19716bc38f402cc85d2e24c"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"f241e53010c4985cad708e3db441b0465fc9302f","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        return self.fetch(key)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    @classmethod"},{"line_number":152,"context_line":"    def unserialize(cls, data, granularity\u003dNone):"},{"line_number":153,"context_line":"        return cls([TimeSerie.from_dict(ts)"},{"line_number":154,"context_line":"                    for ts in msgpack.loads(data, encoding\u003d\u0027utf-8\u0027)"},{"line_number":155,"context_line":"                    if (granularity is None or"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_613ad3ce","line":152,"in_reply_to":"baada198_de570e01","updated":"2014-07-01 20:41:37.000000000","message":"\"fetch time\" being:\n* (a) the time that the timeseries is fetched from swift, so that unused data is not pulled in unnecessarily?\n\nor:\n\n* (b) the time that the individual timeseries pruned by time-range are extracted from the consolidated blob *already* pulled in from swift?\n\nI\u0027d agree that (a) would be great, but unfortunately doesn\u0027t seem to be possible with the monolithic storage approach followed by the swift driver (i.e. all aggregates are serialized to the same swift object IIUC)","commit_id":"7b2abf1dde906358e19716bc38f402cc85d2e24c"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"f206f47a5b752b84f775ed615bf1ec638fc5f369","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        return cls([TimeSerie.from_dict(ts)"},{"line_number":154,"context_line":"                    for ts in msgpack.loads(data, encoding\u003d\u0027utf-8\u0027)"},{"line_number":155,"context_line":"                    if (granularity is None or"},{"line_number":156,"context_line":"                        ts.get(\u0027sampling\u0027) \u003d\u003d \u0027%sS\u0027 % granularity)])"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_1e418639","line":156,"updated":"2014-07-01 12:37:10.000000000","message":"It can be something else than S in theory on the carbonara side, even if it\u0027s true we always use second from gnocchi.storage.swift. :)","commit_id":"7b2abf1dde906358e19716bc38f402cc85d2e24c"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"f241e53010c4985cad708e3db441b0465fc9302f","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        return cls([TimeSerie.from_dict(ts)"},{"line_number":154,"context_line":"                    for ts in msgpack.loads(data, encoding\u003d\u0027utf-8\u0027)"},{"line_number":155,"context_line":"                    if (granularity is None or"},{"line_number":156,"context_line":"                        ts.get(\u0027sampling\u0027) \u003d\u003d \u0027%sS\u0027 % granularity)])"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_6195733f","line":156,"in_reply_to":"baada198_1e418639","updated":"2014-07-01 20:41:37.000000000","message":"Is carbonara relevant to storage drivers other than swift though, given that it assumes ((IUC) that the metric data is stored in exactly the format that the swift driver stores it?\n\nThe way thinks stand, it seems to be effectively part of the swift driver, given that one can\u0027t really exist without the other, and neither are necessarily required to implement an alternative driver. Unless I\u0027ve missed something there?","commit_id":"7b2abf1dde906358e19716bc38f402cc85d2e24c"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"29426f8d9d1ef9504f17b8e46b84e66c10e74d03","unresolved":false,"context_lines":[{"line_number":304,"context_line":"                   [AggregatedTimeSerie.from_dict(a) for a in d[\u0027archives\u0027]])"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"    @classmethod"},{"line_number":307,"context_line":"    def unserialize(cls, data, granularity\u003dNone):"},{"line_number":308,"context_line":"        ts \u003d msgpack.loads(data, encoding\u003d\u0027utf-8\u0027)"},{"line_number":309,"context_line":"        if granularity is None or ts.get(\u0027sampling\u0027) \u003d\u003d \u0027%sS\u0027 % granularity:"},{"line_number":310,"context_line":"            return cls.from_dict(ts)"}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_8a4e4d6d","line":307,"updated":"2014-07-29 11:40:42.000000000","message":"This does not look like a good approach to me, unserializing should not be conditional.","commit_id":"3c7ff9dae1e1d45f689ea2bd8de7b86585a412ce"}],"gnocchi/rest/__init__.py":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"789ef06021e798ec715583658c26ca90bf176154","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    @pecan.expose(\u0027json\u0027)"},{"line_number":98,"context_line":"    def get_measures(self, start\u003dNone, stop\u003dNone, aggregation\u003d\u0027mean\u0027,"},{"line_number":99,"context_line":"                     granularity\u003dNone):"},{"line_number":100,"context_line":"        if aggregation not in storage.AGGREGATION_TYPES:"},{"line_number":101,"context_line":"            pecan.abort(400, \"Invalid aggregation value %s, must be one of %s\""},{"line_number":102,"context_line":"                        % (aggregation, str(storage.AGGREGATION_TYPES)))"}],"source_content_type":"text/x-python","patch_set":2,"id":"dab895d6_299382a4","line":99,"updated":"2014-06-30 12:35:04.000000000","message":"Is there need to confirm that granularity is a number and return 4xx if not?\n\nIf something other than a number is passed, deeper in the code some kind of exception is likely to happen. Probably better to catch it early?","commit_id":"16b1fdfe3d3c397bf704bd388eb65bb8e3668eb1"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"57ab6aa01a5c9e227e6384948d58474daa338dd9","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    @pecan.expose(\u0027json\u0027)"},{"line_number":98,"context_line":"    def get_measures(self, start\u003dNone, stop\u003dNone, aggregation\u003d\u0027mean\u0027,"},{"line_number":99,"context_line":"                     granularity\u003dNone):"},{"line_number":100,"context_line":"        if aggregation not in storage.AGGREGATION_TYPES:"},{"line_number":101,"context_line":"            pecan.abort(400, \"Invalid aggregation value %s, must be one of %s\""},{"line_number":102,"context_line":"                        % (aggregation, str(storage.AGGREGATION_TYPES)))"}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_4d79b992","line":99,"in_reply_to":"dab895d6_299382a4","updated":"2014-06-30 17:09:46.000000000","message":"As discussed on IRC, doing validation on query parameter types (as opposed to the response entity body) will require changes to the gnocchi.rest.vexpose decorator:\n\n  https://github.com/stackforge/gnocchi/blob/master/gnocchi/rest/__init__.py#L49\n\nSo probably out of scope for this patch, but agreed definitely needed for the start, stop, aggregation \u0026 granularity query params (as a separate patch).","commit_id":"16b1fdfe3d3c397bf704bd388eb65bb8e3668eb1"}],"gnocchi/storage/swift.py":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"29426f8d9d1ef9504f17b8e46b84e66c10e74d03","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                self.swift.put_object(entity, aggregation, tsc.serialize())"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    def get_measures(self, entity, from_timestamp\u003dNone, to_timestamp\u003dNone,"},{"line_number":148,"context_line":"                     aggregation\u003d\u0027mean\u0027, granularity\u003dNone):"},{"line_number":149,"context_line":"        try:"},{"line_number":150,"context_line":"            headers, contents \u003d self.swift.get_object(entity, aggregation)"},{"line_number":151,"context_line":"        except swclient.ClientException as e:"}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_0abddd03","line":148,"updated":"2014-07-29 11:40:42.000000000","message":"This should be used in fetch()","commit_id":"3c7ff9dae1e1d45f689ea2bd8de7b86585a412ce"}]}
