2016-12-01 15 views
0

Я пытаюсь измерить показатели приложения и jvm уровня в своем приложении, используя DropWizard Metrics library.Как сбросить метрики каждые X секунд?

Ниже приведен мой класс показателей, который я использую через свой код для увеличения/уменьшения метрик. Я вызываю increment и decrement метод класса ниже для увеличения и уменьшения показателей.

public class TestMetrics { 
    private final MetricRegistry metricRegistry = new MetricRegistry(); 

    private static class Holder { 
    private static final TestMetrics INSTANCE = new TestMetrics(); 
    } 

    public static TestMetrics getInstance() { 
    return Holder.INSTANCE; 
    } 

    private TestMetrics() {} 

    public void increment(final Names... metricsName) { 
    for (Names metricName : metricsName) 
     metricRegistry.counter(name(TestMetrics.class, metricName.value())).inc(); 
    } 

    public void decrement(final Names... metricsName) { 
    for (Names metricName : metricsName) 
     metricRegistry.counter(name(TestMetrics.class, metricName.value())).dec(); 
    } 

    public MetricRegistry getMetricRegistry() { 
    return metricRegistry; 
    } 

    public enum Names { 
    // some more fields here 
    INVALID_ID("invalid-id"), MESSAGE_DROPPED("drop-message"); 

    private final String value; 

    private Names(String value) { 
     this.value = value; 
    } 

    public String value() { 
     return value; 
    } 
    }; 
} 

А вот как я использую выше TestMetrics класса для увеличения метрики базы на случай, когда мне нужно. Ниже метод вызывается несколькими потоками.

public void process(GenericRecord record) { 
    // ... some other code here 
    try { 
     String clientId = String.valueOf(record.get("clientId")); 
     String procId = String.valueOf(record.get("procId")); 
     if (Strings.isNullOrEmpty(clientId) && Strings.isNullOrEmpty(procId) 
      && !NumberUtils.isNumber(clientId)) { 
     TestMetrics.getInstance().increment(Names.INVALID_ID, 
      Names.MESSAGE_DROPPED); 
     return; 
     } 
     // .. other code here 

    } catch (Exception ex) {  
     TestMetrics.getInstance().increment(Names.MESSAGE_DROPPED); 
    } 
    } 

Теперь у меня есть еще один класс, который ходит каждые 30 секунд только (я использую рамки Quartz для этого), где я хочу, чтобы напечатать все показатели и его количество. В общем, я буду отправлять эти показатели каждые 30 секунд в какую-то другую систему, но сейчас я распечатываю ее здесь. Вот как я это делаю.

public class SendMetrics implements Job { 

    @Override 
    public void execute(final JobExecutionContext ctx) throws JobExecutionException { 
    MetricRegistry metricsRegistry = TestMetrics.getInstance().getMetricRegistry(); 
    Map<String, Counter> counters = metricsRegistry.getCounters(); 
    for (Entry<String, Counter> counter : counters.entrySet()) { 
     System.out.println(counter.getKey()); 
     System.out.println(counter.getValue().getCount()); 
    } 
    } 
} 

Теперь я задаю вопрос: я хочу, чтобы все мои показатели учитывались каждые 30 секунд. Значение, когда мой метод execute распечатывает метрики, он должен распечатывать показатели только за 30 секунд (только для всех показателей) вместо того, чтобы печатать на протяжении всей продолжительности с момента запуска программы.

Есть ли способ, чтобы все мои показатели имели счет только 30 секунд. Граф того, что произошло за последние 30 секунд.

+0

О классе 'SendMetrics'. Dropwizard уже имеет соответствующие абстракции, и вы можете использовать их для реализации собственных отчетов. Например, см. [ConsoleReporter] (http://www.dropwizard.io/1.0.5/docs/manual/configuration.html#console-reporter). Он печатает показатели на 'stdout' или' stderr' и может быть настроен для отчетный период. Также взгляните на подмодуль [dropwizard-metrics] (https://github.com/dropwizard/dropwizard/tree/master/dropwizard-metrics/src/main/java/io/dropwizard/metrics). Вы можете использовать код там как пример реализации. – zloster

+0

О вашей большой проблеме: посмотрите здесь -> http://stackoverflow.com/questions/40807073/how-can-i-reset-timer-of-dropwizard-metrics/40809650#40809650 Проверьте [связанная проблема] (https: //github.com/dropwizard/metrics/issues/143#issuecomment-63345927) в «проекте показателей». [Некоторые комментарии] (https://github.com/dropwizard/metrics/issues/143#issuecomment-85419740) есть ссылки на [эту статью] (http://evertrue.github.io/blog/2013/10/14/resettable-counters-with-codahale-metrics /) для работы вокруг сброса счетчиков. – zloster

+0

Я не совсем понимаю ссылку на статью, которую вы мне дали. Я смущаюсь, как это будет в моем классе?Можете ли вы помочь мне понять это? Или, если вы можете предоставить мне пример? Bcoz Я вызываю метод increment класса 'TestMetrics' для увеличения метрик. – user1950349

ответ

0

В ответ, потому что это слишком долго:

Вы хотите сбросить счетчики. Для этого нет API. Причины обсуждаются в связанной проблеме github. В статье описывается возможное обходное решение. У вас есть ваши счетчики и используйте их как обычно - увеличивая и уменьшая. Но вы не можете их сбросить. Поэтому добавьте новый Gauge, значение которого следует за счетчиком, который вы хотите сбросить после того, как он сообщил вам. Метод getValue()Gauge вызывается, если вы хотите сообщить значение счетчика. После сохранения текущего значения метод уменьшает значение счетчика с ним. Это эффективно сбросит счетчик до 0. Таким образом, у вас есть отчет, а также сброс счетчика. Это описано в Step 1.

Step 2 добавляет фильтр, который запрещает сообщать фактический счетчик, поскольку теперь вы сообщаете через датчик.

+0

Значит, мне нужно иметь 'gauge' для каждого из моих счетчиков метрик? У меня есть очень общий метод для увеличения метрики, поскольку у меня нет переменной счетчика, определенной для всех показателей. Я использую enum для определения всех метрических переменных, а затем используя его в методе 'increment' для увеличения метрик. Значит, мне нужно вручную определить датчики для всех показателей? – user1950349

+0

Есть ли какой-либо способ сделать этот родословный случай, как в моем коде? – user1950349

+0

1) Да, вам нужен один датчик на счетчик, который вы хотите сбросить; 2) Слишком много вопросов и вне сферы действия - если обходной путь поможет вам и как его реализовать, вам решать. – zloster

 Смежные вопросы

  • Нет связанных вопросов^_^