Thursday, July 9, 2015

SantaESClient

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

No comments:

Post a Comment