diff options
Diffstat (limited to 'container-disc/src/main/java/com/yahoo/container/jdisc/metric/MetricConsumerProvider.java')
-rw-r--r-- | container-disc/src/main/java/com/yahoo/container/jdisc/metric/MetricConsumerProvider.java | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/container-disc/src/main/java/com/yahoo/container/jdisc/metric/MetricConsumerProvider.java b/container-disc/src/main/java/com/yahoo/container/jdisc/metric/MetricConsumerProvider.java new file mode 100644 index 00000000000..9cb2a768528 --- /dev/null +++ b/container-disc/src/main/java/com/yahoo/container/jdisc/metric/MetricConsumerProvider.java @@ -0,0 +1,55 @@ +// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.container.jdisc.metric; + +import com.google.inject.Inject; +import com.yahoo.component.provider.ComponentRegistry; +import com.yahoo.container.jdisc.MetricConsumerFactory; +import com.yahoo.container.jdisc.metric.state.StateMetricConsumerFactory; +import com.yahoo.container.jdisc.state.StateMonitor; +import com.yahoo.jdisc.application.MetricConsumer; +import com.yahoo.metrics.MetricsPresentationConfig; + + +/** + * <p>The purpose of this class it to be the only provider for the <tt>MetricConsumer</tt> interface in a component + * graph. This component is automatically registered in the graph by the config server. Configuring a different + * <tt>MetricConsumer</tt> is done by registering one or more {@link MetricConsumerFactory} in the services-file.</p> + * + * <p>Because this class depends on the {@link ComponentRegistry} of {@link MetricConsumerFactory}, any added or removed + * {@link MetricConsumerFactory} will cause this component to be reconfigured. Because {@link MetricProvider} depends on + * this class, which means any component that uses <tt>Metric</tt> will be reconfigured. Any component that depends + * directly on <tt>MetricConsumer</tt> will also be reconfigured.</p> + * + * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen Hult</a> + */ +public class MetricConsumerProvider { + + private final MetricConsumerFactory[] factories; + + @Inject + public MetricConsumerProvider(ComponentRegistry<MetricConsumerFactory> factoryRegistry, + MetricsPresentationConfig presentationConfig, + StateMonitor stateMonitor) { + MetricConsumerFactory[] factories; + if (factoryRegistry.getComponentCount() == 0 || ! presentationConfig.slidingwindow()) { + factories = new MetricConsumerFactory[1]; + factories[0] = new StateMetricConsumerFactory(stateMonitor); + } else { + factories = new MetricConsumerFactory[factoryRegistry.getComponentCount()]; + factoryRegistry.allComponents().toArray(factories); + } + this.factories = factories; + } + + public MetricConsumer newInstance() { + if (factories.length == 1) { + return factories[0].newInstance(); + } + MetricConsumer[] consumers = new MetricConsumer[factories.length]; + for (int i = 0; i < factories.length; ++i) { + consumers[i] = factories[i].newInstance(); + } + return new ForwardingMetricConsumer(consumers); + } + +} |