Как использовать метрики dropwizard для асинхронного обратного вызова - PullRequest
0 голосов
/ 09 мая 2018

Я хочу использовать метрики dropwizard для асинхронного обратного вызова в моем приложении. Я асинхронно вставляю записи в cassandra.

У меня есть список запросов (связанных состояний), выполняемых асинхронно. Я добавил обратный вызов для отслеживания onSuccess () и onFailure () для моего асинхронного выполнения. (Семафор также существует, чтобы ограничить число асинхронных запросов вставки)

Теперь я хочу правильно реализовать метрику, чтобы я мог измерить или контролировать следующее:

  1. Количество запросов / запросов на вставку, отправленных за минуту.
  2. Номер успешно выполненного запроса
  3. Количество ответов, полученных после успешной вставки (число успешных попыток, процент успешных попыток в минуту)
  4. Количество ответов, полученных после вставки ошибки (failCount, частота отказов в минуту)

Ниже приведен мой фрагмент кода, для которого мне нужно включить метрики. Пожалуйста, помогите.

    final Semaphore queryPermits= new Semaphore(100);
public List<ListenableFuture<ResultSet>> sendAsyncQueries(List<BoundStatement> boundStatements) throws CqlException, AdapterException {
    List<ListenableFuture<ResultSet>> futures = new ArrayList<>();
    final ListeningExecutorService executor = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
    for (BoundStatement boundStatement : boundStatements) {
        try {
            queryPermits.acquire();//Sempahore to throttle cassandra insert
        } catch (InterruptedException e) {
            LOG.error("InterruptedException while acquire permit for asynchronous insertion ",e);
        }
        try {
            final ListenableFuture<ResultSet> resultSetFuture = executeAsynchronously(boundStatement, ConsistencyLevel.QUORUM);
            Futures.addCallback(resultSetFuture,
                    new FutureCallback<ResultSet>() {
                        @Override
                        public void onSuccess(ResultSet result) {
                            LOG.debug("Inserted cassandra row ");
                            queryPermits.release();
                        }
                        @Override
                        public void onFailure(Throwable t) {
                            LOG.error("Error while inserting inCassandra ");
                            queryPermits.release();
                        }
                    },
                    executor
            );
            futures.add(resultSetFuture);
        }catch(AdapterException e){
            queryPermits.release();
            throw e;
        }
    }
    return  futures;
}
...