Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix tag handling in nested functions #76

Merged
merged 1 commit into from
Aug 23, 2022

Conversation

carrieedwards
Copy link
Collaborator

This PR fixes an issue in which tags were not being properly set for the results of the outer function when Graphite web functions are nested. Previously, for certain functions, if there is another function is an argument that returns results, the tags that had been assigned to the resulting series are not included in the final result of the query. This is because some functions do not copy over tags. Some examples of such functions include aliasByNode, alias, and aggregateLine.

Example:

aliasByNode(absolute(testMetric),1))

The results of this query should now return the "name" tag and the "absolute" tag, instead of just the "name" tag.

@grafanabot

This comment has been minimized.

@carrieedwards carrieedwards linked an issue Aug 23, 2022 that may be closed by this pull request
@grafanabot

This comment has been minimized.

Copy link

@npazosmendez npazosmendez left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I feel like the problem is inside CopyName, it should set the Tags correctly. Is there anywhere CopyName is used and we don't want to copy the Tags?

Also side note: minimizing the change to CopyName will also make upstream merges easier

@carrieedwards
Copy link
Collaborator Author

I feel like the problem is inside CopyName, it should set the Tags correctly. Is there anywhere CopyName is used and we don't want to copy the Tags?

Also side note: minimizing the change to CopyName will also make upstream merges easier

I am on board with this, I just was trying to figure out if there is any situation were we wouldn't want to copy the tags.

@grafanabot

This comment has been minimized.

Comment on lines 457 to 460
tags := make(map[string]string)
for k, v := range r.Tags {
tags[k] = v
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We would need to add/overwrite the "name" tag after that.

Actually, I think the whole function body could be replaced by this, to delete the duplicate code:

func (r *MetricData) CopyName(name string) *MetricData {
	res := r.CopyLink()
	if name == "" {
		res.Name = name
  		res.Tags["name"] = name
	}
	return res
}

That would also mean we can delete all the r.Tags["name"] = name after calling CopyName.

What do you think?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that sounds like a good plan! I will make that change

@grafanabot

This comment has been minimized.

@grafanabot

This comment has been minimized.

Copy link

@npazosmendez npazosmendez left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

@@ -34,7 +34,6 @@ func (f *aliasByMetric) Do(ctx context.Context, e parser.Expr, from, until int64
part := strings.Split(metric, ".")
name := part[len(part)-1]
ret := a.CopyName(name)
ret.PathExpression = name

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this deletion intended?

@grafanabot

This comment has been minimized.

1 similar comment
@grafanabot
Copy link

Go coverage report:

Click to expand.
File %
github.com/grafana/carbonapi/cmd/carbonapi/http/capability.go 0.0%
github.com/grafana/carbonapi/cmd/carbonapi/http/enrichcontext.go 6.7%
github.com/grafana/carbonapi/cmd/carbonapi/http/find_handlers.go 33.5%
github.com/grafana/carbonapi/cmd/carbonapi/http/functions_handler.go 0.0%
github.com/grafana/carbonapi/cmd/carbonapi/http/helper.go 27.3%
github.com/grafana/carbonapi/cmd/carbonapi/http/info_handlers.go 53.8%
github.com/grafana/carbonapi/cmd/carbonapi/http/init.go 84.6%
github.com/grafana/carbonapi/cmd/carbonapi/http/lbcheck_handler.go 0.0%
github.com/grafana/carbonapi/cmd/carbonapi/http/metrics.go 0.0%
github.com/grafana/carbonapi/cmd/carbonapi/http/render_handler.go 50.0%
github.com/grafana/carbonapi/cmd/carbonapi/http/tags_handler.go 0.0%
github.com/grafana/carbonapi/cmd/carbonapi/http/usage_handler.go 0.0%
github.com/grafana/carbonapi/cmd/carbonapi/http/version_handler.go 0.0%
github.com/grafana/carbonapi/date/date.go 78.9%
github.com/grafana/carbonapi/expr/consolidations/consolidations.go 44.5%
github.com/grafana/carbonapi/expr/expr.go 31.0%
github.com/grafana/carbonapi/expr/functions/absolute/function.go 80.0%
github.com/grafana/carbonapi/expr/functions/aggregate/function.go 82.2%
github.com/grafana/carbonapi/expr/functions/aggregateLine/function.go 81.0%
github.com/grafana/carbonapi/expr/functions/aggregateSeriesLists/function.go 73.5%
github.com/grafana/carbonapi/expr/functions/aggregateWithWildcards/function.go 86.7%
github.com/grafana/carbonapi/expr/functions/alias/function.go 83.3%
github.com/grafana/carbonapi/expr/functions/aliasByBase64/function.go 88.9%
github.com/grafana/carbonapi/expr/functions/aliasByMetric/function.go 92.9%
github.com/grafana/carbonapi/expr/functions/aliasByNode/function.go 83.3%
github.com/grafana/carbonapi/expr/functions/aliasByRedis/function.go 72.1%
github.com/grafana/carbonapi/expr/functions/aliasSub/function.go 77.4%
github.com/grafana/carbonapi/expr/functions/asPercent/function.go 77.6%
github.com/grafana/carbonapi/expr/functions/averageOutsidePercentile/function.go 89.3%
github.com/grafana/carbonapi/expr/functions/averageSeriesWithWildcards/function.go 89.4%
github.com/grafana/carbonapi/expr/functions/below/function.go 91.7%
github.com/grafana/carbonapi/expr/functions/cactiStyle/function.go 88.7%
github.com/grafana/carbonapi/expr/functions/changed/function.go 92.3%
github.com/grafana/carbonapi/expr/functions/constantLine/function.go 88.2%
github.com/grafana/carbonapi/expr/functions/delay/function.go 90.6%
github.com/grafana/carbonapi/expr/functions/derivative/function.go 93.8%
github.com/grafana/carbonapi/expr/functions/divideSeries/function.go 87.7%
github.com/grafana/carbonapi/expr/functions/ewma/function.go 90.0%
github.com/grafana/carbonapi/expr/functions/exclude/function.go 81.8%
github.com/grafana/carbonapi/expr/functions/exp/function.go 90.9%
github.com/grafana/carbonapi/expr/functions/exponentialMovingAverage/function.go 72.2%
github.com/grafana/carbonapi/expr/functions/fallbackSeries/function.go 86.7%
github.com/grafana/carbonapi/expr/functions/filter/function.go 84.4%
github.com/grafana/carbonapi/expr/functions/grep/function.go 81.8%
github.com/grafana/carbonapi/expr/functions/groupByNode/function.go 86.5%
github.com/grafana/carbonapi/expr/functions/groupByTags/function.go 90.0%
github.com/grafana/carbonapi/expr/functions/heatMap/function.go 86.4%
github.com/grafana/carbonapi/expr/functions/heatMap/helpers.go 84.6%
github.com/grafana/carbonapi/expr/functions/highestLowest/function.go 87.1%
github.com/grafana/carbonapi/expr/functions/hitcount/function.go 93.8%
github.com/grafana/carbonapi/expr/functions/identity/function.go 89.5%
github.com/grafana/carbonapi/expr/functions/integral/function.go 94.4%
github.com/grafana/carbonapi/expr/functions/integralByInterval/function.go 85.4%
github.com/grafana/carbonapi/expr/functions/integralWithReset/function.go 86.1%
github.com/grafana/carbonapi/expr/functions/interpolate/function.go 92.1%
github.com/grafana/carbonapi/expr/functions/invert/function.go 93.3%
github.com/grafana/carbonapi/expr/functions/isNotNull/function.go 93.8%
github.com/grafana/carbonapi/expr/functions/join/function.go 89.5%
github.com/grafana/carbonapi/expr/functions/keepLastValue/function.go 92.5%
github.com/grafana/carbonapi/expr/functions/legendValue/function.go 90.9%
github.com/grafana/carbonapi/expr/functions/limit/function.go 82.4%
github.com/grafana/carbonapi/expr/functions/linearRegression/function.go 80.0%
github.com/grafana/carbonapi/expr/functions/logarithm/function.go 90.9%
github.com/grafana/carbonapi/expr/functions/logit/function.go 91.3%
github.com/grafana/carbonapi/expr/functions/lowPass/function.go 89.3%
github.com/grafana/carbonapi/expr/functions/mapSeries/function.go 88.0%
github.com/grafana/carbonapi/expr/functions/minMax/function.go 86.7%
github.com/grafana/carbonapi/expr/functions/mostDeviant/function.go 88.6%
github.com/grafana/carbonapi/expr/functions/moving/function.go 82.3%
github.com/grafana/carbonapi/expr/functions/movingMedian/function.go 86.3%
github.com/grafana/carbonapi/expr/functions/multiplySeriesWithWildcards/function.go 90.2%
github.com/grafana/carbonapi/expr/functions/nPercentile/function.go 90.0%
github.com/grafana/carbonapi/expr/functions/nonNegativeDerivative/function.go 90.5%
github.com/grafana/carbonapi/expr/functions/offset/function.go 88.0%
github.com/grafana/carbonapi/expr/functions/offsetToZero/function.go 94.1%
github.com/grafana/carbonapi/expr/functions/pearson/function.go 86.1%
github.com/grafana/carbonapi/expr/functions/pearsonClosest/function.go 75.0%
github.com/grafana/carbonapi/expr/functions/perSecond/function.go 90.5%
github.com/grafana/carbonapi/expr/functions/percentileOfSeries/function.go 81.8%
github.com/grafana/carbonapi/expr/functions/polyfit/function.go 87.3%
github.com/grafana/carbonapi/expr/functions/pow/function.go 88.9%
github.com/grafana/carbonapi/expr/functions/powSeries/function.go 95.0%
github.com/grafana/carbonapi/expr/functions/rangeOfSeries/function.go 94.3%
github.com/grafana/carbonapi/expr/functions/removeBelowSeries/function.go 92.3%
github.com/grafana/carbonapi/expr/functions/removeBetweenPercentile/function.go 89.2%
github.com/grafana/carbonapi/expr/functions/removeEmptySeries/function.go 90.0%
github.com/grafana/carbonapi/expr/functions/round/function.go 90.0%
github.com/grafana/carbonapi/expr/functions/scale/function.go 88.6%
github.com/grafana/carbonapi/expr/functions/scaleToSeconds/function.go 88.5%
github.com/grafana/carbonapi/expr/functions/seriesList/function.go 65.2%
github.com/grafana/carbonapi/expr/functions/sigmoid/function.go 91.3%
github.com/grafana/carbonapi/expr/functions/sinFunction/function.go 86.2%
github.com/grafana/carbonapi/expr/functions/slo/function.go 84.0%
github.com/grafana/carbonapi/expr/functions/slo/helpers.go 72.0%
github.com/grafana/carbonapi/expr/functions/smartSummarize/function.go 90.8%
github.com/grafana/carbonapi/expr/functions/sortBy/function.go 85.7%
github.com/grafana/carbonapi/expr/functions/sortByName/function.go 85.2%
github.com/grafana/carbonapi/expr/functions/squareRoot/function.go 90.5%
github.com/grafana/carbonapi/expr/functions/substr/function.go 85.4%
github.com/grafana/carbonapi/expr/functions/sumSeriesWithWildcards/function.go 89.1%
github.com/grafana/carbonapi/expr/functions/summarize/function.go 91.7%
github.com/grafana/carbonapi/expr/functions/timeShift/function.go 78.0%
github.com/grafana/carbonapi/expr/functions/timeShiftByMetric/function.go 89.7%
github.com/grafana/carbonapi/expr/functions/timeShiftByMetric/misc.go 93.8%
github.com/grafana/carbonapi/expr/functions/transformNull/function.go 88.7%
github.com/grafana/carbonapi/expr/functions/tukey/function.go 80.8%
github.com/grafana/carbonapi/expr/functions/unique/function.go 88.9%
github.com/grafana/carbonapi/expr/functions/weightedAverage/function.go 85.7%
github.com/grafana/carbonapi/expr/helper/align.go 60.7%
github.com/grafana/carbonapi/expr/helper/helper.go 0.0%
github.com/grafana/carbonapi/expr/helper/metric/extract.go 72.7%
github.com/grafana/carbonapi/expr/helper/sort.go 0.0%
github.com/grafana/carbonapi/expr/rewrite/aboveSeries/function.go 79.3%
github.com/grafana/carbonapi/expr/sort.go 96.1%
github.com/grafana/carbonapi/expr/tags/helper.go 100.0%
github.com/grafana/carbonapi/expr/types/extract.go 82.4%
github.com/grafana/carbonapi/expr/types/list.go 0.0%
github.com/grafana/carbonapi/expr/types/metricheap.go 0.0%
github.com/grafana/carbonapi/expr/types/types.go 33.9%
github.com/grafana/carbonapi/expr/types/windowed.go 0.0%
github.com/grafana/carbonapi/pkg/parser/define.go 76.9%
github.com/grafana/carbonapi/pkg/parser/interface.go 0.0%
github.com/grafana/carbonapi/pkg/parser/internal.go 9.4%
github.com/grafana/carbonapi/pkg/parser/interval.go 83.8%
github.com/grafana/carbonapi/pkg/parser/parser.go 44.3%
github.com/grafana/carbonapi/zipper/broadcast/broadcast_group.go 38.5%
github.com/grafana/carbonapi/zipper/helper/requests.go 13.3%
github.com/grafana/carbonapi/zipper/protocols/graphite/msgpack/type_gen.go 57.2%
github.com/grafana/carbonapi/zipper/protocols/irondb/irondb_group.go 2.5%
github.com/grafana/carbonapi/zipper/protocols/irondb/irondb_helpers.go 81.1%
github.com/grafana/carbonapi/zipper/protocols/prometheus/helpers/helpers.go 17.1%
github.com/grafana/carbonapi/zipper/protocols/victoriametrics/feature_set.go 19.7%
github.com/grafana/carbonapi/zipper/protocols/victoriametrics/fetch.go 0.0%
github.com/grafana/carbonapi/zipper/protocols/victoriametrics/find.go 0.0%
github.com/grafana/carbonapi/zipper/protocols/victoriametrics/tags.go 0.0%
github.com/grafana/carbonapi/zipper/protocols/victoriametrics/victoriametrics_group.go 7.8%
github.com/grafana/carbonapi/zipper/types/backend.go 0.0%
github.com/grafana/carbonapi/zipper/types/errors.go 0.0%
github.com/grafana/carbonapi/zipper/types/lbmethod.go 0.0%
github.com/grafana/carbonapi/zipper/types/requests.go 0.0%
github.com/grafana/carbonapi/zipper/types/response.go 6.4%
github.com/grafana/carbonapi/zipper/types/stats.go 0.0%
github.com/grafana/carbonapi/zipper/zipper.go 0.0%
github.com/grafana/carbonapi/zipper/zipper_pb3.go 0.0%
total 55.5%

Go lint report:

No issues found. 😎

@carrieedwards carrieedwards merged commit f0faed3 into main Aug 23, 2022
@leizor leizor mentioned this pull request May 11, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Fix handling of tags for nested functions
3 participants