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

Support Custom Metric Attributes Per Request #6281

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

krak3n
Copy link

@krak3n krak3n commented Oct 29, 2024

What

Adds a new WithMetricsAttributesFn option which allows custom metric attributes to be added on a per request basis.

Why

So standard metrics provided by the gRPC instrumentation package can be annotated on a per request basis. Our use case is to add attributes to the instruments depending on what the handler is doing with the request.

@krak3n krak3n requested review from dashpole and a team as code owners October 29, 2024 09:23
@dmathieu
Copy link
Member

See also #6092 (which is still a draft).

@dmathieu
Copy link
Member

Could we follow the same pattern as we're doing for otelhttp?
https://github.com/open-telemetry/opentelemetry-go-contrib/pull/5876/files

@krak3n
Copy link
Author

krak3n commented Oct 29, 2024

Hey @dmathieu

Ah I wasn't aware of #6092. Yeah we can use the same pattern, I'm happy to apply that on this PR and take over that work.

@krak3n
Copy link
Author

krak3n commented Oct 29, 2024

@dmathieu pushed up changes.

Had problems getting the TestStatsHandler/Recorded/ClientMetrics tests to pass locally on the rpc.client.request.size metric. I could not figure out for the life of me why all the other scoped metrics worked but this one did not. I'm still stumped by it.

@krak3n
Copy link
Author

krak3n commented Oct 29, 2024

@dmathieu would the ability to access the gRPCContext to be able to append to the metricAttrs also be acceptable?

We have a use case where we would only know what attributes to add to the metrics while we are in the handler after db / network calls.

@dmathieu
Copy link
Member

I don't know if we should make metrics so permissive. By their nature, metrics must be low cardinality.
Your request looks like a good way to blow them up with high cardinality attributes.

@krak3n
Copy link
Author

krak3n commented Oct 29, 2024

Yeah that's fair @dmathieu. How's this PR looking in general?

Copy link
Member

@dmathieu dmathieu left a comment

Choose a reason for hiding this comment

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

I'd recommend running the tests locally to ensure everything passes and help with reviews 😸

if f := c.MetricAttributesFn; f != nil {
attrs := f(ctx, rs.Payload)

gctx.metricAttrs = append(gctx.metricAttrs, attrs...)
Copy link
Member

Choose a reason for hiding this comment

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

It doesn't seem like we need to modify gctx here?
This also causes a race problem.

Copy link
Author

Choose a reason for hiding this comment

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

So the #6092 also modified this, otherwise the metric attributes won't be propagated on the *stats.End call where the majority of the metrics are recorded, since I don't think *stats.End has access to the Payload although I will check that.

Copy link
Author

Choose a reason for hiding this comment

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

InPayload is the only stats.RPCStats implementation that has access to the request payload. So the this is only time we can call the MetricAttributesFn to be able to append too gRPCContext.metricAttrs, I can put a lock around metricAttrs protect against races?

Copy link
Member

Choose a reason for hiding this comment

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

I'm very hesitant about updating a pointer to struct that is stored as a context value. That really looks like a smell.
Unfortunately, we can't do things cleanly (provide a new context with the updated value), as we can't provide a new context as return value.

Copy link
Author

Choose a reason for hiding this comment

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

Ok, this doesn't seem like it's going to be possible then due to the limitations in how the stats.Handler works.

Copy link
Author

Choose a reason for hiding this comment

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

@dmathieu any thoughts on if we should continue with this or not?

Copy link
Member

Choose a reason for hiding this comment

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

I'd like to have other opinions.

Copy link
Author

Choose a reason for hiding this comment

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

Ok, I'll leave it with you @dmathieu 👍

@krak3n
Copy link
Author

krak3n commented Oct 30, 2024

I'd recommend running the tests locally to ensure everything passes and help with reviews 😸

I did, but I only had issues with one test as I mentioned here: #6281 (comment)

@krak3n krak3n changed the title Support adding custom metric attributes to gRPCContext Support Custom Metric Attributes Per Request Oct 30, 2024
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.

2 participants