Skip to content

Commit

Permalink
Change structure of stored subplan metrics to map<string,int[]>
Browse files Browse the repository at this point in the history
  • Loading branch information
foster33 committed Sep 29, 2023
2 parents f424057 + 15c0ee3 commit 530d5bf
Show file tree
Hide file tree
Showing 24 changed files with 855 additions and 509 deletions.
45 changes: 41 additions & 4 deletions api/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
<relativePath />
</parent>
<artifactId>query-metric-api</artifactId>
<version>2.1.1-1229</version>
<version>2.1.3-SNAPSHOT</version>
<url>https://code.nsa.gov/datawave-query-metric-service</url>
<scm>
<connection>scm:git:https://github.com/NationalSecurityAgency/datawave-query-metric-service.git</connection>
Expand All @@ -21,7 +21,7 @@
<version.base-rest-responses>2.1.0</version.base-rest-responses>
<version.commons-lang3>3.12.0</version.commons-lang3>
<version.commons-text>1.9</version.commons-text>
<version.datawave>5.1.0</version.datawave>
<version.datawave>5.9.1</version.datawave>
<version.glassfish>2.3.6</version.glassfish>
<version.guava>31.1-jre</version.guava>
<version.jackson>2.12.5</version.jackson>
Expand Down Expand Up @@ -103,7 +103,7 @@
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<artifactId>slf4j-api</artifactId>
<version>${version.slf4j}</version>
</dependency>
<dependency>
Expand Down Expand Up @@ -186,7 +186,7 @@
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
Expand Down Expand Up @@ -220,4 +220,41 @@
<url>https://raw.githubusercontent.com/NationalSecurityAgency/datawave/mvn-repo</url>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.4.1</version>
<executions>
<execution>
<id>enforce-banned-dependencies</id>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<bannedDependencies>
<excludes>
<!-- spring boot microservices do not use the following slf4j binders -->
<exclude>ch.qos.reload4j:reload4j</exclude>
<exclude>org.slf4j:slf4j-reload4j</exclude>
<!-- spring boot microservices do not use 1.x versions of log4j -->
<exclude>log4j:log4j</exclude>
<!-- spring boot microservices do not use 1.x versions of junit -->
<exclude>junit:junit</exclude>
</excludes>
<includes>
<!-- some spring boot microservices include test dependencies which use 1.x versions of junit -->
<include>junit:junit:*:*:test</include>
</includes>
</bannedDependencies>
</rules>
<fail>true</fail>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
Expand Up @@ -685,7 +685,7 @@ public int getFieldNumber(String name) {

@XmlElement(name = "subplans")
@XmlJavaTypeAdapter(StringMapAdapter.class)
protected Map<String,String> subPlans = new HashMap<>();
protected Map<String,int[]> subPlans = new HashMap<>();

public static final String DATAWAVE = "DATAWAVE";
protected static final Map<String,String> discoveredVersionMap = BaseQueryMetric.getVersionsFromClasspath();
Expand All @@ -696,15 +696,15 @@ public enum Lifecycle {
NONE, DEFINED, INITIALIZED, RESULTS, CLOSED, CANCELLED, MAXRESULTS, NEXTTIMEOUT, TIMEOUT, SHUTDOWN, MAXWORK
}

public void addSubPlan(String range, String plan) {
subPlans.put(range, plan);
public void addSubPlan(String plan, int[] rangeCounts) {
subPlans.put(plan, rangeCounts);
}

public Map<String,String> getSubPlans() {
public Map<String,int[]> getSubPlans() {
return subPlans;
}

public void setSubPlans(Map<String,String> subPlans) {
public void setSubPlans(Map<String,int[]> subPlans) {
this.subPlans = subPlans;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,36 +1,35 @@
package datawave.microservice.querymetric;

import datawave.webservice.HtmlProvider;
import datawave.webservice.query.QueryImpl;
import datawave.webservice.result.BaseResponse;
import org.apache.commons.text.StringEscapeUtils;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlTransient;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

public class BaseQueryMetricSubplanResponse<T extends BaseQueryMetric> extends BaseResponse implements HtmlProvider {
public abstract class BaseQueryMetricSubplanResponse<T extends BaseQueryMetric> extends BaseResponse implements HtmlProvider {

private static final long serialVersionUID = 1L;
private static final String TITLE = "Query Subplans";
private static final String TITLE = "Query Metrics / Subplans";
private static final String EMPTY = "";
@XmlElementWrapper(name = "querySubplans")
@XmlElement(name = "querySubplan")
protected List<T> result = null;
@XmlElement
protected int numResults = 0;
@XmlTransient
private boolean administratorMode = false;
@XmlTransient
private boolean isGeoQuery = false;

private static String numToString(long number) {
return (number == -1 || number == 0) ? "" : Long.toString(number);
}

public List<T> getResult() {
return result;
}
Expand All @@ -48,14 +47,6 @@ public void setNumResults(int numResults) {
this.numResults = numResults;
}

public boolean isAdministratorMode() {
return administratorMode;
}

public void setAdministratorMode(boolean administratorMode) {
this.administratorMode = administratorMode;
}

public boolean isGeoQuery() {
return isGeoQuery;
}
Expand Down Expand Up @@ -95,48 +86,76 @@ public String getHeadContent() {

@Override
public String getMainContent() {
StringBuilder builder = new StringBuilder(), pageTimesBuilder = new StringBuilder();

builder.append("<table>\n");
builder.append("<tr>");
builder.append("<th>Subplan(s)</th>");

pageTimesBuilder.append("<table>\n");

builder.append(pageTimesBuilder);

TreeMap<Date,T> metricMap = new TreeMap<>(Collections.reverseOrder());

for (T metric : this.getResult()) {
metricMap.put(metric.getCreateDate(), metric);
}

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HHmmss");
StringBuilder builder = new StringBuilder();
int x = 0;
for (T metric : metricMap.values()) {
builder.append("<table>\n");
builder.append("<tr>");
builder.append("<th>Visibility</th>");
builder.append("<th>Query Date</th>");
builder.append("<th>User</th>");
builder.append("<th>UserDN</th>");
builder.append("<th>Query ID</th>");
builder.append("<th>Query Logic</th>");
builder.append("<th id=\"query-header\">Query</th>");
builder.append("<th>Query Plan</th>");
builder.append("</tr>");

Set<QueryImpl.Parameter> parameters = metric.getParameters();
// highlight alternating rows
if (x % 2 == 0) {
builder.append("<tr class=\"highlight\">\n");
} else {
builder.append("<tr>\n");
}
x++;

builder.append("<td>").append(metric.getColumnVisibility()).append("</td>");
builder.append("<td style=\"min-width:125px !important;\">").append(sdf.format(metric.getCreateDate())).append("</td>");
builder.append("<td>").append(metric.getUser()).append("</td>");
String userDN = metric.getUserDN();
builder.append("<td style=\"min-width:500px !important;\">").append(userDN == null ? "" : userDN).append("</td>");
builder.append("<td>").append(metric.getQueryId()).append("</td>");
builder.append("<td>").append(metric.getQueryLogic()).append("</td>");
builder.append(isJexlQuery(parameters) ? "<td style=\"white-space: pre; word-wrap: break-word;\">" : "<td style=\"word-wrap: break-word;\">")
.append(StringEscapeUtils.escapeHtml4(metric.getQuery())).append("</td>");
builder.append("<td style=\"white-space: pre; word-wrap: break-word;\">").append(StringEscapeUtils.escapeHtml4(metric.getPlan())).append("</td>");
builder.append("</tr>\n");
builder.append("</table>\n");

builder.append("<br/>");
builder.append("<table>\n");
builder.append("<tr><th>Range</th><th>Sub Plan</th></tr>");
if (metric.getSubPlans() != null && !metric.getSubPlans().isEmpty()) {
for (Map.Entry<String,String> subplan : metric.getSubPlans().entrySet()) {
builder.append("<td>").append(subplan.getKey()).append(subplan.getValue()).append("</td>");
int s = 0;
for (Map.Entry<String, int[]> e : metric.getSubPlans().entrySet()) {
// highlight alternating rows
if (s % 2 == 0) {
builder.append("<tr class=\"highlight\">");
} else {
builder.append("<tr>");
}
builder.append("<td>").append(e.getKey()).append("</td>");
builder.append("<td>").append(Arrays.toString(e.getValue())).append("</td>");
builder.append("\n</tr>\n");
s++;
}
} else {
builder.append("<td>NONE<td/>");
builder.append("<tr><td colspan=\"2\">NONE<td/></tr>");
}

builder.append("\n</tr>\n");
builder.append("</td></tr>\n");
builder.append("</table>\n");
builder.append("\n<br/><br/>\n");
}

builder.append("</table>\n<br/>\n");
pageTimesBuilder.append("</table>\n");

builder.append(pageTimesBuilder);

return builder.toString();
}

private static boolean isJexlQuery(Set<QueryImpl.Parameter> params) {
return params.stream().anyMatch(p -> p.getParameterName().equals("query.syntax") && p.getParameterValue().equals("JEXL"));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -410,7 +410,7 @@ public void writeTo(Output output, QueryMetric message) throws IOException {
}

if (message.subPlans != null) {
for (Map.Entry<String,String> entry : message.subPlans.entrySet()) {
for (Map.Entry<String,int[]> entry : message.subPlans.entrySet()) {
output.writeString(39, StringUtils.join(Arrays.asList(entry.getKey(), entry.getValue()), "\0"), true);
}
}
Expand Down Expand Up @@ -570,7 +570,13 @@ public void mergeFrom(Input input, QueryMetric message) throws IOException {
String encodedPlans = input.readString();
String[] splitPlans = StringUtils.split(encodedPlans, "\0");
if (splitPlans.length == 2) {
message.subPlans.put(splitPlans[0], splitPlans[1]);
int[] rangeCounts = new int[2];
int index = 0;
for (String count : splitPlans[1].substring(1, splitPlans[1].length() - 1).split(", ")) {
rangeCounts[index] = Integer.parseInt(count);
index++;
}
message.subPlans.put(splitPlans[0], rangeCounts);
}
break;
default:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@
public class QueryMetricUpdate<T extends BaseQueryMetric> implements Serializable {

@XmlElement
private T metric;
protected T metric;

@XmlElement
private QueryMetricType metricType;
protected QueryMetricType metricType;

/* constructor for deserializing JSON messages */
public QueryMetricUpdate() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,12 +86,8 @@ public String getMainContent() {
builder.append(isJexlQuery(parameters) ? "<td style=\"white-space: pre; word-wrap: break-word;\">" : "<td style=\"word-wrap: break-word;\">")
.append(StringEscapeUtils.escapeHtml4(metric.getQuery())).append("</td>");
builder.append("<td style=\"white-space: pre; word-wrap: break-word;\">").append(StringEscapeUtils.escapeHtml4(metric.getPlan())).append("</td>");
if (metric.getSubPlans() != null && !metric.getSubPlans().isEmpty()) {
builder.append("<td style=\"white-space: pre; word-wrap: break-word;\">").append("<a href=\"/DataWave/Query/Metrics/id/")
.append(metric.getQueryId()).append("/subplans\"> Subplan(s)</a>").append("</td>");
} else {
builder.append("<td/>");
}
builder.append("<td style=\"white-space: pre; word-wrap: break-word;\">").append("<a href=\"/DataWave/Query/Metrics/id/")
.append(metric.getQueryId()).append("/subplans\">Subplan(s)</a>").append("</td>");
builder.append("<td>").append(metric.getQueryName()).append("</td>");

String beginDate = metric.getBeginDate() == null ? "" : sdf.format(metric.getBeginDate());
Expand Down
Loading

0 comments on commit 530d5bf

Please sign in to comment.