Merge pull request #659 from metamx/fix-metrics

Separate query metrics into scan/time and query/time
This commit is contained in:
xvrl 2014-08-05 17:02:40 -07:00
commit eadbcd1b1d
2 changed files with 58 additions and 29 deletions

View File

@ -33,10 +33,13 @@ import java.io.IOException;
*/ */
public class MetricsEmittingQueryRunner<T> implements QueryRunner<T> public class MetricsEmittingQueryRunner<T> implements QueryRunner<T>
{ {
private static final String DEFAULT_METRIC_NAME = "query/time";
private final ServiceEmitter emitter; private final ServiceEmitter emitter;
private final Function<Query<T>, ServiceMetricEvent.Builder> builderFn; private final Function<Query<T>, ServiceMetricEvent.Builder> builderFn;
private final QueryRunner<T> queryRunner; private final QueryRunner<T> queryRunner;
private final long creationTime; private final long creationTime;
private final String metricName;
public MetricsEmittingQueryRunner( public MetricsEmittingQueryRunner(
ServiceEmitter emitter, ServiceEmitter emitter,
@ -44,25 +47,38 @@ public class MetricsEmittingQueryRunner<T> implements QueryRunner<T>
QueryRunner<T> queryRunner QueryRunner<T> queryRunner
) )
{ {
this(emitter, builderFn, queryRunner, -1); this(emitter, builderFn, queryRunner, DEFAULT_METRIC_NAME);
} }
public MetricsEmittingQueryRunner( public MetricsEmittingQueryRunner(
ServiceEmitter emitter, ServiceEmitter emitter,
Function<Query<T>, ServiceMetricEvent.Builder> builderFn, Function<Query<T>, ServiceMetricEvent.Builder> builderFn,
QueryRunner<T> queryRunner, QueryRunner<T> queryRunner,
long creationTime long creationTime,
String metricName
) )
{ {
this.emitter = emitter; this.emitter = emitter;
this.builderFn = builderFn; this.builderFn = builderFn;
this.queryRunner = queryRunner; this.queryRunner = queryRunner;
this.creationTime = creationTime; this.creationTime = creationTime;
this.metricName = metricName;
} }
public MetricsEmittingQueryRunner(
ServiceEmitter emitter,
Function<Query<T>, ServiceMetricEvent.Builder> builderFn,
QueryRunner<T> queryRunner,
String metricName
)
{
this(emitter, builderFn, queryRunner, -1, metricName);
}
public MetricsEmittingQueryRunner<T> withWaitMeasuredFromNow() public MetricsEmittingQueryRunner<T> withWaitMeasuredFromNow()
{ {
return new MetricsEmittingQueryRunner<T>(emitter, builderFn, queryRunner, System.currentTimeMillis()); return new MetricsEmittingQueryRunner<T>(emitter, builderFn, queryRunner, System.currentTimeMillis(), metricName);
} }
@Override @Override
@ -97,9 +113,9 @@ public class MetricsEmittingQueryRunner<T> implements QueryRunner<T>
finally { finally {
long timeTaken = System.currentTimeMillis() - startTime; long timeTaken = System.currentTimeMillis() - startTime;
emitter.emit(builder.build("query/time", timeTaken)); emitter.emit(builder.build(metricName, timeTaken));
if(creationTime > 0) { if (creationTime > 0) {
emitter.emit(builder.build("query/wait", startTime - creationTime)); emitter.emit(builder.build("query/wait", startTime - creationTime));
} }
} }
@ -173,12 +189,13 @@ public class MetricsEmittingQueryRunner<T> implements QueryRunner<T>
} }
long timeTaken = System.currentTimeMillis() - startTime; long timeTaken = System.currentTimeMillis() - startTime;
emitter.emit(builder.build("query/time", timeTaken)); emitter.emit(builder.build(metricName, timeTaken));
if (creationTime > 0) { if (creationTime > 0) {
emitter.emit(builder.build("query/wait", startTime - creationTime)); emitter.emit(builder.build("query/wait", startTime - creationTime));
} }
} finally { }
finally {
yielder.close(); yielder.close();
} }
} }

View File

@ -390,30 +390,42 @@ public class ServerManager implements QuerySegmentWalker
{ {
SpecificSegmentSpec segmentSpec = new SpecificSegmentSpec(segmentDescriptor); SpecificSegmentSpec segmentSpec = new SpecificSegmentSpec(segmentDescriptor);
return new SpecificSegmentQueryRunner<T>( return new SpecificSegmentQueryRunner<T>(
new BySegmentQueryRunner<T>( new MetricsEmittingQueryRunner<T>(
adapter.getIdentifier(), emitter,
adapter.getDataInterval().getStart(), new Function<Query<T>, ServiceMetricEvent.Builder>()
new CachingQueryRunner<T>( {
@Override
public ServiceMetricEvent.Builder apply(@Nullable final Query<T> input)
{
return toolChest.makeMetricBuilder(input);
}
},
new BySegmentQueryRunner<T>(
adapter.getIdentifier(), adapter.getIdentifier(),
segmentDescriptor, adapter.getDataInterval().getStart(),
objectMapper, new CachingQueryRunner<T>(
cache, adapter.getIdentifier(),
toolChest, segmentDescriptor,
new MetricsEmittingQueryRunner<T>( objectMapper,
emitter, cache,
new Function<Query<T>, ServiceMetricEvent.Builder>() toolChest,
{ new MetricsEmittingQueryRunner<T>(
@Override emitter,
public ServiceMetricEvent.Builder apply(@Nullable final Query<T> input) new Function<Query<T>, ServiceMetricEvent.Builder>()
{ {
return toolChest.makeMetricBuilder(input); @Override
} public ServiceMetricEvent.Builder apply(@Nullable final Query<T> input)
}, {
new ReferenceCountingSegmentQueryRunner<T>(factory, adapter) return toolChest.makeMetricBuilder(input);
).withWaitMeasuredFromNow(), }
cacheConfig },
new ReferenceCountingSegmentQueryRunner<T>(factory, adapter),
"scan/time"
).withWaitMeasuredFromNow(),
cacheConfig
)
) )
), ).withWaitMeasuredFromNow(),
segmentSpec segmentSpec
); );
} }