ClientConfig
package flipkart.dsp.santa.client;
import lombok.Data;
import lombok.Getter;
/**
* Created by dhruv.chandhok on 01/06/15.
*/
@Data
public class ClientConfig
{
public ClientConfig(String name)
{
clientName=name;
}
@Getter
private String clientName;
public String getClientName()
{
return clientName;
}
}
DecoratorListener
package flipkart.dsp.santa.client;
import com.yammer.metrics.core.TimerContext;
import org.elasticsearch.action.ActionListener;
/**
* Created by dhruv.chandhok on 09/06/15.
*/
public class DecorateListner
{
static <V> ActionListener<V> decorateWithTimerStop(ActionListener<V> listener, TimerContext timerContext)
{
ActionListener<V> wrapperListener = new ActionListener<V>() //decorated listner
{
@Override
public void onResponse(V getFields)
{
timerContext.stop();
listener.onResponse(getFields);
}
@Override
public void onFailure(Throwable e)
{
timerContext.stop();
listener.onFailure(e);
}
};
return wrapperListener;
}
}
MetricsUtils
package flipkart.dsp.santa.client;
import com.yammer.metrics.core.Timer;
import com.yammer.metrics.core.TimerContext;
/**
* Created by dhruv.chandhok on 09/06/15.
*/
public class MetricsUtils
{
//Asynchronus Lambda Functions & Interfaces
static interface EnclosureCallback<V>
{
void call(TimerContext timerContext);
}
static <V> void measureAsync(Timer timer, EnclosureCallback<V> enclosureCallback)
{
TimerContext timerContext = timer.time();
enclosureCallback.call(timerContext);
}
//
// synchronus Timer & interfaces
static interface Enclosure<V>
{
V call();
}
static <V> V measure(Timer timer, Enclosure<V> callable)
{
TimerContext timerContext = timer.time();
try
{
return callable.call();
}
finally
{
timerContext.stop();
}
}
//
}
SantaESNodeClient
package flipkart.dsp.santa.client;
import com.yammer.metrics.Metrics;
import com.yammer.metrics.core.MetricName;
import org.elasticsearch.action.*;
import org.elasticsearch.action.support.TransportAction;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.node.NodeAdminClient;
import org.elasticsearch.client.node.NodeClient;
import org.elasticsearch.client.support.Headers;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.threadpool.ThreadPool;
import com.yammer.metrics.core.Timer;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import static flipkart.dsp.santa.client.DecorateListner.decorateWithTimerStop;
import static flipkart.dsp.santa.client.MetricsUtils.measure;
import static flipkart.dsp.santa.client.MetricsUtils.measureAsync;
//import static flipkart.dsp.santa.client.DecorateListner.decorateWithTimerStop;
/**
* Created by dhruv.chandhok on 09/06/15.
*/
public class SantaESNodeClient extends NodeClient
{
ClientConfig clientDescription;
private Timer executeTimer;
private static final String METRICS_GROUP_PREFIX = "dsp-santa-node";
private MetricName metricName(String name)
{
return new MetricName(METRICS_GROUP_PREFIX ,"ESClient", name);
}
private void init()
{
executeTimer= Metrics.newTimer(SantaESTransportClient.class,clientDescription.getClientName()+
"execute Response", TimeUnit.MILLISECONDS, TimeUnit.SECONDS);
}
public SantaESNodeClient(ClientConfig clientDescription,Settings settings, ThreadPool threadPool,
NodeAdminClient admin, Map<GenericAction, TransportAction> actions, Headers headers)
{
super(settings, threadPool, admin, actions, headers);
this.clientDescription=clientDescription;
init();
}
@Override
public <Request extends ActionRequest, Response extends ActionResponse,
RequestBuilder extends ActionRequestBuilder<Request, Response, RequestBuilder, Client>>
ActionFuture<Response> execute(Action<Request, Response, RequestBuilder, Client> action, Request request)
{
return measure(executeTimer,()->super.execute(action,request));
}
@Override
public <Request extends ActionRequest, Response extends ActionResponse,
RequestBuilder extends ActionRequestBuilder<Request, Response, RequestBuilder, Client>>
void execute(Action<Request, Response, RequestBuilder, Client> action, Request request, ActionListener<Response> listener)
{
measureAsync(executeTimer,(tc)->super.execute(action, request, decorateWithTimerStop(listener, tc)));
}
}
SantaESTransportClient