From 0f96a099398c3807cde1122a4d291b46b9ecca7f Mon Sep 17 00:00:00 2001 From: fjy Date: Tue, 30 Sep 2014 13:36:01 -0700 Subject: [PATCH] use multi-val dims for metrics --- .../groupby/GroupByQueryQueryToolChest.java | 16 +++++++++-- .../SegmentMetadataQueryQueryToolChest.java | 22 +++++++++++---- .../search/SearchQueryQueryToolChest.java | 23 +++++++++++----- .../select/SelectQueryQueryToolChest.java | 27 +++++++++++++------ .../TimeseriesQueryQueryToolChest.java | 17 +++++++++--- .../query/topn/TopNQueryQueryToolChest.java | 16 ++++++++--- .../server/AsyncQueryForwardingServlet.java | 11 +++++++- .../java/io/druid/server/QueryResource.java | 17 ++++++++---- 8 files changed, 115 insertions(+), 34 deletions(-) diff --git a/processing/src/main/java/io/druid/query/groupby/GroupByQueryQueryToolChest.java b/processing/src/main/java/io/druid/query/groupby/GroupByQueryQueryToolChest.java index e2ddc18da5c..d27e0627085 100644 --- a/processing/src/main/java/io/druid/query/groupby/GroupByQueryQueryToolChest.java +++ b/processing/src/main/java/io/druid/query/groupby/GroupByQueryQueryToolChest.java @@ -218,8 +218,20 @@ public class GroupByQueryQueryToolChest extends QueryToolChest() + { + @Override + public String apply(Interval input) + { + return input.toString(); + } + } + ).toArray(new String[query.getIntervals().size()]) + ) .setUser6(String.valueOf(query.hasFilters())) .setUser7(String.format("%,d aggs", query.getAggregatorSpecs().size())) .setUser9(Minutes.minutes(numMinutes).toString()); diff --git a/processing/src/main/java/io/druid/query/metadata/SegmentMetadataQueryQueryToolChest.java b/processing/src/main/java/io/druid/query/metadata/SegmentMetadataQueryQueryToolChest.java index 21f02145988..d502551361c 100644 --- a/processing/src/main/java/io/druid/query/metadata/SegmentMetadataQueryQueryToolChest.java +++ b/processing/src/main/java/io/druid/query/metadata/SegmentMetadataQueryQueryToolChest.java @@ -22,8 +22,8 @@ package io.druid.query.metadata; import com.fasterxml.jackson.core.type.TypeReference; import com.google.common.base.Function; import com.google.common.base.Functions; -import com.google.common.base.Joiner; import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Ordering; import com.google.common.collect.Sets; @@ -166,7 +166,19 @@ public class SegmentMetadataQueryQueryToolChest extends QueryToolChest() + { + @Override + public String apply(Interval input) + { + return input.toString(); + } + } + ).toArray(new String[query.getIntervals().size()]) + ) .setUser6(String.valueOf(query.hasFilters())) .setUser9(Minutes.minutes(numMinutes).toString()); } @@ -195,9 +207,9 @@ public class SegmentMetadataQueryQueryToolChest extends QueryToolChest, SearchQuery> { private static final byte SEARCH_QUERY = 0x2; - private static final Joiner COMMA_JOIN = Joiner.on(","); private static final TypeReference> TYPE_REFERENCE = new TypeReference>() { }; @@ -130,9 +127,21 @@ public class SearchQueryQueryToolChest extends QueryToolChest() + { + @Override + public String apply(Interval input) + { + return input.toString(); + } + } + ).toArray(new String[query.getIntervals().size()]) + ) .setUser6(String.valueOf(query.hasFilters())) .setUser9(Minutes.minutes(numMinutes).toString()); } @@ -181,7 +190,7 @@ public class SearchQueryQueryToolChest extends QueryToolChest, SelectQuery> { private static final byte SELECT_QUERY = 0x13; - private static final Joiner COMMA_JOIN = Joiner.on(","); private static final TypeReference OBJECT_TYPE_REFERENCE = new TypeReference() { @@ -133,8 +132,20 @@ public class SelectQueryQueryToolChest extends QueryToolChest() + { + @Override + public String apply(Interval input) + { + return input.toString(); + } + } + ).toArray(new String[query.getIntervals().size()]) + ) .setUser6(String.valueOf(query.hasFilters())) .setUser9(Minutes.minutes(numMinutes).toString()); } @@ -261,13 +272,13 @@ public class SelectQueryQueryToolChest extends QueryToolChest) jsonMapper.convertValue( resultIter.next(), new TypeReference>() - { - } + { + } ), (List) jsonMapper.convertValue( resultIter.next(), new TypeReference>() - { - } + { + } ) ) ); diff --git a/processing/src/main/java/io/druid/query/timeseries/TimeseriesQueryQueryToolChest.java b/processing/src/main/java/io/druid/query/timeseries/TimeseriesQueryQueryToolChest.java index 3ed7e84149d..b5bced221fd 100644 --- a/processing/src/main/java/io/druid/query/timeseries/TimeseriesQueryQueryToolChest.java +++ b/processing/src/main/java/io/druid/query/timeseries/TimeseriesQueryQueryToolChest.java @@ -62,7 +62,6 @@ import java.util.Map; public class TimeseriesQueryQueryToolChest extends QueryToolChest, TimeseriesQuery> { private static final byte TIMESERIES_QUERY = 0x0; - private static final Joiner COMMA_JOIN = Joiner.on(","); private static final TypeReference OBJECT_TYPE_REFERENCE = new TypeReference() { @@ -131,8 +130,20 @@ public class TimeseriesQueryQueryToolChest extends QueryToolChest() + { + @Override + public String apply(Interval input) + { + return input.toString(); + } + } + ).toArray(new String[query.getIntervals().size()]) + ) .setUser6(String.valueOf(query.hasFilters())) .setUser7(String.format("%,d aggs", query.getAggregatorSpecs().size())) .setUser9(Minutes.minutes(numMinutes).toString()); diff --git a/processing/src/main/java/io/druid/query/topn/TopNQueryQueryToolChest.java b/processing/src/main/java/io/druid/query/topn/TopNQueryQueryToolChest.java index cc00ea3292e..2129c6a0bc6 100644 --- a/processing/src/main/java/io/druid/query/topn/TopNQueryQueryToolChest.java +++ b/processing/src/main/java/io/druid/query/topn/TopNQueryQueryToolChest.java @@ -21,7 +21,6 @@ package io.druid.query.topn; import com.fasterxml.jackson.core.type.TypeReference; import com.google.common.base.Function; -import com.google.common.base.Joiner; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -65,7 +64,6 @@ import java.util.Map; public class TopNQueryQueryToolChest extends QueryToolChest, TopNQuery> { private static final byte TOPN_QUERY = 0x1; - private static final Joiner COMMA_JOIN = Joiner.on(","); private static final TypeReference> TYPE_REFERENCE = new TypeReference>() { }; @@ -147,7 +145,19 @@ public class TopNQueryQueryToolChest extends QueryToolChest() + { + @Override + public String apply(Interval input) + { + return input.toString(); + } + } + ).toArray(new String[query.getIntervals().size()]) + ) .setUser6(String.valueOf(query.hasFilters())) .setUser7(String.format("%,d aggs", query.getAggregatorSpecs().size())) .setUser9(Minutes.minutes(numMinutes).toString()); diff --git a/server/src/main/java/io/druid/server/AsyncQueryForwardingServlet.java b/server/src/main/java/io/druid/server/AsyncQueryForwardingServlet.java index 624d52e1b36..0efb4d62ef4 100644 --- a/server/src/main/java/io/druid/server/AsyncQueryForwardingServlet.java +++ b/server/src/main/java/io/druid/server/AsyncQueryForwardingServlet.java @@ -20,7 +20,9 @@ package io.druid.server; import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.base.Function; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Lists; import com.metamx.emitter.EmittingLogger; import com.metamx.emitter.service.ServiceEmitter; import com.metamx.emitter.service.ServiceMetricEvent; @@ -41,6 +43,7 @@ import org.eclipse.jetty.http.HttpMethod; import org.eclipse.jetty.http.HttpVersion; import org.eclipse.jetty.proxy.AsyncProxyServlet; import org.joda.time.DateTime; +import org.joda.time.Interval; import javax.servlet.AsyncContext; import javax.servlet.ServletException; @@ -259,6 +262,12 @@ public class AsyncQueryForwardingServlet extends AsyncProxyServlet public void onComplete(Result result) { final long requestTime = System.currentTimeMillis() - start; + // toArray() will give compilation error + final String[] intervals = new String[query.getIntervals().size()]; + int i = 0; + for (Object interval : query.getIntervals()) { + intervals[i] = interval.toString(); + } try { emitter.emit( new ServiceMetricEvent.Builder() @@ -271,7 +280,7 @@ public class AsyncQueryForwardingServlet extends AsyncProxyServlet ) ) .setUser4(query.getType()) - .setUser5(DataSourceUtil.COMMA_JOIN.join(query.getIntervals())) + .setUser5(intervals) .setUser6(String.valueOf(query.hasFilters())) .setUser7(req.getRemoteAddr()) .setUser8(query.getId()) diff --git a/server/src/main/java/io/druid/server/QueryResource.java b/server/src/main/java/io/druid/server/QueryResource.java index 7cef7893280..001ef43295e 100644 --- a/server/src/main/java/io/druid/server/QueryResource.java +++ b/server/src/main/java/io/druid/server/QueryResource.java @@ -23,9 +23,10 @@ import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectWriter; import com.google.common.base.Charsets; -import com.google.common.base.Joiner; +import com.google.common.base.Function; import com.google.common.base.Throwables; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Lists; import com.google.common.io.ByteStreams; import com.google.inject.Inject; import com.metamx.common.guava.Sequence; @@ -37,13 +38,13 @@ import com.metamx.emitter.service.ServiceEmitter; import com.metamx.emitter.service.ServiceMetricEvent; import io.druid.guice.annotations.Json; import io.druid.guice.annotations.Smile; -import io.druid.query.DataSourceUtil; import io.druid.query.Query; import io.druid.query.QueryInterruptedException; import io.druid.query.QuerySegmentWalker; import io.druid.server.initialization.ServerConfig; import io.druid.server.log.RequestLogger; import org.joda.time.DateTime; +import org.joda.time.Interval; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -59,6 +60,7 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.StreamingOutput; import java.io.IOException; import java.io.OutputStream; +import java.util.List; import java.util.UUID; /** @@ -67,7 +69,6 @@ import java.util.UUID; public class QueryResource { private static final EmittingLogger log = new EmittingLogger(QueryResource.class); - private static final Joiner COMMA_JOIN = Joiner.on(","); public static final String APPLICATION_SMILE = "application/smile"; public static final String APPLICATION_JSON = "application/json"; @@ -175,9 +176,15 @@ public class QueryResource try { long requestTime = System.currentTimeMillis() - start; + // toArray() will give compilation error + final String[] intervals = new String[query.getIntervals().size()]; + int i = 0; + for (Object interval : query.getIntervals()) { + intervals[i] = interval.toString(); + } emitter.emit( new ServiceMetricEvent.Builder() - .setUser2(DataSourceUtil.getMetricName(query.getDataSource())) + .setUser2(query.getDataSource().getNames().toArray(new String[query.getDataSource().getNames().size()])) .setUser3( jsonMapper.writeValueAsString( query.getContext() == null @@ -186,7 +193,7 @@ public class QueryResource ) ) .setUser4(query.getType()) - .setUser5(COMMA_JOIN.join(query.getIntervals())) + .setUser5(intervals) .setUser6(String.valueOf(query.hasFilters())) .setUser7(req.getRemoteAddr()) .setUser8(queryId)