org.elasticsearch.index.shard.InternalIndexingStats Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of elasticsearch Show documentation
Show all versions of elasticsearch Show documentation
Elasticsearch subproject :server
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/
package org.elasticsearch.index.shard;
import org.elasticsearch.common.metrics.CounterMetric;
import org.elasticsearch.common.metrics.MeanMetric;
import org.elasticsearch.index.engine.Engine;
import java.util.concurrent.TimeUnit;
/**
* Internal class that maintains relevant indexing statistics / metrics.
* @see IndexShard
*/
final class InternalIndexingStats implements IndexingOperationListener {
private final StatsHolder totalStats = new StatsHolder();
/**
* Returns the stats, including type specific stats. If the types are null/0 length, then nothing
* is returned for them. If they are set, then only types provided will be returned, or
* {@code _all} for all types.
*/
IndexingStats stats(boolean isThrottled, long currentThrottleInMillis) {
IndexingStats.Stats total = totalStats.stats(isThrottled, currentThrottleInMillis);
return new IndexingStats(total);
}
@Override
public Engine.Index preIndex(ShardId shardId, Engine.Index operation) {
if (operation.origin().isRecovery() == false) {
totalStats.indexCurrent.inc();
}
return operation;
}
@Override
public void postIndex(ShardId shardId, Engine.Index index, Engine.IndexResult result) {
switch (result.getResultType()) {
case SUCCESS:
if (index.origin().isRecovery() == false) {
long took = result.getTook();
totalStats.indexMetric.inc(took);
totalStats.indexCurrent.dec();
}
break;
case FAILURE:
postIndex(shardId, index, result.getFailure());
break;
default:
throw new IllegalArgumentException("unknown result type: " + result.getResultType());
}
}
@Override
public void postIndex(ShardId shardId, Engine.Index index, Exception ex) {
if (index.origin().isRecovery() == false) {
totalStats.indexCurrent.dec();
totalStats.indexFailed.inc();
}
}
@Override
public Engine.Delete preDelete(ShardId shardId, Engine.Delete delete) {
if (delete.origin().isRecovery() == false) {
totalStats.deleteCurrent.inc();
}
return delete;
}
@Override
public void postDelete(ShardId shardId, Engine.Delete delete, Engine.DeleteResult result) {
switch (result.getResultType()) {
case SUCCESS:
if (delete.origin().isRecovery() == false) {
long took = result.getTook();
totalStats.deleteMetric.inc(took);
totalStats.deleteCurrent.dec();
}
break;
case FAILURE:
postDelete(shardId, delete, result.getFailure());
break;
default:
throw new IllegalArgumentException("unknown result type: " + result.getResultType());
}
}
@Override
public void postDelete(ShardId shardId, Engine.Delete delete, Exception ex) {
if (delete.origin().isRecovery() == false) {
totalStats.deleteCurrent.dec();
}
}
void noopUpdate() {
totalStats.noopUpdates.inc();
}
static class StatsHolder {
private final MeanMetric indexMetric = new MeanMetric();
private final MeanMetric deleteMetric = new MeanMetric();
private final CounterMetric indexCurrent = new CounterMetric();
private final CounterMetric indexFailed = new CounterMetric();
private final CounterMetric deleteCurrent = new CounterMetric();
private final CounterMetric noopUpdates = new CounterMetric();
IndexingStats.Stats stats(boolean isThrottled, long currentThrottleMillis) {
return new IndexingStats.Stats(
indexMetric.count(),
TimeUnit.NANOSECONDS.toMillis(indexMetric.sum()),
indexCurrent.count(),
indexFailed.count(),
deleteMetric.count(),
TimeUnit.NANOSECONDS.toMillis(deleteMetric.sum()),
deleteCurrent.count(),
noopUpdates.count(),
isThrottled,
TimeUnit.MILLISECONDS.toMillis(currentThrottleMillis)
);
}
}
}