blob: 6861457a98382b9246c2b44c0fe30b18895d8d93 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.solr.metrics;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import com.codahale.metrics.Counter;
import com.codahale.metrics.Gauge;
import com.codahale.metrics.Histogram;
import com.codahale.metrics.Meter;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.Timer;
import org.apache.solr.util.stats.MetricUtils;
/**
* This class represents a metrics context that ties together components with the same life-cycle
* and provides convenient access to the metric registry.
* <p>Additionally it's used for registering and reporting metrics specific to the components that
* use the same instance of context.</p>
*/
public class SolrMetricsContext {
private final String registryName;
private final SolrMetricManager metricManager;
private final String tag;
private final Set<String> metricNames = ConcurrentHashMap.newKeySet();
public SolrMetricsContext(SolrMetricManager metricManager, String registryName, String tag) {
this.registryName = registryName;
this.metricManager = metricManager;
this.tag = tag;
}
/**
* Metrics tag that represents objects with the same life-cycle.
*/
public String getTag() {
return tag;
}
/**
* Return metric registry name used in this context.
*/
public String getRegistryName() {
return registryName;
}
/**
* Return the instance of {@link SolrMetricManager} used in this context.
*/
public SolrMetricManager getMetricManager() {
return metricManager;
}
/**
* Return a modifiable set of metric names that this component registers.
*/
public Set<String> getMetricNames() {
return metricNames;
}
/**
* Unregister all {@link Gauge} metrics that use this context's tag.
*
* <p><b>NOTE: This method MUST be called at the end of a life-cycle (typically in <code>close()</code>)
* of components that register gauge metrics with references to the current object's instance. Failure to
* do so may result in hard-to-debug memory leaks.</b></p>
*/
public void unregister() {
metricManager.unregisterGauges(registryName, tag);
}
/**
* Get a context with the same registry name but a tag that represents a parent-child relationship.
* Since it's a different tag than the parent's context it is assumed that the life-cycle of the parent
* and child are different.
* @param child child object that produces metrics with a different life-cycle than the parent.
*/
public SolrMetricsContext getChildContext(Object child) {
SolrMetricsContext childContext = new SolrMetricsContext(metricManager, registryName, SolrMetricProducer.getUniqueMetricTag(child, tag));
return childContext;
}
/** Register a metric name that this component reports. This method is called by various
* metric registration methods in {@link org.apache.solr.metrics.SolrMetricManager} in order
* to capture what metric names are reported from this component (which in turn is called
* from {@link org.apache.solr.metrics.SolrMetricProducer#initializeMetrics(SolrMetricsContext, String)}).
*/
public void registerMetricName(String name) {
metricNames.add(name);
}
/**
* Return a snapshot of metric values that this component reports.
*/
public Map<String, Object> getMetricsSnapshot() {
return MetricUtils.convertMetrics(getMetricRegistry(), metricNames);
}
/**
* Convenience method for {@link SolrMetricManager#meter(SolrMetricsContext, String, String, String...)}.
*/
public Meter meter(String metricName, String... metricPath) {
return metricManager.meter(this, registryName, metricName, metricPath);
}
/**
* Convenience method for {@link SolrMetricManager#counter(SolrMetricsContext, String, String, String...)}.
*/
public Counter counter(String metricName, String... metricPath) {
return metricManager.counter(this, registryName, metricName, metricPath);
}
/**
* Convenience method for {@link SolrMetricManager#registerGauge(SolrMetricsContext, String, Gauge, String, boolean, String, String...)}.
*/
public void gauge(Gauge<?> gauge, boolean force, String metricName, String... metricPath) {
metricManager.registerGauge(this, registryName, gauge, tag, force, metricName, metricPath);
}
/**
* Convenience method for {@link SolrMetricManager#meter(SolrMetricsContext, String, String, String...)}.
*/
public Timer timer(String metricName, String... metricPath) {
return metricManager.timer(this, registryName, metricName, metricPath);
}
/**
* Convenience method for {@link SolrMetricManager#histogram(SolrMetricsContext, String, String, String...)}.
*/
public Histogram histogram(String metricName, String... metricPath) {
return metricManager.histogram(this, registryName, metricName, metricPath);
}
/**
* Get the {@link MetricRegistry} instance that is used for registering metrics in this context.
*/
public MetricRegistry getMetricRegistry() {
return metricManager.registry(registryName);
}
}