com.datasift.dropwizard.hbase.InstrumentedHBaseClient Maven / Gradle / Ivy
Show all versions of dropwizard-extra-hbase Show documentation
package com.datasift.dropwizard.hbase;
import com.datasift.dropwizard.hbase.metrics.HBaseInstrumentation;
import com.datasift.dropwizard.hbase.metrics.ScannerInstrumentation;
import com.datasift.dropwizard.hbase.scanner.InstrumentedRowScanner;
import com.datasift.dropwizard.hbase.scanner.RowScanner;
import com.datasift.dropwizard.hbase.util.TimerStoppingCallback;
import com.stumbleupon.async.Deferred;
import com.yammer.dropwizard.util.Duration;
import com.yammer.dropwizard.util.Size;
import com.yammer.metrics.Metrics;
import com.yammer.metrics.core.Metric;
import com.yammer.metrics.core.MetricsRegistry;
import com.yammer.metrics.core.Timer;
import com.yammer.metrics.core.TimerContext;
import org.hbase.async.*;
import java.util.ArrayList;
/**
* An {@link HBaseClient} that is instrumented with {@link Metric}s.
*
* For each asynchronous request method, a {@link Timer} tracks the time taken for the request.
*
* This implementation proxies all requests through an underlying {@link HBaseClient}, provided to
* the {@link this#InstrumentedHBaseClient(HBaseClient) constructor}; it merely layers
* instrumentation on top of the underlying {@link HBaseClient}.
*
* @see HBaseInstrumentation
*/
public class InstrumentedHBaseClient implements HBaseClient {
/**
* The underlying {@link HBaseClient} to dispatch requests.
*/
private final HBaseClient client;
/**
* The instrumentation for this {@link HBaseClient}.
*/
private final HBaseInstrumentation metrics;
/**
* Creates a new {@link InstrumentedHBaseClient} for the given underlying client.
*
* The {@link Metrics#defaultRegistry() default} {@link MetricsRegistry} will be used to
* register the {@link Metric}s.
*
* @param client the underlying {@link HBaseClient} implementation to dispatch requests.
*/
public InstrumentedHBaseClient(final HBaseClient client, final String name) {
this(client, Metrics.defaultRegistry(), name);
}
/**
* Creates a new {@link InstrumentedHBaseClient} for the given underlying client.
*
* Instrumentation will be registered with the given {@link MetricsRegistry}.
*
* A new {@link HBaseInstrumentation} container will be created for this {@link HBaseClient}
* with the given {@link MetricsRegistry}.
*
* @param client the underlying {@link HBaseClient} implementation to dispatch requests.
* @param registry the {@link MetricsRegistry} to register {@link Metric}s with.
* @param name the name of the client to register metrics under.
*/
public InstrumentedHBaseClient(final HBaseClient client,
final MetricsRegistry registry,
final String name) {
this(client, new HBaseInstrumentation(client, registry, name));
}
/**
* Creates a new {@link InstrumentedHBaseClient} for the given underlying client.
*
* Instrumentation will be contained by the given {@link HBaseInstrumentation} instance.
*
* Note: this is only really useful for sharing instrumentation between multiple {@link
* HBaseClient} instances, which only really makes sense for instances configured for the same
* cluster, but with different client-side settings. Use with caution!!
*
* @param client the underlying {@link HBaseClient} implementation to dispatch requests.
* @param metrics the {@link HBaseInstrumentation} containing the {@link Metric}s to use.
*/
public InstrumentedHBaseClient(final HBaseClient client, final HBaseInstrumentation metrics) {
this.client = client;
this.metrics = metrics;
}
/**
* Get the maximum time for which edits may be buffered before being flushed.
*
* @return the maximum time for which edits may be buffered.
*
* @see HBaseClient#getFlushInterval()
*/
public Duration getFlushInterval() {
return client.getFlushInterval();
}
/**
* Get the capacity of the increment buffer.
*
* @return the capacity of the increment buffer.
*
* @see HBaseClient#getIncrementBufferSize()
*/
public Size getIncrementBufferSize() {
return client.getIncrementBufferSize();
}
/**
* Sets the maximum time for which edits may be buffered before being flushed.
*
* @param flushInterval the maximum time for which edits may be buffered.
*
* @return the previous flush interval.
*
* @see HBaseClient#setFlushInterval(Duration)
*/
public Duration setFlushInterval(final Duration flushInterval) {
return client.setFlushInterval(flushInterval);
}
/**
* Sets the capacity of the increment buffer.
*
* @param incrementBufferSize the capacity of the increment buffer.
*
* @return the previous increment buffer capacity.
*
* @see HBaseClient#setIncrementBufferSize(Size)
*/
public Size setIncrementBufferSize(final Size incrementBufferSize) {
return client.setIncrementBufferSize(incrementBufferSize);
}
/**
* Atomically creates a cell if, and only if, it doesn't already exist.
*
* @param edit the new cell to create.
*
* @return true if the cell was created, false if the cell already exists.
*
* @see HBaseClient#create(PutRequest)
*/
public Deferred create(final PutRequest edit) {
final TimerContext ctx = metrics.getCreates().time();
return client.create(edit).addBoth(new TimerStoppingCallback(ctx));
}
/**
* Buffer a durable increment for coalescing.
*
* @param request the increment to buffer.
*
* @return the new value of the cell, after the increment.
*
* @see HBaseClient#bufferIncrement(AtomicIncrementRequest)
*/
public Deferred bufferIncrement(final AtomicIncrementRequest request) {
final TimerContext ctx = metrics.getIncrements().time();
return client.bufferIncrement(request).addBoth(new TimerStoppingCallback(ctx));
}
/**
* Atomically and durably increment a cell value.
*
* @param request the increment to make.
*
* @return the new value of the cell, after the increment.
*
* @see HBaseClient#increment(AtomicIncrementRequest)
*/
public Deferred increment(final AtomicIncrementRequest request) {
final TimerContext ctx = metrics.getIncrements().time();
return client.increment(request).addBoth(new TimerStoppingCallback(ctx));
}
/**
* Atomically increment a cell value, with optional durability.
*
* @param request the increment to make.
* @param durable whether to guarantee this increment succeeded durably.
*
* @return the new value of the cell, after the increment.
*
* @see HBaseClient#increment(AtomicIncrementRequest, Boolean)
*/
public Deferred increment(final AtomicIncrementRequest request, final Boolean durable) {
final TimerContext ctx = metrics.getIncrements().time();
return client.increment(request, durable).addBoth(new TimerStoppingCallback(ctx));
}
/**
* Atomically compares and sets (CAS) a single cell
*
* @param edit the cell to set.
* @param expected the expected current value.
*
* @return true if the expectation was met and the cell was set; otherwise, false.
*
* @see HBaseClient#compareAndSet(PutRequest, byte[])
*/
public Deferred compareAndSet(final PutRequest edit, final byte[] expected) {
final TimerContext ctx = metrics.getCompareAndSets().time();
return client.compareAndSet(edit, expected)
.addBoth(new TimerStoppingCallback(ctx));
}
/**
* Atomically compares and sets (CAS) a single cell.
*
* @param edit the cell to set.
* @param expected the expected current value.
*
* @return true if the expectation was met and the cell was set; otherwise, false.
*
* @see HBaseClient#compareAndSet(PutRequest, String)
*/
public Deferred compareAndSet(final PutRequest edit, final String expected) {
final TimerContext ctx = metrics.getCompareAndSets().time();
return client.compareAndSet(edit, expected)
.addBoth(new TimerStoppingCallback(ctx));
}
/**
* Deletes the specified cells.
*
* @param request the cell(s) to delete.
*
* @return a {@link Deferred} indicating when the deletion completes.
*
* @see HBaseClient#delete(DeleteRequest)
*/
public Deferred