def stdev(requestContext, seriesList, time): """ Takes one metric or a wildcard seriesList followed by an integer N. Draw the Standard Deviation of all metrics passed for the past N datapoints. Example: .. code-block:: none &target=stddev(server*.instance*.threads.busy,30) """ count = 0 for series in seriesList: stddevs = TimeSeries("stddev(%s,%.1f)" % (series.name, float(time)), series.start, series.end, series.step, []) stddevs.pathExpression = "stddev(%s,%.1f)" % (series.name, float(time)) avg = safeDiv(safeSum(series[:time]), time) if avg is not None: sumOfSquares = sum(map(lambda(x): x * x, [v for v in series[:time] if v is not None])) (sd, sumOfSquares) = doStdDev(sumOfSquares, 0, 0, time, avg) stddevs.append(sd) else: stddevs.append(None) for (index, el) in enumerate(series[time:]): if el is None: continue toDrop = series[index] if toDrop is None: toDrop = 0 s = safeSum([safeMul(time, avg), el, -toDrop]) avg = safeDiv(s, time) if avg is not None: (sd, sumOfSquares) = doStdDev(sumOfSquares, toDrop, series[index+time], time, avg) stddevs.append(sd) else: stddevs.append(None) for i in range(0, time-1): stddevs.insert(0, None) seriesList[count] = stddevs count = count + 1 return seriesList
def movingAverage(requestContext, seriesList, windowSize): """ Takes one metric or a wildcard seriesList followed by a number N of datapoints and graphs the average of N previous datapoints. N-1 datapoints are set to None at the beginning of the graph. .. code-block:: none &target=movingAverage(Server.instance01.threads.busy,10) """ for seriesIndex, series in enumerate(seriesList): newName = "movingAverage(%s,%.1f)" % (series.name, float(windowSize)) newSeries = TimeSeries(newName, series.start, series.end, series.step, []) newSeries.pathExpression = newName windowIndex = windowSize - 1 for i in range( len(series) ): if i < windowIndex: # Pad the beginning with None's since we don't have enough data newSeries.append( None ) else: window = series[i - windowIndex : i + 1] nonNull = [ v for v in window if v is not None ] if nonNull: newSeries.append( sum(nonNull) / len(nonNull) ) else: newSeries.append(None) seriesList[ seriesIndex ] = newSeries return seriesList
def centered_mov_avg(requestContext, seriesList, windowSize): windowInterval = None if isinstance(windowSize, basestring): delta = functions.parseTimeOffset(windowSize) windowInterval = abs(delta.seconds + (delta.days * 86400)) if windowInterval: bootstrapSeconds = windowInterval else: bootstrapSeconds = max([s.step for s in seriesList]) * int(windowSize) bootstrapList = functions._fetchWithBootstrap(requestContext, seriesList, seconds=bootstrapSeconds) result = [] for bootstrap, series in zip(bootstrapList, seriesList): if windowInterval: windowPoints = windowInterval / series.step else: windowPoints = int(windowSize) if isinstance(windowSize, basestring): newName = 'centeredMovingAverage(%s,"%s")' % (series.name, windowSize) else: newName = "centeredMovingAverage(%s,%s)" % (series.name, windowSize) newSeries = TimeSeries(newName, series.start, series.end, series.step, []) newSeries.pathExpression = newName offset = len(bootstrap) - len(series) logging.info("Offset: %s", offset) logging.info("windowPoints: %s", windowPoints) for i in range(len(series)): window = bootstrap[i + offset - windowPoints + windowPoints / 2:i + offset + windowPoints / 2] logging.info("window: %s", len(window)) newSeries.append(functions.safeAvg(window)) result.append(newSeries) return result
def stdev(requestContext, seriesList, time): count = 0 for series in seriesList: stddevs = TimeSeries("stddev(%s,%.1f)" % (series.name, float(time)), series.start, series.end, series.step, []) stddevs.pathExpression = "stddev(%s,%.1f)" % (series.name, float(time)) avg = safeDiv(safeSum(series[:time]), time) if avg is not None: sumOfSquares = sum( map(lambda (x): x * x, [v for v in series[:time] if v is not None])) (sd, sumOfSquares) = doStdDev(sumOfSquares, 0, 0, time, avg) stddevs.append(sd) else: stddevs.append(None) for (index, el) in enumerate(series[time:]): if el is None: continue toDrop = series[index] if toDrop is None: toDrop = 0 s = safeSum([safeMul(time, avg), el, -toDrop]) avg = safeDiv(s, time) if avg is not None: (sd, sumOfSquares) = doStdDev(sumOfSquares, toDrop, series[index + time], time, avg) stddevs.append(sd) else: stddevs.append(None) for i in range(0, time - 1): stddevs.insert(0, None) seriesList[count] = stddevs count = count + 1 return seriesList
def movingAverage(requestContext, seriesList, windowSize): for seriesIndex, series in enumerate(seriesList): newName = "movingAverage(%s,%.1f)" % (series.name, float(windowSize)) newSeries = TimeSeries(newName, series.start, series.end, series.step, []) newSeries.pathExpression = newName windowIndex = windowSize - 1 for i in range(len(series)): if i < windowIndex: # Pad the beginning with None's since we don't have enough data newSeries.append(None) else: window = series[i - windowIndex:i + 1] nonNull = [v for v in window if v is not None] if nonNull: newSeries.append(sum(nonNull) / len(nonNull)) else: newSeries.append(None) seriesList[seriesIndex] = newSeries return seriesList