Skip to content

Commit

Permalink
Merge pull request #2124 from DanCech/seriesByTagPathExpr
Browse files Browse the repository at this point in the history
set pathExpression on seriesByTag results
  • Loading branch information
DanCech committed Nov 23, 2017
2 parents dabbf02 + 7e0dec1 commit 93d3142
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 6 deletions.
20 changes: 15 additions & 5 deletions webapp/graphite/render/functions.py
Original file line number Diff line number Diff line change
Expand Up @@ -158,9 +158,15 @@ def xff(nonNull, total, xFilesFactor=None):

def getNodeOrTag(series, n, pathExpression=None):
try:
return (pathExpression or series.name).split('.')[n]
except (IndexError, TypeError):
return series.tags.get(n, '')
# if n is an integer use it as a node, otherwise catch ValueError and treat it as a tag
if n == int(n):
# first split off any tags, then list of nodes is name split on .
return (pathExpression or series.name).split(';', 2)[0].split('.')[n]
except (ValueError, IndexError):
# if node isn't an integer or isn't found then try it as a tag name
pass
# return tag value, default to '' if not found
return series.tags.get(str(n), '')

def aggKey(series, nodes, pathExpression=None):
return '.'.join([getNodeOrTag(series, n, pathExpression) for n in nodes])
Expand Down Expand Up @@ -1281,7 +1287,7 @@ def absolute(requestContext, seriesList):
&target=absolute(Server.instance*.threads.busy)
"""
for series in seriesList:
series.tags['squareRoot'] = 1
series.tags['absolute'] = 1
series.name = "absolute(%s)" % (series.name)
series.pathExpression = series.name
for i,value in enumerate(series):
Expand Down Expand Up @@ -4284,7 +4290,11 @@ def seriesByTag(requestContext, *tagExpressions):

seriesList = evaluateTarget(requestContext, taggedSeriesQuery, noPrefetch=True)

log.debug('seriesByTag found [%s]' % ', '.join([series.pathExpression for series in seriesList]))
pathExpr = 'seriesByTag(%s)' % ','.join(['"%s"' % expr for expr in tagExpressions])
for series in seriesList:
series.pathExpression = pathExpr

log.debug('seriesByTag found [%s]' % ', '.join([series.name for series in seriesList]))

return seriesList

Expand Down
12 changes: 11 additions & 1 deletion webapp/tests/test_functions.py
Original file line number Diff line number Diff line change
Expand Up @@ -2856,11 +2856,20 @@ def verify_node_name(cases, expected, *nodes):
expected = ["test-db1"] * len(names)
for name in names:
series = TimeSeries(name, 0, 1, 1, [1])
series.pathExpression = series.name
seriesList.append(series)

verify_node_name(seriesList, expected, 1)

series = TimeSeries('collectd.load;host=test-db1;instance=value', 0, 1, 1, [1])
series.pathExpression = 'seriesByTag("name=collectd.load", "host=test-db1")'

verify_node_name([series], ['load'], 1)
verify_node_name([series], ['test-db1'], 'host')
verify_node_name([series], ['test-db1.load'], 'host', 1)
verify_node_name([series], ['test-db1.load.'], 'host', 1, 2)
verify_node_name([series], ['test-db1.load.'], 'host', 1, 'foo')
verify_node_name([series], ['test-db1.'], 'host', '1')

def test_aliasByMetric(self):
seriesList = self._gen_series_list_with_data(
key=[
Expand Down Expand Up @@ -5990,6 +5999,7 @@ def mock_data_fetcher(reqCtx, path_expression):
self.assertEqual(result, [
TimeSeries('disk.bytes_used;server=server1',0,3,1,[10, 20, 30]),
])
self.assertEqual(result[0].pathExpression, query)

query = 'seriesByTag("name=disk.bytes_used","server=server2")'
result = evaluateTarget(request_context, query)
Expand Down

0 comments on commit 93d3142

Please sign in to comment.