DRILL-1591, DRILL-1676: Move javascript resources to local serving and update dagre-d3 to older version (2.9). Update profile page. Remove references to invalid servlet api.
Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/f2180b8f Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/f2180b8f Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/f2180b8f Branch: refs/heads/master Commit: f2180b8fc1edddc77ad7f6d9c615a4141cdc51ae Parents: 2eb72a7 Author: Jacques Nadeau <[email protected]> Authored: Sun Nov 9 15:17:21 2014 -0800 Committer: Jacques Nadeau <[email protected]> Committed: Thu Nov 20 08:40:20 2014 -0800 ---------------------------------------------------------------------- contrib/storage-hbase/pom.xml | 12 + exec/java-exec/pom.xml | 6 + .../org/apache/drill/exec/server/Drillbit.java | 9 +- .../drill/exec/server/rest/DrillRestServer.java | 1 - .../exec/server/rest/ProfileResources.java | 162 +- .../exec/server/rest/WebResourceServer.java | 71 - .../src/main/resources/rest/generic.ftl | 12 +- .../src/main/resources/rest/profile/list.ftl | 34 +- .../src/main/resources/rest/profile/profile.ftl | 6 +- .../resources/rest/static/css/bootstrap.min.css | 7 + .../main/resources/rest/static/img/drill.ico | Bin 0 -> 580 bytes .../resources/rest/static/js/bootstrap.min.js | 6 + .../src/main/resources/rest/static/js/d3.v3.js | 9215 ++++++++++++++++++ .../resources/rest/static/js/dagre-d3.min.js | 2 + .../src/main/resources/rest/static/js/graph.js | 313 + .../main/resources/rest/static/js/html5shiv.js | 8 + .../resources/rest/static/js/jquery.form.js | 1277 +++ .../main/resources/rest/static/js/jquery.min.js | 4 + .../resources/rest/static/js/respond.min.js | 5 + .../src/main/resources/rest/storage/update.ftl | 2 +- .../src/main/resources/rest/www/drill.ico | Bin 580 -> 0 bytes .../src/main/resources/rest/www/graph.js | 313 - exec/jdbc/pom.xml | 10 +- pom.xml | 39 +- 24 files changed, 11028 insertions(+), 486 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/f2180b8f/contrib/storage-hbase/pom.xml ---------------------------------------------------------------------- diff --git a/contrib/storage-hbase/pom.xml b/contrib/storage-hbase/pom.xml index b91a177..69ca04a 100644 --- a/contrib/storage-hbase/pom.xml +++ b/contrib/storage-hbase/pom.xml @@ -181,6 +181,10 @@ <version>1.2.1</version> <exclusions> <exclusion> + <groupId>org.mortbay.jetty</groupId> + <artifactId>servlet-api-2.5</artifactId> + </exclusion> + <exclusion> <artifactId>commons-logging</artifactId> <groupId>commons-logging</groupId> </exclusion> @@ -267,6 +271,10 @@ <version>0.94.17-mapr-1405-m7-4.0.0-FCS</version> <exclusions> <exclusion> + <groupId>org.mortbay.jetty</groupId> + <artifactId>servlet-api-2.5</artifactId> + </exclusion> + <exclusion> <artifactId>commons-logging</artifactId> <groupId>commons-logging</groupId> </exclusion> @@ -326,6 +334,10 @@ <scope>test</scope> <exclusions> <exclusion> + <groupId>org.mortbay.jetty</groupId> + <artifactId>servlet-api-2.5</artifactId> + </exclusion> + <exclusion> <artifactId>commons-logging</artifactId> <groupId>commons-logging</groupId> </exclusion> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/f2180b8f/exec/java-exec/pom.xml ---------------------------------------------------------------------- diff --git a/exec/java-exec/pom.xml b/exec/java-exec/pom.xml index 0dea38a..9fd67b1 100644 --- a/exec/java-exec/pom.xml +++ b/exec/java-exec/pom.xml @@ -106,6 +106,12 @@ <groupId>org.glassfish.jersey.ext</groupId> <artifactId>jersey-mvc-freemarker</artifactId> <version>2.8</version> + <exclusions> + <exclusion> + <artifactId>servlet-api</artifactId> + <groupId>javax.servlet</groupId> + </exclusion> + </exclusions> </dependency> <dependency> <groupId>net.hydromatic</groupId> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/f2180b8f/exec/java-exec/src/main/java/org/apache/drill/exec/server/Drillbit.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/server/Drillbit.java b/exec/java-exec/src/main/java/org/apache/drill/exec/server/Drillbit.java index e8f175b..4b9b20d 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/server/Drillbit.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/server/Drillbit.java @@ -35,8 +35,10 @@ import org.apache.drill.exec.work.WorkManager; import org.apache.zookeeper.Environment; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.ErrorHandler; +import org.eclipse.jetty.servlet.DefaultServlet; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; +import org.eclipse.jetty.util.resource.Resource; import org.glassfish.jersey.servlet.ServletContainer; import com.codahale.metrics.servlets.MetricsServlet; @@ -132,9 +134,14 @@ public class Drillbit implements Closeable{ context.addServlet(new ServletHolder(new MetricsServlet(this.context.getMetrics())), "/status/metrics"); context.addServlet(new ServletHolder(new ThreadDumpServlet()), "/status/threads"); + ServletHolder staticHolder = new ServletHolder("static", DefaultServlet.class); + staticHolder.setInitParameter("resourceBase", Resource.newClassPathResource("/rest/static").toString()); + staticHolder.setInitParameter("dirAllowed","false"); + staticHolder.setInitParameter("pathInfoOnly","true"); + context.addServlet(staticHolder,"/static/*"); + embeddedJetty.start(); - System.out.println(""); } http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/f2180b8f/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/DrillRestServer.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/DrillRestServer.java b/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/DrillRestServer.java index ac6a537..cdbaaaf 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/DrillRestServer.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/DrillRestServer.java @@ -44,7 +44,6 @@ public class DrillRestServer extends ResourceConfig { register(QueryResources.class); register(MetricsResources.class); register(ThreadsResources.class); - register(WebResourceServer.class); register(FreemarkerMvcFeature.class); property(ServerProperties.METAINF_SERVICES_LOOKUP_DISABLE, true); register(MultiPartFeature.class); http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/f2180b8f/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/ProfileResources.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/ProfileResources.java b/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/ProfileResources.java index 666faa2..58b3d4e 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/ProfileResources.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/ProfileResources.java @@ -24,6 +24,7 @@ import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Map; +import java.util.concurrent.TimeUnit; import javax.inject.Inject; import javax.ws.rs.GET; @@ -33,12 +34,17 @@ import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.xml.bind.annotation.XmlRootElement; +import org.apache.drill.exec.proto.GeneralRPCProtos.Ack; +import org.apache.drill.exec.proto.UserBitShared.QueryId; +import org.apache.drill.exec.proto.UserBitShared.QueryInfo; import org.apache.drill.exec.proto.UserBitShared.QueryProfile; import org.apache.drill.exec.proto.UserBitShared.QueryResult.QueryState; import org.apache.drill.exec.proto.helper.QueryIdHelper; import org.apache.drill.exec.store.sys.EStore; import org.apache.drill.exec.store.sys.PStore; +import org.apache.drill.exec.store.sys.PStoreProvider; import org.apache.drill.exec.work.WorkManager; +import org.apache.drill.exec.work.foreman.Foreman; import org.apache.drill.exec.work.foreman.QueryStatus; import org.glassfish.jersey.server.mvc.Viewable; @@ -48,8 +54,7 @@ import com.google.common.collect.Lists; public class ProfileResources { static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(ProfileResources.class); - @Inject - WorkManager work; + @Inject WorkManager work; public static class ProfileInfo implements Comparable<ProfileInfo> { public static final SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); @@ -58,12 +63,20 @@ public class ProfileResources { private Date time; private String location; private String foreman; + private String query; + private String state; - public ProfileInfo(String queryId, long time, String foreman) { + public ProfileInfo(String queryId, long time, String foreman, String query, String state) { this.queryId = queryId; this.time = new Date(time); this.foreman = foreman; this.location = "http://localhost:8047/profile/" + queryId + ".json"; + this.query = query = query.substring(0, Math.min(query.length(), 150)); + this.state = state; + } + + public String getQuery(){ + return query; } public String getQueryId() { @@ -74,6 +87,11 @@ public class ProfileResources { return format.format(time); } + + public String getState() { + return state; + } + public String getLocation() { return location; } @@ -89,6 +107,10 @@ public class ProfileResources { } + private PStoreProvider provider(){ + return work.getContext().getPersistentStoreProvider(); + } + @XmlRootElement public class QProfiles { private List<ProfileInfo> runningQueries; @@ -112,36 +134,32 @@ public class ProfileResources { @Path("/profiles.json") @Produces(MediaType.APPLICATION_JSON) public QProfiles getProfilesJSON() { - PStore<QueryProfile> pStore = null; - EStore<QueryProfile> eStore = null; + PStore<QueryProfile> completed = null; + PStore<QueryInfo> running = null; try { - pStore = work.getContext().getPersistentStoreProvider().getPStore(QueryStatus.QUERY_PROFILE); - eStore = work.getContext().getPersistentStoreProvider().getEStore(QueryStatus.RUNNING_QUERY_PROFILE); + completed = provider().getStore(QueryStatus.QUERY_PROFILE); + running = provider().getStore(QueryStatus.RUNNING_QUERY_INFO); } catch (IOException e) { logger.debug("Failed to get profiles from persistent or ephemeral store."); return new QProfiles(new ArrayList<ProfileInfo>(), new ArrayList<ProfileInfo>()); } List<ProfileInfo> runningQueries = Lists.newArrayList(); - List<ProfileInfo> finishedQueries = Lists.newArrayList(); - for (Map.Entry<String, QueryProfile> entry : eStore) { - QueryProfile profile = entry.getValue(); - if (profile.getState() == QueryState.RUNNING || profile.getState() == QueryState.PENDING) { - runningQueries.add(new ProfileInfo(entry.getKey(), profile.getStart(), profile.getForeman().getAddress())); - } + for (Map.Entry<String, QueryInfo> entry : running) { + QueryInfo profile = entry.getValue(); + runningQueries.add(new ProfileInfo(entry.getKey(), profile.getStart(), profile.getForeman().getAddress(), profile.getQuery(), profile.getState().name())); } - for (Map.Entry<String, QueryProfile> entry : pStore) { + Collections.sort(runningQueries, Collections.reverseOrder()); + + + List<ProfileInfo> finishedQueries = Lists.newArrayList(); + for (Map.Entry<String, QueryProfile> entry : completed) { QueryProfile profile = entry.getValue(); - if (profile.getState() == QueryState.COMPLETED || profile.getState() == QueryState.FAILED || profile.getState() == QueryState.CANCELED) { - finishedQueries.add(new ProfileInfo(entry.getKey(), profile.getStart(), profile.getForeman().getAddress())); - } + finishedQueries.add(new ProfileInfo(entry.getKey(), profile.getStart(), profile.getForeman().getAddress(), profile.getQuery(), profile.getState().name())); } - Collections.sort(runningQueries, Collections.reverseOrder()); - Collections.sort(finishedQueries, Collections.reverseOrder()); - return new QProfiles(runningQueries, finishedQueries); } @@ -154,57 +172,37 @@ public class ProfileResources { } private QueryProfile getQueryProfile(String queryId) { - PStore<QueryProfile> pStore = null; - try { - pStore = work.getContext().getPersistentStoreProvider().getPStore(QueryStatus.QUERY_PROFILE); - } catch (IOException e) { - logger.debug("Failed to get profile for: " + queryId); - return QueryProfile.getDefaultInstance(); - } + QueryId id = QueryIdHelper.getQueryIdFromString(queryId); - QueryProfile profile = null; - - //TODO: we should handle the error case better. In stead of just returning a default profile instance, we should let user know of the error happened. - try { - // the complete profile is now stored as blob in the PStore - profile = pStore.getBlob(queryId); - } catch (Exception ex) { - logger.error("Fail to get full profile from PStore for query: {}. Error:{}", queryId, ex); - } - try { - if (profile == null) { - profile = pStore.get(queryId); // this is to load profile data from older builds. - } - } catch (Exception ex) { - logger.error("Fail to get compact profile from PStore for query: {}. Error:{}", queryId, ex); + // first check local running + Foreman f = work.getBee().getForemanForQueryId(id); + if(f != null){ + return f.getQueryStatus().getAsProfile(); } - return profile == null ? QueryProfile.getDefaultInstance() : profile; - - } + // then check remote running + try{ + PStore<QueryInfo> runningQueries = provider().getStore(QueryStatus.RUNNING_QUERY_INFO); + QueryInfo info = runningQueries.get(queryId); + return work.getContext().getController().getTunnel(info.getForeman()).requestQueryProfile(id).checkedGet(2, TimeUnit.SECONDS); + }catch(Exception e){ + logger.debug("Failure to find query as running profile.", e); + } - private QueryProfile getRunningQueryProfile(String queryId) { - EStore<QueryProfile> eStore = null; - try { - eStore = work.getContext().getPersistentStoreProvider().getEStore(QueryStatus.RUNNING_QUERY_PROFILE); - } catch (IOException e) { - logger.debug("Failed to get profile for: " + queryId); - return QueryProfile.getDefaultInstance(); + // then check blob store + try{ + PStore<QueryProfile> profiles = provider().getStore(QueryStatus.QUERY_PROFILE); + return profiles.get(queryId); + }catch(Exception e){ + logger.warn("Failure to load query profile for query {}", queryId, e); } - QueryProfile profile = eStore.get(queryId); + // TODO: Improve error messaging. + return QueryProfile.getDefaultInstance(); - if (profile != null) { - if (work.getBee().getForemanForQueryId(profile.getId()) != null) { - profile = work.getBee().getForemanForQueryId(profile.getId()).getQueryStatus().getAsProfile(true); - return profile; - } - } else { - logger.debug("profile from non-foreman"); - } - return profile == null ? QueryProfile.getDefaultInstance() : profile; } + @GET @Path("/profiles/{queryid}.json") @Produces(MediaType.APPLICATION_JSON) @@ -227,30 +225,36 @@ public class ProfileResources { } - @GET - @Path("/running_profiles/{queryid}") - @Produces(MediaType.TEXT_HTML) - public Viewable getRunningProfile(@PathParam("queryid") String queryId) { - ProfileWrapper wrapper = new ProfileWrapper(getRunningQueryProfile(queryId)); - - return new Viewable("/rest/profile/profile.ftl", wrapper); - - } @GET @Path("/profiles/cancel/{queryid}") @Produces(MediaType.TEXT_PLAIN) public String cancelQuery(@PathParam("queryid") String queryId) throws IOException { - EStore<QueryProfile> profiles = work.getContext().getPersistentStoreProvider().getEStore(QueryStatus.RUNNING_QUERY_PROFILE); - QueryProfile profile = profiles.get(queryId); - if (profile != null && (profile.getState() == QueryState.RUNNING || profile.getState() == QueryState.PENDING)) { - work.getUserWorker().cancelQuery(QueryIdHelper.getQueryIdFromString(queryId)); - return "Cancelled query " + queryId; + + QueryId id = QueryIdHelper.getQueryIdFromString(queryId); + + // first check local running + Foreman f = work.getBee().getForemanForQueryId(id); + if(f != null){ + f.cancel(); + return String.format("Cancelled query %s on locally running node.", queryId); } - if (profile == null) { - return "No such query: " + queryId; + + // then check remote running + try{ + PStore<QueryInfo> runningQueries = provider().getStore(QueryStatus.RUNNING_QUERY_INFO); + QueryInfo info = runningQueries.get(queryId); + Ack a = work.getContext().getController().getTunnel(info.getForeman()).requestCancelQuery(id).checkedGet(2, TimeUnit.SECONDS); + if(a.getOk()){ + return String.format("Query %s canceled on node %s.", queryId, info.getForeman().getAddress()); + }else{ + return String.format("Attempted to cancel query %s on %s but the query is no longer active on that node.", queryId, info.getForeman().getAddress()); + } + }catch(Exception e){ + logger.debug("Failure to find query as running profile.", e); + return String.format("Failure attempting to cancel query %s. Unable to find information about where query is actively running.", queryId); } - return "Query " + queryId + " not running"; + } } http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/f2180b8f/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/WebResourceServer.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/WebResourceServer.java b/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/WebResourceServer.java deleted file mode 100644 index 249cb8c..0000000 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/WebResourceServer.java +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.drill.exec.server.rest; - -import java.io.BufferedInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.URLConnection; - -import javax.inject.Inject; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; - -import org.apache.commons.io.IOUtils; -import org.apache.drill.exec.work.WorkManager; - -@Path("/www") -public class WebResourceServer { - static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(WebResourceServer.class); - - @Inject WorkManager work; - - - @GET - @Path("/{path}") - @Produces(MediaType.TEXT_PLAIN) - public Response getResource(@PathParam("path") String path) throws IOException { - try { - String s = "rest/www/" + path; - ClassLoader cl = Thread.currentThread().getContextClassLoader(); - InputStream is = new BufferedInputStream(cl.getResource(s).openStream()); - - String mime = "text/plain"; - if (s.endsWith(".js")) { - mime = "text/javascript"; - } else if (s.endsWith(".css")) { - mime = "text/css"; - } else { - mime = URLConnection.guessContentTypeFromStream(is); - } - - byte[] d = IOUtils.toByteArray(is); - return Response.ok(d).type(mime).build(); - } catch (Exception e) { - e.printStackTrace(); - e.printStackTrace(System.out); - } - - return Response.noContent().status(Status.NOT_FOUND).build(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/f2180b8f/exec/java-exec/src/main/resources/rest/generic.ftl ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/resources/rest/generic.ftl b/exec/java-exec/src/main/resources/rest/generic.ftl index 0543755..1c229b6 100644 --- a/exec/java-exec/src/main/resources/rest/generic.ftl +++ b/exec/java-exec/src/main/resources/rest/generic.ftl @@ -23,17 +23,17 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>Apache Drill</title> - <link rel="shortcut icon" href="/www/drill.ico"> + <link rel="shortcut icon" href="/static/img/drill.ico"> - <link href="http://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet"> + <link href="/static/css/bootstrap.min.css" rel="stylesheet"> - <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> - <script src="http://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script> + <script src="/static/js/jquery.min.js"></script> + <script src="/static/js/bootstrap.min.js"></script> <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries --> <!--[if lt IE 9]> - <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script> - <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script> + <script src="/static/js/html5shiv.js"></script> + <script src="/static/js/1.4.2/respond.min.js"></script> <![endif]--> <@page_head/> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/f2180b8f/exec/java-exec/src/main/resources/rest/profile/list.ftl ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/resources/rest/profile/list.ftl b/exec/java-exec/src/main/resources/rest/profile/list.ftl index ef6b66d..921e52f 100644 --- a/exec/java-exec/src/main/resources/rest/profile/list.ftl +++ b/exec/java-exec/src/main/resources/rest/profile/list.ftl @@ -23,27 +23,37 @@ <table class="table table-hover"> <thead> <td>Time</td> - <td>Query Id</td> + <!-- <td>Query Id</td> --> + <td>Query</td> + <td>State</td> <td>Foreman</td> </thead> <tbody> <#list model.getRunningQueries() as query> <tr> <td>${query.getTime()}</td> + <!-- <td> - <a href="/running_profiles/${query.getQueryId()}"> + <a href="/profiles/${query.getQueryId()}"> <div style="height:100%;width:100%"> ${query.getQueryId()} </div> </a> </td> + --> + <td> + <a href="/profiles/${query.getQueryId()}"> + <div style="height:100%;width:100%;white-space:pre-line">${query.getQuery()}</div> + </a> + </td> + <td> + <div style="height:100%;width:100%">${query.getState()}</div> <td> - <a href="http://${query.getForeman()}:8047/running_profiles/${query.getQueryId()}" target="_blank"> <div style="height:100%;width:100%"> ${query.getForeman()} </div> - </a> </td> + </tr> </#list> </tbody> @@ -62,13 +72,16 @@ <table class="table table-hover"> <thead> <td>Time</td> - <td>Query Id</td> + <!-- <td>Query Id</td> --> + <td>Query</td> + <td>State</td> <td>Foreman</td> </thead> <tbody> <#list model.getFinishedQueries() as query> <tr> <td>${query.getTime()}</td> + <!-- <td> <a href="/profiles/${query.getQueryId()}"> <div style="height:100%;width:100%"> @@ -76,12 +89,19 @@ </div> </a> </td> + --> + <td> + <a href="/profiles/${query.getQueryId()}"> + <div style="height:100%;width:100%;white-space:pre-line">${query.getQuery()}</div> + </a> + </td> + <td> + <div style="height:100%;width:100%">${query.getState()}</div> + </td> <td> - <a href="http://${query.getForeman()}:8047/profiles/${query.getQueryId()}" target="_blank"> <div style="height:100%;width:100%"> ${query.getForeman()} </div> - </a> </td> </tr> </#list> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/f2180b8f/exec/java-exec/src/main/resources/rest/profile/profile.ftl ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/resources/rest/profile/profile.ftl b/exec/java-exec/src/main/resources/rest/profile/profile.ftl index 5d3e73f..bd4ea33 100644 --- a/exec/java-exec/src/main/resources/rest/profile/profile.ftl +++ b/exec/java-exec/src/main/resources/rest/profile/profile.ftl @@ -11,9 +11,9 @@ <#include "*/generic.ftl"> <#macro page_head> -<script src="http://d3js.org/d3.v3.js"></script> -<script src="http://cpettitt.github.io/project/dagre-d3/v0.2.6/dagre-d3.js"></script> -<script src="/www/graph.js"></script> +<script src="/static/js/d3.v3.js"></script> +<script src="/static/js/dagre-d3.min.js"></script> +<script src="/static/js/graph.js"></script> <script> var globalconfig = { "queryid" : "${model.getQueryId()}",
