-
Notifications
You must be signed in to change notification settings - Fork 3k
Otel optimizations I #47774
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
Otel optimizations I #47774
Conversation
/cc @radcortez (opentelemetry) |
Status for workflow
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
FYI, After profiling, the test run used 4% less samples. |
Span span = Span.fromContextOrNull(context); | ||
Map<String, String> spanData = new HashMap<>(); | ||
Map<String, String> spanData = new HashMap<>(4, 1f); | ||
if (span != null) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I wouldn't add these comments if you weren't already into micro-optimization mode but:
- if
span
can be null quite often, you could also returnCollections.emptyMap()
in this case - I also wonder if it might be worth using
Map.of
and specializing the cases a bit more
I was thinking of something like:
public static Map<String, String> getSpanData(Context context) {
if (context == null) {
return Collections.emptyMap();
}
Span span = Span.fromContextOrNull(context);
if (span == null) {
return Collections.emptyMap();
}
SpanContext spanContext = span.getSpanContext();
if (span instanceof ReadableSpan readableSpan
&& readableSpan.getParentSpanContext() != null
&& readableSpan.getParentSpanContext().isValid()) {
return Map.of(
SPAN_ID, spanContext.getSpanId(),
TRACE_ID, spanContext.getTraceId(),
SAMPLED, Boolean.toString(spanContext.isSampled()),
PARENT_ID, readableSpan.getParentSpanContext().getSpanId()
);
}
return Map.of(
SPAN_ID, spanContext.getSpanId(),
TRACE_ID, spanContext.getTraceId(),
SAMPLED, Boolean.toString(spanContext.isSampled())
);
}
It might not be worth the additional trouble though so I will let you be the judge of if. I don't expect this code to change often so I think the duplication is not that big of a problem if it performs faster.
Also the second part only works if we expect the Map to be immutable, obviously :).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Immutability is why I didn't think about the Map.of()... I'll give it a try.
Please mind the execution path using the HashMap is now only used for logging.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, if it doesn't look like a good idea, just don't bother :).
The first part about not creating the Map if null might be a good idea though.
I only added a comment because it was already micro optimization but at some point you have to decide that things are good enough!
During the otel performance work some inefficiencies were detected on the hot path, the one affecting the creation of all spans:
String.split()
which uses a regex and was costing many cycles. Re-wrote that part and added tests to make sure behaviour is compatible.