)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"95168bd709452dd373f23bdcb95f858736624203","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"carbonara: add support for percentile"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The list is based on what OpenTSDB support."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: I4079dae8b426219c03c9f50a0161633af8b13203"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"da86d52c_e0a47f4c","line":9,"updated":"2015-02-05 13:53:44.000000000","message":"Non-blocking nitpick: this reference to what OpenTSDB supports seems like a throwback to an earlier version of the this patchset where a hardcoded set of percentiles (75, 90, 95) were supported.\n\nWhereas now, any percentile in the range (1, 99) can potentially be supported, right?","commit_id":"b7654d0bd23e102739b4db248ad0d1a308acda5c"}],"gnocchi/carbonara.py":[{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"6bcc96e074bb9a51bdbc97b78f7a87043b38a5a1","unresolved":false,"context_lines":[{"line_number":189,"context_line":""},{"line_number":190,"context_line":"def _percentile(a, q):"},{"line_number":191,"context_line":"    if len(a) \u003e 0:"},{"line_number":192,"context_line":"        return numpy.percentile(a, q)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"class AggregatedTimeSerie(TimeSerie):"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa81d914_69964f96","line":192,"updated":"2015-01-28 18:22:16.000000000","message":"Since percentiles can be expensive to compute for larger data sets (unless it\u0027s just estimated), would it make sense to take advantage of the numpy.percentile ability to compute multiple percentiles in one pass?\n\ni.e. for large a, I\u0027d suspect that the single call:\n\n  numpy.percentile(a, q\u003d[75, 90, 95])\n\nwould be more efficient than the series of calls:\n\n  numpy.percentile(a, q\u003d75)\n  numpy.percentile(a, q\u003d90)\n  numpy.percentile(a, q\u003d95)\n\nas no re-sorting would be required.","commit_id":"c9be73c0e351b0e368f4aedd6f4161362c3acffa"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"51804ea4fefc0cde140b095c5d40b651458c9c16","unresolved":false,"context_lines":[{"line_number":189,"context_line":""},{"line_number":190,"context_line":"def _percentile(a, q):"},{"line_number":191,"context_line":"    if len(a) \u003e 0:"},{"line_number":192,"context_line":"        return numpy.percentile(a, q)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"class AggregatedTimeSerie(TimeSerie):"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa81d914_bb3a2acb","line":192,"in_reply_to":"fa81d914_69964f96","updated":"2015-01-29 10:34:00.000000000","message":"Wah, I missed that. That\u0027d be cool, but I don\u0027t think Pandas allows that.\n\nI\u0027m gonna add a TODO with that.","commit_id":"c9be73c0e351b0e368f4aedd6f4161362c3acffa"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"fd542668626dcd17961ee521b9a22c03cc553671","unresolved":false,"context_lines":[{"line_number":256,"context_line":"        \u002775pct\u0027: functools.partial(_percentile, q\u003d75),"},{"line_number":257,"context_line":"        \u002790pct\u0027: functools.partial(_percentile, q\u003d90),"},{"line_number":258,"context_line":"        \u002795pct\u0027: functools.partial(_percentile, q\u003d95),"},{"line_number":259,"context_line":"    }"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"    def _resample(self, after):"},{"line_number":262,"context_line":"        if self.sampling:"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a930d6b_9e73407f","line":259,"updated":"2015-01-26 13:40:35.000000000","message":"Since the 75th, 90th and 95th percentiles are fairly arbitrarily chosen, I wonder should this be config driven instead of being hardcoded, such that some deployments may prefer to calculate say p99 in place of p75?","commit_id":"c9be73c0e351b0e368f4aedd6f4161362c3acffa"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"6bcc96e074bb9a51bdbc97b78f7a87043b38a5a1","unresolved":false,"context_lines":[{"line_number":256,"context_line":"        \u002775pct\u0027: functools.partial(_percentile, q\u003d75),"},{"line_number":257,"context_line":"        \u002790pct\u0027: functools.partial(_percentile, q\u003d90),"},{"line_number":258,"context_line":"        \u002795pct\u0027: functools.partial(_percentile, q\u003d95),"},{"line_number":259,"context_line":"    }"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"    def _resample(self, after):"},{"line_number":262,"context_line":"        if self.sampling:"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa81d914_8e79c931","line":259,"in_reply_to":"1a930d6b_81f685f7","updated":"2015-01-28 18:22:16.000000000","message":"So I was thinking that a \"one size fits all\" approach might be awkward, in the sense that the cost of pre-aggregating some selected percentiles is always incurred, even if these aren\u0027t necessarily the \"right\" percentiles in every case.\n\nWhere I\u0027ve seen p99 being used is to bound a significant group of outliers from a large set of datapoints ... e.g. when measuring API responsiveness, say we get 10k calls every hour, the average response time might look reasonable, but we also want to see a lower bound on the slowest 100 calls (or 1% of the total in general). We might not want to use max in this context, as this single point may be a true aberration. The elasticsearch docco[1] expresses that idea nicely: \"the max is a hypercondriac and easily distorted by a single outlier\".\n\nHere\u0027s a left-field idea ... how about the notion of encoding the percentiles to be pre-aggregated in the ArchivePolicy for a metric? So for one metric, I might be interested in [p75, p90, p95], whereas for another only [p99], and for a third no percentiles at all might be interesting.\n\n[1] http://www.elasticsearch.org/blog/averages-can-dangerous-use-percentile/","commit_id":"c9be73c0e351b0e368f4aedd6f4161362c3acffa"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"e98b5dea65e5c393cd0397e63ef92a2a886af2b9","unresolved":false,"context_lines":[{"line_number":256,"context_line":"        \u002775pct\u0027: functools.partial(_percentile, q\u003d75),"},{"line_number":257,"context_line":"        \u002790pct\u0027: functools.partial(_percentile, q\u003d90),"},{"line_number":258,"context_line":"        \u002795pct\u0027: functools.partial(_percentile, q\u003d95),"},{"line_number":259,"context_line":"    }"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"    def _resample(self, after):"},{"line_number":262,"context_line":"        if self.sampling:"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a930d6b_81f685f7","line":259,"in_reply_to":"1a930d6b_9e73407f","updated":"2015-01-26 13:57:21.000000000","message":"I\u0027ve mimicked what OpenTSDB provide. After some research, it seems that everybody is happy with that. \u002799pct\u0027 makes no sense as it\u0027s very likely equal to \u0027max\u0027. \u002750pct\u0027 is actually median so it exists. These 3 looks like very good default.\n\nI guess if the default provided are not good enough we could add them to Carbonara?","commit_id":"c9be73c0e351b0e368f4aedd6f4161362c3acffa"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"51804ea4fefc0cde140b095c5d40b651458c9c16","unresolved":false,"context_lines":[{"line_number":256,"context_line":"        \u002775pct\u0027: functools.partial(_percentile, q\u003d75),"},{"line_number":257,"context_line":"        \u002790pct\u0027: functools.partial(_percentile, q\u003d90),"},{"line_number":258,"context_line":"        \u002795pct\u0027: functools.partial(_percentile, q\u003d95),"},{"line_number":259,"context_line":"    }"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"    def _resample(self, after):"},{"line_number":262,"context_line":"        if self.sampling:"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa81d914_bb414a3b","line":259,"in_reply_to":"fa81d914_8e79c931","updated":"2015-01-29 10:34:00.000000000","message":"Ok, I\u0027m gonna add a dynamic percentile computing! :)","commit_id":"c9be73c0e351b0e368f4aedd6f4161362c3acffa"}],"gnocchi/tests/test_carbonara.py":[{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"fd542668626dcd17961ee521b9a22c03cc553671","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def test_75_percentile(self):"},{"line_number":82,"context_line":"        ts \u003d carbonara.AggregatedTimeSerie(sampling\u003d\u00271Min\u0027,"},{"line_number":83,"context_line":"                                           aggregation_method\u003d\u002775pct\u0027)"},{"line_number":84,"context_line":"        ts.set_values("},{"line_number":85,"context_line":"            [(datetime.datetime(2014, 1, 1, 12, 0, 0), 3),"},{"line_number":86,"context_line":"             (datetime.datetime(2014, 1, 1, 12, 0, 4), 5),"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a930d6b_1e2e7043","line":83,"updated":"2015-01-26 13:40:35.000000000","message":"Open to correction, but I suspect that \u0027p75\u0027 may be a more widely understood abbreviation that 75pct.","commit_id":"c9be73c0e351b0e368f4aedd6f4161362c3acffa"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"e98b5dea65e5c393cd0397e63ef92a2a886af2b9","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def test_75_percentile(self):"},{"line_number":82,"context_line":"        ts \u003d carbonara.AggregatedTimeSerie(sampling\u003d\u00271Min\u0027,"},{"line_number":83,"context_line":"                                           aggregation_method\u003d\u002775pct\u0027)"},{"line_number":84,"context_line":"        ts.set_values("},{"line_number":85,"context_line":"            [(datetime.datetime(2014, 1, 1, 12, 0, 0), 3),"},{"line_number":86,"context_line":"             (datetime.datetime(2014, 1, 1, 12, 0, 4), 5),"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a930d6b_c1db2d7a","line":83,"in_reply_to":"1a930d6b_1e2e7043","updated":"2015-01-26 13:57:21.000000000","message":"Stolen from OpenTSDB. :)","commit_id":"c9be73c0e351b0e368f4aedd6f4161362c3acffa"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"6bcc96e074bb9a51bdbc97b78f7a87043b38a5a1","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def test_75_percentile(self):"},{"line_number":82,"context_line":"        ts \u003d carbonara.AggregatedTimeSerie(sampling\u003d\u00271Min\u0027,"},{"line_number":83,"context_line":"                                           aggregation_method\u003d\u002775pct\u0027)"},{"line_number":84,"context_line":"        ts.set_values("},{"line_number":85,"context_line":"            [(datetime.datetime(2014, 1, 1, 12, 0, 0), 3),"},{"line_number":86,"context_line":"             (datetime.datetime(2014, 1, 1, 12, 0, 4), 5),"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa81d914_e92cff4c","line":83,"in_reply_to":"1a930d6b_c1db2d7a","updated":"2015-01-28 18:22:16.000000000","message":"Cool enough :)","commit_id":"c9be73c0e351b0e368f4aedd6f4161362c3acffa"}]}
