You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-issues@hadoop.apache.org by "Ivan A. Veselovsky (JIRA)" <ji...@apache.org> on 2013/01/31 15:47:15 UTC
[jira] [Commented] (HADOOP-9269) o.a.h.metrics2: annotation
@Metric(...,always=true) does not work as expected
[ https://issues.apache.org/jira/browse/HADOOP-9269?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13567680#comment-13567680 ]
Ivan A. Veselovsky commented on HADOOP-9269:
--------------------------------------------
afaik, the field metrics are created in method org.apache.hadoop.metrics2.lib.MutableMetricsFactory.newForField(Field, Metric, MetricsRegistry), and the value of @Metric#always is just ignored in case of MutableCounter/Gauge classes.
Also, in case of MurableStat/Rate the "always" value is used as "extended" parameter, which has another meaning: "produce extended stat (stdev, min/max etc.) if true.".
It looks like there is a mess with this annotation parameter.
> 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