Я пытаюсь измерить показатели приложения и 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 секунд.
О классе '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
О вашей большой проблеме: посмотрите здесь -> 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
Я не совсем понимаю ссылку на статью, которую вы мне дали. Я смущаюсь, как это будет в моем классе?Можете ли вы помочь мне понять это? Или, если вы можете предоставить мне пример? Bcoz Я вызываю метод increment класса 'TestMetrics' для увеличения метрик. – user1950349