Ivan A. Veselovsky created HADOOP-9269: ------------------------------------------
Summary: o.a.h.metrics2: annotation @Metric(...,always=true) does not work as expected Key: HADOOP-9269 URL: https://issues.apache.org/jira/browse/HADOOP-9269 Project: Hadoop Common Issue Type: Bug Reporter: Ivan A. Veselovsky {noformat}Metrics2: if a metric defined via annotations, like this @Metric(....,always=true), it should be snapshotted always, as defined by the "always" attribute description: /** * @return true to create a metric snapshot even if unchanged. */ boolean always() default false; However, that does not work in that way. The problem can be reproduced with the following test: public class TestBugDemo { @Metrics(name="record1", context="context1") static class MyMetrics1 { @Metric(value={"annotatedMetric1", "An integer gauge"},always=true) MutableGaugeInt testMetric1; public MyMetrics1 registerWith(MetricsSystem ms) { return ms.register("annotated", "annotated", this); } } private static class MySink implements MetricsSink { private final String sinkName; public MySink(String name) { sinkName = name; } @Override public void init(SubsetConfiguration conf) { } @Override public void flush() { } @Override public void putMetrics(MetricsRecord record) { if (!"metricssystem".equals(record.context())) { for (AbstractMetric am: record.metrics()) { System.out.println("### METRIC: " + am.name() + " = " + am.value()); } } } } private MetricsSystem ms; MyMetrics1 m1; @Before public void before() { ms = DefaultMetricsSystem.initialize(""); // register annotated source: m1 = new MyMetrics1().registerWith(ms); // register not-annotated source: final MetricsInfo fooInfo = Interns.info("non-annotated metric foo", "foo descrption"); ms.register("not-annotatad", "", new MetricsSource() { @Override public void getMetrics(MetricsCollector collector, boolean all) { collector .addRecord("testRecord") .addCounter(fooInfo, 88) .setContext("test1") .endRecord(); } }); ms.register("sink1", null, new MySink("sink1")); } @Test public void testAlways() { m1.testMetric1.set(5); System.out.println("First Pubishing: ==========================================================="); ms.publishMetricsNow(); //m1.testMetric1.set(7); System.out.println("Second Pubishing: ==========================================================="); ms.publishMetricsNow(); } } This test generates the following output: First Pubishing: =========================================================== ### METRIC: annotatedMetric1 = 5 ### METRIC: non-annotated metric foo = 88 Second Pubishing: =========================================================== ### METRIC: non-annotated metric foo = 88 That is, the metric "annotatedMetric1" is absent in the 2nd snapshot. Once we uncomment the line "//m1.testMetric1.set(7);", we observe expected behavior: First Pubishing: =========================================================== ### METRIC: annotatedMetric1 = 5 ### METRIC: non-annotated metric foo = 88 Second Pubishing: =========================================================== ### METRIC: annotatedMetric1 = 7 ### METRIC: non-annotated metric foo = 88 The expected behavior is that the metric "annotatedMetric1" will be snapshotted even if it was not changed, because it is annotated with "always=true". {noformat} -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira