Как сбрасывать показатели каждые X секунд?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как сбрасывать показатели каждые X секунд?

Сообщение Anonymous »

Я пытаюсь измерить метрики уровня приложения и JVM в своем приложении с помощью библиотеки метрик DropWizard.

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

Код: Выделить всё

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 counters = metricsRegistry.getCounters();
for (Entry counter : counters.entrySet()) {
System.out.println(counter.getKey());
System.out.println(counter.getValue().getCount());
}
}
}
Теперь мой вопрос: я хочу сбрасывать все показатели каждые 30 секунд. Это означает, что когда мой метод выполнения распечатывает метрики, он должен печатать метрики только за эти 30 секунд (для всех метрик), а не за весь этот период с момента запуска программы.
Есть ли способ, чтобы все мои показатели учитывались только в течение 30 секунд? Подсчет всего, что произошло за последние 30 секунд.

Подробнее здесь: https://stackoverflow.com/questions/409 ... -x-seconds
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»