[ https://issues.apache.org/jira/browse/FLINK-7692?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16268861#comment-16268861 ]
Chesnay Schepler commented on FLINK-7692: ----------------------------------------- [~tonywei] Those are good points, luckily we can resolve them in a rather nice way. We have to make one change to the original specification though: Create 2 groups for key-value pairs, instead of one. For a KeyValue group, the {{name}} on it's own behaves the same way as a generic group with the same name; it is part of the identifier and logical scope. Only the value is treated differently, as it isn't part of the logical scope. I've create a scaffold implementation (that probably doesn't fully compile... ) here: https://github.com/zentol/flink/tree/7692 This still needs tests, documentation, integration into reporters and we have to go through all usages of {{addGroup}} to find cases we can now model better. We need a new class for representing the key group, that behaves pretty much like a generic metric group: {code} public class GenericKeyMetricGroup extends GenericMetricGroup { GenericKeyMetricGroup(MetricRegistry registry, AbstractMetricGroup parent, String name) { super(registry, parent, name); } @Override protected GenericMetricGroup createChildGroup(String name) { return new GenericValueMetricGroup(registry, this, name); } } {code} and a another class for representing the value, that a) modifies the variables and b) is excluded from the logical scope {code} public class GenericValueMetricGroup extends GenericMetricGroup { private String key; private final String value; GenericValueMetricGroup(MetricRegistry registry, GenericKeyMetricGroup parent, String value) { super(registry, parent, value); this.key = parent.getGroupName(name -> name); this.value = value; } // ------------------------------------------------------------------------ @Override protected void putVariables(Map<String, String> variables) { variables.put(ScopeFormat.asVariable(this.key), value); } @Override public String getLogicalScope(CharacterFilter filter, char delimiter) { return parent.getLogicalScope(filter, delimiter); } } {code} This works with (surprisingly) little changes to existing classes; just 2 hooks to add more variables and to create a different kind of generic child group. With this, the implementation of {{addGroup(key, value)}} is trivial: {code} public MetricGroup addGroup(String key, String value) { return addGroup(key).addGroup(value); } {code} Now, as to the issues you raised:. When calling {{addGroup(name, value)}}, * if a group {{name}} already exists, we just continue with whatever group was there. If the existing group is a key group we get the behavior we want, otherwise we will add another {{GenericMetricGroup}}. This may result in the value not being exposed as a proper key-value pair, but it doesn't lead to loss of information (which we would have if we skipped registering the value). In any case the metric identifier is the same. * if a group {{value}} already exists we don't have a problem. Given that the key group is never exposed to the outside this case can only occur upon subsequent calls of {{addGroup(name, value)}}, making the latter calls a no-op, as is the existing behavior. > Support user-defined variables in Metrics > ----------------------------------------- > > Key: FLINK-7692 > URL: https://issues.apache.org/jira/browse/FLINK-7692 > Project: Flink > Issue Type: Improvement > Components: Metrics > Affects Versions: 1.4.0 > Reporter: Chesnay Schepler > Assignee: Wei-Che Wei > Priority: Minor > Fix For: 1.5.0 > > > Reporters that identify metrics with a set of key-value pairs are currently > limited to the variables defined by Flink, like the taskmanager ID, with > users not being able to supply their own. > This is inconsistent with reporters that use metric identifiers that freely > include user-defined groups constructted via {{MetricGroup#addGroup(String > name)}}. > I propose adding a new method {{MetricGroup#addGroup(String key, String > name)}} that adds a new key-value pair to the {{variables}} map in it's > constructor. When constructing the metric identifier the key should be > included as well, resulting in the same result as when constructing the > metric groups tree via {{group.addGroup(key).addGroup(value)}}. > For this a new {{KeyedGenericMetricGroup}} should be created that resembles > the unkeyed version, with slight modifications to the constructor and > {{getScopeComponents}} method. -- This message was sent by Atlassian JIRA (v6.4.14#64029)