Merge lp:~saysjonathan/graphite/rangeseries into lp:~graphite-dev/graphite/main

Proposed by saysjonathan
Status: Merged
Merged at revision: 670
Proposed branch: lp:~saysjonathan/graphite/rangeseries
Merge into: lp:~graphite-dev/graphite/main
Diff against target: 62 lines (+26/-1)
2 files modified
webapp/content/js/composer_widgets.js (+2/-1)
webapp/graphite/render/functions.py (+24/-0)
To merge this branch: bzr merge lp:~saysjonathan/graphite/rangeseries
Reviewer Review Type Date Requested Status
Michael Leinartas Approve
Review via email: mp+92167@code.launchpad.net

Description of the change

[FEATURE] Adds a new Graph Data Function: rangeOfSeries. Distills down a set of inputs into the range of the series, e.g., [0, 1, 2, 3] = 3, and [4, 5, 6] = 2

To post a comment you must log in.
Revision history for this message
Michael Leinartas (mleinartas) wrote :

Looks great, good idea and thanks for the good docstring

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'webapp/content/js/composer_widgets.js'
2--- webapp/content/js/composer_widgets.js 2011-12-05 08:30:48 +0000
3+++ webapp/content/js/composer_widgets.js 2012-02-09 00:23:46 +0000
4@@ -884,7 +884,8 @@
5 {text: 'Average', handler: applyFuncToAll('averageSeries')},
6 {text: 'Min Values', handler: applyFuncToAll('minSeries')},
7 {text: 'Max Values', handler: applyFuncToAll('maxSeries')},
8- {text: 'Group', handler: applyFuncToAll('group')}
9+ {text: 'Group', handler: applyFuncToAll('group')},
10+ {text: 'Range', handler: this.applyFuncToAll('rangeOfSeries')}
11 ]
12 }, {
13 text: 'Transform',
14
15=== modified file 'webapp/graphite/render/functions.py'
16--- webapp/graphite/render/functions.py 2012-02-08 05:40:42 +0000
17+++ webapp/graphite/render/functions.py 2012-02-09 00:23:46 +0000
18@@ -55,6 +55,10 @@
19 if a is None or b is None: return None
20 return float(a) * float(b)
21
22+def safeSubtract(a,b):
23+ if a is None or b is None: return None
24+ return float(a) - float(b)
25+
26 def safeLast(values):
27 for v in reversed(values):
28 if v is not None: return v
29@@ -269,6 +273,25 @@
30 series.pathExpression = name
31 return [series]
32
33+def rangeOfSeries(requestContext, *seriesLists):
34+ """
35+ Takes a wildcard seriesList.
36+ Distills down a set of inputs into the range of the series
37+
38+ Example:
39+
40+ .. code-block:: none
41+
42+ &target=rangeOfSeries(Server*.connections.total)
43+
44+ """
45+ (seriesList,start,end,step) = normalize(seriesLists)
46+ name = "rangeOfSeries(%s)" % ','.join(set([s.pathExpression for s in seriesList]))
47+ values = ( safeSubtract(max(row), min(row)) for row in izip(*seriesList) )
48+ series = TimeSeries(name,start,end,step,values)
49+ series.pathExpression = name
50+ return [series]
51+
52 def keepLastValue(requestContext, seriesList):
53 """
54 Takes one metric or a wildcard seriesList.
55@@ -2060,6 +2083,7 @@
56 'averageSeriesWithWildcards': averageSeriesWithWildcards,
57 'minSeries' : minSeries,
58 'maxSeries' : maxSeries,
59+ 'rangeOfSeries': rangeOfSeries,
60
61 # Transform functions
62 'scale' : scale,