[
https://issues.apache.org/jira/browse/HBASE-4050?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13417793#comment-13417793
]
Alex Baranau commented on HBASE-4050:
-------------------------------------
Looking at adding MetricSources for Master and RegionServer and have some Qs.
1) MetricsSystem - always has name "hbase"? What if we want to try single-node
cluster? Would be great to separate metrics systems. E.g. in Hadoop code I see
"datanode", "namenode", …
2) I was thinking to extract maps (counters & gauges) into separate class along
with the code that manages them. I.e. in new hbase.MetricsRegistry. We can add
then Tags in there, etc. I.e. this would be pretty much similar to
org.apache.hadoop.metrics2.lib.MetricsRegistry, but will allow also removing
metrics (also read the last piece of comment to see why we might want it as
well). Thoughts?
3) Does it make sense to create interfaces for MetricMutableGaugeLong and
MetricMutableCounterLong and allow MetricSource implementations to create &
obtain them? So that they could be fields in MetricSource classes. This would
allow at least:
* access metrics much faster, without lookup in Map
* this would remove "proxy methods" from BaseMetricsSourceImpl (or from
MetricsRegistry, after extracting it) and will make easier to provide other
implementations (in addition to counter & gauge), independently (i.e. without
adding proxy methods in BaseMetricsSourceImpl).
Thoughts?
4) In case of RegionServer and Master metrics I need to pass initialization
parameters. By analogy with DataNode metrics, I'd pass servername, sessionId.
As we use ServiceLoader, there's no way to pass parameters to constructor. I
was thinking about adding smth like init() method to the MasterMetricsSource
(which is in common compat module), but looks not very nice and will not
actually work very well with current BaseMetricsSource implementation as things
are initialized in constructor there. I.e. I will have to change that and move
things into init() method (doesn't look nice to me).
Another thought. What if slightly "move" what is placed in compat module? What
if we put there more "lower-level" intruments. We could:
* extract hbase.MetricRegistry as per above, make common interface for it and
place in hadoop compat module, provide factory for creating
hbase.MetricsRegistry there as well
* define hbase.MetricSource interface with single method getMetricRegistry()
* create service wrapper of DefaultMetricsSystem, which allows to register
hbase.MetricsSource
(in each hadoop1/2-compat modules hbase.MetricsSource.getMetricRegistry() can
be used to implement hadoop.MetricSource's getMetrics() method via getting data
from hbase.MetricsRegistry)
This way we will offer to MetricsSource implementations (in main hbase modules)
lower-level tools and will be more flexible (e.g. with passing parameters to
MetricSource implementation ctors). Also, MetricSource implementations (in main
modules) will look closer to what was intended by Hadoop Metrics framework
(judging by datanode/namenode metric sources). We could do what is mentioned in
3rd point above. E.g. typical metricSource will look like:
{noformat}
public class HMasterMetrics implements MetricsSource {
final String name;
[...]
final MetricsRegistry registry = MetricsRegistryFactory.create("hmaster");
final MutableCounterLong clusterRequests =
registry.newCounter("cluster_requests", "", 0);
[…]
public HMasterMetrics(final String name, final String sessionId) {
this.name = name;
JvmMetricsSourceFactory.create("HMaster", sessionId);
registry.setContext(name).tag("sessionId", "", sessionId);
}
@Override
public MetricsRegistry getMetrics() {
return registry;
}
public void incClusterRequests(int delta) {
clusterRequests.inc(delta);
}
[…]
}
{noformat}
Also, it will be easier to move out wrom using this shim when it is no longer
needed by easy switching these shim hbase.MetricsRegistry, hbase.MetricsSource,
hbase.DefaultMetricsSystem classes to hadoop.* ones.
I see a lot of benefits, but may be I'm missing smth. The only fear is that by
going with lower-level tools shims we might end up having more of these shim
classes/interfaces (like adding shim MetricMutableGaugeLong and
MetricMutableCounterLong interfaces in this case so far). Though this might not
be that bad.
Does it makes sense to you guys at all?
I hope I'm not acting counter-productive by suggesting changes to things that
already work (the patch by Elliott)
> Update HBase metrics framework to metrics2 framework
> ----------------------------------------------------
>
> Key: HBASE-4050
> URL: https://issues.apache.org/jira/browse/HBASE-4050
> Project: HBase
> Issue Type: New Feature
> Components: metrics
> Affects Versions: 0.90.4
> Environment: Java 6
> Reporter: Eric Yang
> Assignee: Elliott Clark
> Priority: Critical
> Fix For: 0.96.0
>
> Attachments: 4050-metrics-v2.patch, 4050-metrics-v3.patch,
> HBASE-4050-0.patch, HBASE-4050-1.patch, HBASE-4050-2.patch,
> HBASE-4050-3.patch, HBASE-4050-5.patch, HBASE-4050-6.patch,
> HBASE-4050-7.patch, HBASE-4050-8.patch, HBASE-4050.patch
>
>
> Metrics Framework has been marked deprecated in Hadoop 0.20.203+ and 0.22+,
> and it might get removed in future Hadoop release. Hence, HBase needs to
> revise the dependency of MetricsContext to use Metrics2 framework.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira