Skip to content

Commit d7c6c22

Browse files
[Profiling] Improve parameterized request test (#102972)
* [Profiling] Add co2/cost params to stacktrace request test * Extract class GetStackTracesResponseBuilder.java * Cover GetStackTracesResponseBuilder in tests * Assert-test single response fields --------- Co-authored-by: Elastic Machine <[email protected]>
1 parent 084bd5b commit d7c6c22

File tree

3 files changed

+195
-164
lines changed

3 files changed

+195
-164
lines changed
Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
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;
9+
10+
import java.time.Instant;
11+
import java.util.List;
12+
import java.util.Map;
13+
14+
class GetStackTracesResponseBuilder {
15+
private Map<String, StackTrace> stackTraces;
16+
private Instant start;
17+
private Instant end;
18+
private int totalFrames;
19+
private Map<String, StackFrame> stackFrames;
20+
private Map<String, String> executables;
21+
private Map<String, TraceEvent> stackTraceEvents;
22+
private List<TransportGetStackTracesAction.HostEventCount> hostEventCounts;
23+
private double samplingRate;
24+
private long totalSamples;
25+
private Double requestedDuration;
26+
private final Double awsCostFactor;
27+
private final Double customCO2PerKWH;
28+
private final Double customDatacenterPUE;
29+
private final Double customPerCoreWattX86;
30+
private final Double customPerCoreWattARM64;
31+
private final Double customCostPerCoreHour;
32+
33+
public void setStackTraces(Map<String, StackTrace> stackTraces) {
34+
this.stackTraces = stackTraces;
35+
}
36+
37+
public Instant getStart() {
38+
return start;
39+
}
40+
41+
public void setStart(Instant start) {
42+
this.start = start;
43+
}
44+
45+
public Instant getEnd() {
46+
return end;
47+
}
48+
49+
public void setEnd(Instant end) {
50+
this.end = end;
51+
}
52+
53+
public void setTotalFrames(int totalFrames) {
54+
this.totalFrames = totalFrames;
55+
}
56+
57+
public void setStackFrames(Map<String, StackFrame> stackFrames) {
58+
this.stackFrames = stackFrames;
59+
}
60+
61+
public void setExecutables(Map<String, String> executables) {
62+
this.executables = executables;
63+
}
64+
65+
public void setStackTraceEvents(Map<String, TraceEvent> stackTraceEvents) {
66+
this.stackTraceEvents = stackTraceEvents;
67+
}
68+
69+
public void setHostEventCounts(List<TransportGetStackTracesAction.HostEventCount> hostEventCounts) {
70+
this.hostEventCounts = hostEventCounts;
71+
}
72+
73+
public List<TransportGetStackTracesAction.HostEventCount> getHostEventCounts() {
74+
return hostEventCounts;
75+
}
76+
77+
public Map<String, TraceEvent> getStackTraceEvents() {
78+
return stackTraceEvents;
79+
}
80+
81+
public void setSamplingRate(double rate) {
82+
this.samplingRate = rate;
83+
}
84+
85+
public double getSamplingRate() {
86+
return samplingRate;
87+
}
88+
89+
public void setRequestedDuration(Double requestedDuration) {
90+
this.requestedDuration = requestedDuration;
91+
}
92+
93+
public double getRequestedDuration() {
94+
if (requestedDuration != null) {
95+
return requestedDuration;
96+
}
97+
// If "requested_duration" wasn't specified, we use the time range from the query response.
98+
return end.getEpochSecond() - start.getEpochSecond();
99+
}
100+
101+
public Double getAWSCostFactor() {
102+
return awsCostFactor;
103+
}
104+
105+
public Double getCustomCO2PerKWH() {
106+
return customCO2PerKWH;
107+
}
108+
109+
public Double getCustomDatacenterPUE() {
110+
return customDatacenterPUE;
111+
}
112+
113+
public Double getCustomPerCoreWattX86() {
114+
return customPerCoreWattX86;
115+
}
116+
117+
public Double getCustomPerCoreWattARM64() {
118+
return customPerCoreWattARM64;
119+
}
120+
121+
public Double getCustomCostPerCoreHour() {
122+
return customCostPerCoreHour;
123+
}
124+
125+
public void setTotalSamples(long totalSamples) {
126+
this.totalSamples = totalSamples;
127+
}
128+
129+
GetStackTracesResponseBuilder(GetStackTracesRequest request) {
130+
this.requestedDuration = request.getRequestedDuration();
131+
this.awsCostFactor = request.getAwsCostFactor();
132+
this.customCO2PerKWH = request.getCustomCO2PerKWH();
133+
this.customDatacenterPUE = request.getCustomDatacenterPUE();
134+
this.customPerCoreWattX86 = request.getCustomPerCoreWattX86();
135+
this.customPerCoreWattARM64 = request.getCustomPerCoreWattARM64();
136+
this.customCostPerCoreHour = request.getCustomCostPerCoreHour();
137+
}
138+
139+
public GetStackTracesResponse build() {
140+
// Merge the TraceEvent data into the StackTraces.
141+
if (stackTraces != null) {
142+
for (Map.Entry<String, StackTrace> entry : stackTraces.entrySet()) {
143+
String stacktraceID = entry.getKey();
144+
TraceEvent event = stackTraceEvents.get(stacktraceID);
145+
if (event != null) {
146+
StackTrace stackTrace = entry.getValue();
147+
stackTrace.count = event.count;
148+
stackTrace.annualCO2Tons = event.annualCO2Tons;
149+
stackTrace.annualCostsUSD = event.annualCostsUSD;
150+
}
151+
}
152+
}
153+
return new GetStackTracesResponse(stackTraces, stackFrames, executables, stackTraceEvents, totalFrames, samplingRate, totalSamples);
154+
}
155+
}

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

Lines changed: 11 additions & 155 deletions
Original file line numberDiff line numberDiff line change
@@ -149,14 +149,7 @@ public TransportGetStackTracesAction(
149149
@Override
150150
protected void doExecute(Task submitTask, GetStackTracesRequest request, ActionListener<GetStackTracesResponse> submitListener) {
151151
licenseChecker.requireSupportedLicense();
152-
GetStackTracesResponseBuilder responseBuilder = new GetStackTracesResponseBuilder();
153-
responseBuilder.setRequestedDuration(request.getRequestedDuration());
154-
responseBuilder.setAwsCostFactor(request.getAwsCostFactor());
155-
responseBuilder.setCustomCO2PerKWH(request.getCustomCO2PerKWH());
156-
responseBuilder.setCustomDatacenterPUE(request.getCustomDatacenterPUE());
157-
responseBuilder.setCustomPerCoreWattX86(request.getCustomPerCoreWattX86());
158-
responseBuilder.setCustomPerCoreWattARM64(request.getCustomPerCoreWattARM64());
159-
responseBuilder.setCustomCostPerCoreHour(request.getCustomCostPerCoreHour());
152+
GetStackTracesResponseBuilder responseBuilder = new GetStackTracesResponseBuilder(request);
160153
Client client = new ParentTaskAssigningClient(this.nodeClient, transportService.getLocalNode(), submitTask);
161154
if (request.getIndices() == null) {
162155
searchProfilingEvents(submitTask, client, request, submitListener, responseBuilder);
@@ -413,8 +406,8 @@ private void retrieveStackTraces(
413406
List<Index> indices = resolver.resolve(clusterState, "profiling-stacktraces", responseBuilder.getStart(), responseBuilder.getEnd());
414407

415408
// Build a set of unique host IDs.
416-
Set<String> uniqueHostIDs = new HashSet<>(responseBuilder.hostEventCounts.size());
417-
for (HostEventCount hec : responseBuilder.hostEventCounts) {
409+
Set<String> uniqueHostIDs = new HashSet<>(responseBuilder.getHostEventCounts().size());
410+
for (HostEventCount hec : responseBuilder.getHostEventCounts()) {
418411
uniqueHostIDs.add(hec.hostID);
419412
}
420413

@@ -557,21 +550,21 @@ public void calculateCO2AndCosts() {
557550
instanceTypeService,
558551
hostMetadata,
559552
responseBuilder.getRequestedDuration(),
560-
responseBuilder.customCO2PerKWH,
561-
responseBuilder.customDatacenterPUE,
562-
responseBuilder.customPerCoreWattX86,
563-
responseBuilder.customPerCoreWattARM64
553+
responseBuilder.getCustomCO2PerKWH(),
554+
responseBuilder.getCustomDatacenterPUE(),
555+
responseBuilder.getCustomPerCoreWattX86(),
556+
responseBuilder.getCustomPerCoreWattARM64()
564557
);
565558
CostCalculator costCalculator = new CostCalculator(
566559
instanceTypeService,
567560
hostMetadata,
568561
responseBuilder.getRequestedDuration(),
569-
responseBuilder.awsCostFactor,
570-
responseBuilder.customCostPerCoreHour
562+
responseBuilder.getAWSCostFactor(),
563+
responseBuilder.getCustomCostPerCoreHour()
571564
);
572-
Map<String, TraceEvent> events = responseBuilder.stackTraceEvents;
565+
Map<String, TraceEvent> events = responseBuilder.getStackTraceEvents();
573566
List<String> missingStackTraces = new ArrayList<>();
574-
for (HostEventCount hec : responseBuilder.hostEventCounts) {
567+
for (HostEventCount hec : responseBuilder.getHostEventCounts()) {
575568
TraceEvent event = events.get(hec.stacktraceID);
576569
if (event == null) {
577570
// If this happens, hostEventsCounts and events are out of sync, which indicates a bug.
@@ -768,142 +761,5 @@ private void mget(Client client, List<Index> indices, List<String> slice, Action
768761
}
769762
}
770763

771-
private static class GetStackTracesResponseBuilder {
772-
private Map<String, StackTrace> stackTraces;
773-
private Instant start;
774-
private Instant end;
775-
private int totalFrames;
776-
private Map<String, StackFrame> stackFrames;
777-
private Map<String, String> executables;
778-
private Map<String, TraceEvent> stackTraceEvents;
779-
private List<HostEventCount> hostEventCounts;
780-
private double samplingRate;
781-
private long totalSamples;
782-
private Double requestedDuration;
783-
private Double awsCostFactor;
784-
private Double customCO2PerKWH;
785-
private Double customDatacenterPUE;
786-
private Double customPerCoreWattX86;
787-
private Double customPerCoreWattARM64;
788-
private Double customCostPerCoreHour;
789-
790-
public void setStackTraces(Map<String, StackTrace> stackTraces) {
791-
this.stackTraces = stackTraces;
792-
}
793-
794-
public Instant getStart() {
795-
return start;
796-
}
797-
798-
public void setStart(Instant start) {
799-
this.start = start;
800-
}
801-
802-
public Instant getEnd() {
803-
return end;
804-
}
805-
806-
public void setEnd(Instant end) {
807-
this.end = end;
808-
}
809-
810-
public void setTotalFrames(int totalFrames) {
811-
this.totalFrames = totalFrames;
812-
}
813-
814-
public void setStackFrames(Map<String, StackFrame> stackFrames) {
815-
this.stackFrames = stackFrames;
816-
}
817-
818-
public void setExecutables(Map<String, String> executables) {
819-
this.executables = executables;
820-
}
821-
822-
public void setStackTraceEvents(Map<String, TraceEvent> stackTraceEvents) {
823-
this.stackTraceEvents = stackTraceEvents;
824-
}
825-
826-
public void setHostEventCounts(List<HostEventCount> hostEventCounts) {
827-
this.hostEventCounts = hostEventCounts;
828-
}
829-
830-
public Map<String, TraceEvent> getStackTraceEvents() {
831-
return stackTraceEvents;
832-
}
833-
834-
public void setSamplingRate(double rate) {
835-
this.samplingRate = rate;
836-
}
837-
838-
public double getSamplingRate() {
839-
return samplingRate;
840-
}
841-
842-
public void setRequestedDuration(Double requestedDuration) {
843-
this.requestedDuration = requestedDuration;
844-
}
845-
846-
public double getRequestedDuration() {
847-
if (requestedDuration != null) {
848-
return requestedDuration;
849-
}
850-
// If "requested_duration" wasn't specified, we use the time range from the query response.
851-
return end.getEpochSecond() - start.getEpochSecond();
852-
}
853-
854-
public void setAwsCostFactor(Double awsCostFactor) {
855-
this.awsCostFactor = awsCostFactor;
856-
}
857-
858-
public void setCustomCO2PerKWH(Double customCO2PerKWH) {
859-
this.customCO2PerKWH = customCO2PerKWH;
860-
}
861-
862-
public void setCustomDatacenterPUE(Double customDatacenterPUE) {
863-
this.customDatacenterPUE = customDatacenterPUE;
864-
}
865-
866-
public void setCustomPerCoreWattX86(Double customPerCoreWattX86) {
867-
this.customPerCoreWattX86 = customPerCoreWattX86;
868-
}
869-
870-
public void setCustomPerCoreWattARM64(Double customPerCoreWattARM64) {
871-
this.customPerCoreWattARM64 = customPerCoreWattARM64;
872-
}
873-
874-
public void setCustomCostPerCoreHour(Double customCostPerCoreHour) {
875-
this.customCostPerCoreHour = customCostPerCoreHour;
876-
}
877-
878-
public void setTotalSamples(long totalSamples) {
879-
this.totalSamples = totalSamples;
880-
}
881-
882-
public GetStackTracesResponse build() {
883-
// Merge the TraceEvent data into the StackTraces.
884-
if (stackTraces != null) {
885-
for (Map.Entry<String, StackTrace> entry : stackTraces.entrySet()) {
886-
String stacktraceID = entry.getKey();
887-
TraceEvent event = stackTraceEvents.get(stacktraceID);
888-
if (event != null) {
889-
StackTrace stackTrace = entry.getValue();
890-
stackTrace.count = event.count;
891-
stackTrace.annualCO2Tons = event.annualCO2Tons;
892-
stackTrace.annualCostsUSD = event.annualCostsUSD;
893-
}
894-
}
895-
}
896-
return new GetStackTracesResponse(
897-
stackTraces,
898-
stackFrames,
899-
executables,
900-
stackTraceEvents,
901-
totalFrames,
902-
samplingRate,
903-
totalSamples
904-
);
905-
}
906-
}
907-
908764
record HostEventCount(String hostID, String stacktraceID, int count) {}
909765
}

0 commit comments

Comments
 (0)