Skip to content

Commit b9f13f3

Browse files
committed
Rework internal data model
1 parent 18f6d01 commit b9f13f3

File tree

5 files changed

+106
-135
lines changed

5 files changed

+106
-135
lines changed

x-pack/plugin/profiling/src/main/java/org/elasticsearch/xpack/profiling/action/GetStackTracesResponse.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public class GetStackTracesResponse extends ActionResponse implements ChunkedToX
3232
private final Map<String, String> executables;
3333
@UpdateForV9(owner = UpdateForV9.Owner.PROFILING) // remove this field - it is unused in Kibana
3434
@Nullable
35-
private final Map<String, TraceEvent> stackTraceEvents;
35+
private final Map<TraceEventID, TraceEvent> stackTraceEvents;
3636
@UpdateForV9(owner = UpdateForV9.Owner.PROFILING) // remove this field - it is unused in Kibana
3737
private final int totalFrames;
3838
private final double samplingRate;
@@ -42,7 +42,7 @@ public GetStackTracesResponse(
4242
Map<String, StackTrace> stackTraces,
4343
Map<String, StackFrame> stackFrames,
4444
Map<String, String> executables,
45-
Map<String, TraceEvent> stackTraceEvents,
45+
Map<TraceEventID, TraceEvent> stackTraceEvents,
4646
int totalFrames,
4747
double samplingRate,
4848
long totalSamples
@@ -73,7 +73,7 @@ public Map<String, String> getExecutables() {
7373
return executables;
7474
}
7575

76-
public Map<String, TraceEvent> getStackTraceEvents() {
76+
public Map<TraceEventID, TraceEvent> getStackTraceEvents() {
7777
return stackTraceEvents;
7878
}
7979

@@ -100,23 +100,24 @@ public Iterator<? extends ToXContent> toXContentChunked(ToXContent.Params params
100100
optional(
101101
"stack_trace_events",
102102
stackTraceEvents,
103-
(n, v) -> ChunkedToXContentHelper.map(n, v, entry -> (b, p) -> b.field(entry.getKey(), entry.getValue().count))
103+
(n, v) -> ChunkedToXContentHelper.wrapWithObject(
104+
n,
105+
Iterators.map(v.values().iterator(), e -> (b, p) -> b.field(e.stacktraceID, e.count))
106+
)
104107
),
105-
Iterators.single((b, p) -> b.field("total_frames", totalFrames)),
106-
Iterators.single((b, p) -> b.field("sampling_rate", samplingRate)),
108+
Iterators.single((b, p) -> b.field("total_frames", totalFrames).field("sampling_rate", samplingRate).endObject())
107109
// the following fields are intentionally not written to the XContent representation (only needed on the transport layer):
108110
//
109111
// * start
110112
// * end
111113
// * totalSamples
112-
ChunkedToXContentHelper.endObject()
113114
);
114115
}
115116

116-
private static <T> Iterator<? extends ToXContent> optional(
117+
private static <K, T> Iterator<? extends ToXContent> optional(
117118
String name,
118-
Map<String, T> values,
119-
BiFunction<String, Map<String, T>, Iterator<? extends ToXContent>> supplier
119+
Map<K, T> values,
120+
BiFunction<String, Map<K, T>, Iterator<? extends ToXContent>> supplier
120121
) {
121122
return (values != null) ? supplier.apply(name, values) : Collections.emptyIterator();
122123
}

x-pack/plugin/profiling/src/main/java/org/elasticsearch/xpack/profiling/action/GetStackTracesResponseBuilder.java

Lines changed: 17 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
package org.elasticsearch.xpack.profiling.action;
99

1010
import java.time.Instant;
11-
import java.util.List;
1211
import java.util.Map;
1312

1413
class GetStackTracesResponseBuilder {
@@ -18,9 +17,7 @@ class GetStackTracesResponseBuilder {
1817
private int totalFrames;
1918
private Map<String, StackFrame> stackFrames;
2019
private Map<String, String> executables;
21-
private Map<String, TraceEvent> stackTraceEvents;
22-
private List<TransportGetStackTracesAction.HostEventCount> hostEventCounts;
23-
private Map<TransportGetStackTracesAction.TraceEventMetadata, TraceEvent> executableEvents;
20+
private Map<TraceEventID, TraceEvent> stackTraceEvents;
2421
private double samplingRate;
2522
private long totalSamples;
2623
private Double requestedDuration;
@@ -68,27 +65,11 @@ public void setExecutables(Map<String, String> executables) {
6865
this.executables = executables;
6966
}
7067

71-
public void setStackTraceEvents(Map<String, TraceEvent> stackTraceEvents) {
68+
public void setStackTraceEvents(Map<TraceEventID, TraceEvent> stackTraceEvents) {
7269
this.stackTraceEvents = stackTraceEvents;
7370
}
7471

75-
public void setHostEventCounts(List<TransportGetStackTracesAction.HostEventCount> hostEventCounts) {
76-
this.hostEventCounts = hostEventCounts;
77-
}
78-
79-
public void setExecutableEvents(Map<TransportGetStackTracesAction.TraceEventMetadata, TraceEvent> executableEvents) {
80-
this.executableEvents = executableEvents;
81-
}
82-
83-
public List<TransportGetStackTracesAction.HostEventCount> getHostEventCounts() {
84-
return hostEventCounts;
85-
}
86-
87-
public Map<TransportGetStackTracesAction.TraceEventMetadata, TraceEvent> getExecutableEvents() {
88-
return executableEvents;
89-
}
90-
91-
public Map<String, TraceEvent> getStackTraceEvents() {
72+
public Map<TraceEventID, TraceEvent> getStackTraceEvents() {
9273
return stackTraceEvents;
9374
}
9475

@@ -157,22 +138,21 @@ public void setTotalSamples(long totalSamples) {
157138

158139
public GetStackTracesResponse build() {
159140
// Merge the TraceEvent data into the StackTraces.
160-
if (stackTraces != null) {
161-
for (Map.Entry<String, StackTrace> entry : stackTraces.entrySet()) {
162-
String stacktraceID = entry.getKey();
163-
TraceEvent event = stackTraceEvents.get(stacktraceID);
164-
if (event != null) {
165-
StackTrace stackTrace = entry.getValue();
166-
stackTrace.count = event.count;
167-
stackTrace.executableName = event.executableName;
168-
stackTrace.threadName = event.threadName;
169-
if (event.subGroups != null) {
170-
stackTrace.subGroups = event.subGroups;
171-
}
172-
stackTrace.annualCO2Tons = event.annualCO2Tons;
173-
stackTrace.annualCostsUSD = event.annualCostsUSD;
141+
if (stackTraces != null && stackTraceEvents != null) {
142+
stackTraceEvents.forEach((id, event) -> {
143+
StackTrace stackTrace = stackTraces.get(id.stacktraceID());
144+
if (stackTrace == null) {
145+
return;
146+
}
147+
stackTrace.count += event.count;
148+
stackTrace.executableName = event.executableName;
149+
stackTrace.threadName = event.threadName;
150+
if (event.subGroups != null) {
151+
stackTrace.subGroups = event.subGroups;
174152
}
175-
}
153+
stackTrace.annualCO2Tons += event.annualCO2Tons;
154+
stackTrace.annualCostsUSD += event.annualCostsUSD;
155+
});
176156
}
177157
return new GetStackTracesResponse(stackTraces, stackFrames, executables, stackTraceEvents, totalFrames, samplingRate, totalSamples);
178158
}

x-pack/plugin/profiling/src/main/java/org/elasticsearch/xpack/profiling/action/TraceEvent.java

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,32 @@
1111

1212
final class TraceEvent {
1313
final String stacktraceID;
14-
String executableName;
15-
String threadName;
14+
final String executableName;
15+
final String threadName;
16+
final String hostID;
17+
long count;
1618
double annualCO2Tons;
1719
double annualCostsUSD;
18-
long count;
1920
SubGroup subGroups;
2021

2122
TraceEvent(String stacktraceID) {
22-
this(stacktraceID, 0);
23+
this(stacktraceID, "", "", "", 0);
2324
}
2425

2526
TraceEvent(String stacktraceID, long count) {
27+
this(stacktraceID, "", "", "", count);
28+
}
29+
30+
TraceEvent(String stacktraceID, String executableName, String threadName, String hostID) {
31+
this(stacktraceID, executableName, threadName, hostID, 0);
32+
}
33+
34+
TraceEvent(String stacktraceID, String executableName, String threadName, String hostID, long count) {
2635
this.stacktraceID = stacktraceID;
36+
this.executableName = executableName;
37+
this.threadName = threadName;
38+
this.hostID = hostID;
2739
this.count = count;
28-
this.executableName = "";
29-
this.threadName = "";
3040
}
3141

3242
@Override
@@ -38,12 +48,16 @@ public boolean equals(Object o) {
3848
return false;
3949
}
4050
TraceEvent event = (TraceEvent) o;
41-
return count == event.count && Objects.equals(stacktraceID, event.stacktraceID);
51+
return count == event.count
52+
&& Objects.equals(stacktraceID, event.stacktraceID)
53+
&& Objects.equals(executableName, event.executableName)
54+
&& Objects.equals(threadName, event.threadName)
55+
&& Objects.equals(hostID, event.hostID);
4256
}
4357

4458
@Override
4559
public int hashCode() {
46-
return Objects.hash(stacktraceID, count);
60+
return Objects.hash(stacktraceID, executableName, threadName, hostID, count);
4761
}
4862

4963
@Override
@@ -58,12 +72,12 @@ public String toString() {
5872
+ ", threadName='"
5973
+ threadName
6074
+ '\''
75+
+ ", count="
76+
+ count
6177
+ ", annualCO2Tons="
6278
+ annualCO2Tons
6379
+ ", annualCostsUSD="
6480
+ annualCostsUSD
65-
+ ", count="
66-
+ count
6781
+ ", subGroups="
6882
+ subGroups
6983
+ '}';
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License
4+
* 2.0; you may not use this file except in compliance with the Elastic License
5+
* 2.0.
6+
*/
7+
8+
package org.elasticsearch.xpack.profiling.action;
9+
10+
record TraceEventID(String executableName, String threadName, String hostID, String stacktraceID) {}

0 commit comments

Comments
 (0)