diff options
author | Jon Bratseth <bratseth@gmail.com> | 2023-03-03 15:16:12 +0100 |
---|---|---|
committer | Jon Bratseth <bratseth@gmail.com> | 2023-03-03 15:16:12 +0100 |
commit | 47188f0c7749ec328e4f9bc555c44b8ab2b90182 (patch) | |
tree | 8216de8385b45ed52364c8e52ae92f00d86c7e1f | |
parent | f3d1ec3b144acbfde712a6cd61a5ff47e1ecf1b1 (diff) |
Use the metric provider returned after configuration
10 files changed, 192 insertions, 143 deletions
diff --git a/application/src/main/java/com/yahoo/application/Application.java b/application/src/main/java/com/yahoo/application/Application.java index b4857d18459..d9234584630 100644 --- a/application/src/main/java/com/yahoo/application/Application.java +++ b/application/src/main/java/com/yahoo/application/Application.java @@ -345,7 +345,7 @@ public final class Application implements AutoCloseable { } // generate the services xml and load the container - private Application build() throws Exception { + public Application build() throws Exception { Application app = null; Exception exception = null; diff --git a/application/src/test/java/com/yahoo/application/ApplicationTest.java b/application/src/test/java/com/yahoo/application/ApplicationTest.java index 5b4a68756f0..6b394cdebd9 100644 --- a/application/src/test/java/com/yahoo/application/ApplicationTest.java +++ b/application/src/test/java/com/yahoo/application/ApplicationTest.java @@ -2,6 +2,7 @@ package com.yahoo.application; import com.yahoo.application.container.MockServer; +import com.yahoo.application.container.components.ComponentWithMetrics; import com.yahoo.application.container.docprocs.MockDocproc; import com.yahoo.application.container.handler.Request; import com.yahoo.application.container.handler.Response; @@ -15,6 +16,8 @@ import com.yahoo.docproc.Processing; import com.yahoo.document.DocumentRemove; import com.yahoo.document.DocumentType; import com.yahoo.jdisc.handler.RequestHandler; +import com.yahoo.metrics.simple.Bucket; +import com.yahoo.metrics.simple.jdisc.SimpleMetricConsumer; import com.yahoo.search.Query; import com.yahoo.search.Result; import com.yahoo.search.handler.SearchHandler; @@ -263,6 +266,25 @@ public class ApplicationTest { } @Test + void application_generation_metric() throws Exception { + try (ApplicationFacade app = new ApplicationFacade(Application.fromBuilder(new Application.Builder().container("default", new Application.Builder.Container() + .component(ComponentWithMetrics.class))))) { + var component = (ComponentWithMetrics)app.getComponentById(ComponentWithMetrics.class.getName()); + assertNotNull(component); + var metrics = (SimpleMetricConsumer)component.metrics().newInstance(); // not actually a new instance + assertNotNull(metrics); + int maxWaitMs = 10000; + Bucket snapshot = null; + while (maxWaitMs-- > 0 && ( snapshot = metrics.receiver().getSnapshot() ) == null) { + Thread.sleep(1); + } + assertNotNull(snapshot); + assertEquals(1, snapshot.getValuesForMetric("application_generation").size()); + assertEquals(0, snapshot.getValuesForMetric("application_generation").iterator().next().getValue().getLast()); + } + } + + @Test void component_with_config() throws Exception { MockApplicationConfig config = new MockApplicationConfig(new MockApplicationConfig.Builder().mystruct(new MockApplicationConfig.Mystruct.Builder().id("foo").value("bar"))); try (ApplicationFacade app = new ApplicationFacade(Application.fromBuilder(new Application.Builder().container("default", new Application.Builder.Container() diff --git a/application/src/test/java/com/yahoo/application/container/components/ComponentWithMetrics.java b/application/src/test/java/com/yahoo/application/container/components/ComponentWithMetrics.java new file mode 100644 index 00000000000..45bb9bd846d --- /dev/null +++ b/application/src/test/java/com/yahoo/application/container/components/ComponentWithMetrics.java @@ -0,0 +1,27 @@ +package com.yahoo.application.container.components; + +import com.yahoo.metrics.simple.jdisc.JdiscMetricsFactory; +import com.yahoo.search.Query; +import com.yahoo.search.Result; +import com.yahoo.search.Searcher; +import com.yahoo.search.searchchain.Execution; + +/** + * @author bratseth + */ +public class ComponentWithMetrics extends Searcher { + + private final JdiscMetricsFactory metrics; + + public ComponentWithMetrics(JdiscMetricsFactory metrics) { + this.metrics = metrics; + } + + public JdiscMetricsFactory metrics() { return metrics; } + + @Override + public Result search(Query query, Execution execution) { + return execution.search(query); + } + +} diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/metricsproxy/MetricsProxyContainerCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/metricsproxy/MetricsProxyContainerCluster.java index b9d0cf0d17b..5a1c3d87e5e 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/metricsproxy/MetricsProxyContainerCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/metricsproxy/MetricsProxyContainerCluster.java @@ -25,12 +25,10 @@ import ai.vespa.metricsproxy.telegraf.TelegrafConfig; import ai.vespa.metricsproxy.telegraf.TelegrafRegistry; import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.TreeConfigProducer; -import com.yahoo.config.model.producer.AbstractConfigProducerRoot; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.Zone; import com.yahoo.container.jdisc.ThreadedHttpRequestHandler; import com.yahoo.osgi.provider.model.ComponentModel; -import com.yahoo.vespa.model.VespaModel; import com.yahoo.vespa.model.admin.Admin; import com.yahoo.vespa.model.admin.monitoring.MetricSet; import com.yahoo.vespa.model.admin.monitoring.MetricsConsumer; diff --git a/container-core/src/main/java/com/yahoo/metrics/simple/MetricAggregator.java b/container-core/src/main/java/com/yahoo/metrics/simple/MetricAggregator.java index 5fd9afa3e4c..d41d2981be8 100644 --- a/container-core/src/main/java/com/yahoo/metrics/simple/MetricAggregator.java +++ b/container-core/src/main/java/com/yahoo/metrics/simple/MetricAggregator.java @@ -46,9 +46,7 @@ class MetricAggregator implements Runnable { private void createSnapshot(Bucket toDelete) { Bucket toPresent = new Bucket(); for (Bucket b : buffer) { - if (b == null) { - continue; - } + if (b == null) continue; toPresent.merge(b); } dimensions.updateDimensionPersistence(toDelete, toPresent); diff --git a/container-core/src/main/java/com/yahoo/metrics/simple/MetricReceiver.java b/container-core/src/main/java/com/yahoo/metrics/simple/MetricReceiver.java index 409e3651091..021f3a170d8 100644 --- a/container-core/src/main/java/com/yahoo/metrics/simple/MetricReceiver.java +++ b/container-core/src/main/java/com/yahoo/metrics/simple/MetricReceiver.java @@ -30,138 +30,6 @@ public class MetricReceiver { private final Object histogramDefinitionsLock = new Object(); private volatile Map<String, MetricSettings> metricSettings; - private static final class NullCounter extends Counter { - - NullCounter() { - super(null, null, null); - } - - @Override - public void add() { - } - - @Override - public void add(long n) { - } - - @Override - public void add(Point p) { - } - - @Override - public void add(long n, Point p) { - } - - @Override - public PointBuilder builder() { - return super.builder(); - } - } - - private static final class NullGauge extends Gauge { - NullGauge() { - super(null, null, null); - } - - @Override - public void sample(double x) { - } - - @Override - public void sample(double x, Point p) { - } - - @Override - public PointBuilder builder() { - return super.builder(); - } - - } - - public static final class MockReceiver extends MetricReceiver { - - private final ThreadLocalDirectory<Bucket, Sample> collection; - - private MockReceiver(ThreadLocalDirectory<Bucket, Sample> collection) { - super(collection, null); - this.collection = collection; - } - - public MockReceiver() { - this(new ThreadLocalDirectory<>(new MetricUpdater())); - } - - /** Gathers all data since last snapshot */ - public Bucket getSnapshot() { - Bucket merged = new Bucket(); - for (Bucket b : collection.fetch()) { - merged.merge(b, true); - } - return merged; - } - - /** Utility method for testing */ - public Point point(String dim, String val) { - return pointBuilder().set(dim, val).build(); - } - - } - - private static final class NullReceiver extends MetricReceiver { - - NullReceiver() { - super(null, null); - } - - @Override - public void update(Sample s) { - } - - @Override - public Counter declareCounter(String name) { - return new NullCounter(); - } - - @Override - public Counter declareCounter(String name, Point boundDimensions) { - return new NullCounter(); - } - - @Override - public Gauge declareGauge(String name) { - return new NullGauge(); - } - - @Override - public Gauge declareGauge(String name, Point boundDimensions) { - return new NullGauge(); - } - - @Override - public Gauge declareGauge(String name, Optional<Point> boundDimensions, MetricSettings customSettings) { - return null; - } - - @Override - public PointBuilder pointBuilder() { - return null; - } - - @Override - public Bucket getSnapshot() { - return null; - } - - @Override - void addMetricDefinition(String metricName, MetricSettings definition) { - } - - @Override - MetricSettings getMetricDefinition(String metricName) { - return null; - } - } - public MetricReceiver(ThreadLocalDirectory<Bucket, Sample> metricsCollection, AtomicReference<Bucket> currentSnapshot) { this.metricsCollection = metricsCollection; this.currentSnapshot = currentSnapshot; @@ -297,4 +165,137 @@ public class MetricReceiver { MetricSettings getMetricDefinition(String metricName) { return metricSettings.get(metricName); } + + private static final class NullCounter extends Counter { + + NullCounter() { + super(null, null, null); + } + + @Override + public void add() { + } + + @Override + public void add(long n) { + } + + @Override + public void add(Point p) { + } + + @Override + public void add(long n, Point p) { + } + + @Override + public PointBuilder builder() { + return super.builder(); + } + } + + private static final class NullGauge extends Gauge { + NullGauge() { + super(null, null, null); + } + + @Override + public void sample(double x) { + } + + @Override + public void sample(double x, Point p) { + } + + @Override + public PointBuilder builder() { + return super.builder(); + } + + } + + public static final class MockReceiver extends MetricReceiver { + + private final ThreadLocalDirectory<Bucket, Sample> collection; + + private MockReceiver(ThreadLocalDirectory<Bucket, Sample> collection) { + super(collection, null); + this.collection = collection; + } + + public MockReceiver() { + this(new ThreadLocalDirectory<>(new MetricUpdater())); + } + + /** Gathers all data since last snapshot */ + public Bucket getSnapshot() { + Bucket merged = new Bucket(); + for (Bucket b : collection.fetch()) { + merged.merge(b, true); + } + return merged; + } + + /** Utility method for testing */ + public Point point(String dim, String val) { + return pointBuilder().set(dim, val).build(); + } + + } + + private static final class NullReceiver extends MetricReceiver { + + NullReceiver() { + super(null, null); + } + + @Override + public void update(Sample s) { + } + + @Override + public Counter declareCounter(String name) { + return new NullCounter(); + } + + @Override + public Counter declareCounter(String name, Point boundDimensions) { + return new NullCounter(); + } + + @Override + public Gauge declareGauge(String name) { + return new NullGauge(); + } + + @Override + public Gauge declareGauge(String name, Point boundDimensions) { + return new NullGauge(); + } + + @Override + public Gauge declareGauge(String name, Optional<Point> boundDimensions, MetricSettings customSettings) { + return null; + } + + @Override + public PointBuilder pointBuilder() { + return null; + } + + @Override + public Bucket getSnapshot() { + return null; + } + + @Override + void addMetricDefinition(String metricName, MetricSettings definition) { + } + + @Override + MetricSettings getMetricDefinition(String metricName) { + return null; + } + } + } diff --git a/container-core/src/main/java/com/yahoo/metrics/simple/jdisc/SimpleMetricConsumer.java b/container-core/src/main/java/com/yahoo/metrics/simple/jdisc/SimpleMetricConsumer.java index 0286684c34c..7cb2f495b3e 100644 --- a/container-core/src/main/java/com/yahoo/metrics/simple/jdisc/SimpleMetricConsumer.java +++ b/container-core/src/main/java/com/yahoo/metrics/simple/jdisc/SimpleMetricConsumer.java @@ -50,4 +50,6 @@ public class SimpleMetricConsumer implements MetricConsumer { return new Point(properties); } + public MetricReceiver receiver() { return receiver; } + } diff --git a/container-disc/src/main/java/com/yahoo/container/jdisc/ConfiguredApplication.java b/container-disc/src/main/java/com/yahoo/container/jdisc/ConfiguredApplication.java index b7381631251..0d18eb9aa8f 100644 --- a/container-disc/src/main/java/com/yahoo/container/jdisc/ConfiguredApplication.java +++ b/container-disc/src/main/java/com/yahoo/container/jdisc/ConfiguredApplication.java @@ -74,7 +74,6 @@ public final class ConfiguredApplication implements Application { private final Set<ClientProvider> startedClients = createIdentityHashSet(); private final Set<ServerProvider> startedServers = createIdentityHashSet(); private final SubscriberFactory subscriberFactory; - private final Metric metric; private final ContainerActivator activator; private final String configId; private final OsgiFramework osgiFramework; @@ -100,6 +99,7 @@ public final class ConfiguredApplication implements Application { private final Thread portWatcher; private HandlersConfigurerDi configurer; private QrConfig qrConfig; + private Metric metric; // Cannot be injected before the application is set up private Register slobrokRegistrator = null; private Supervisor supervisor = null; @@ -141,13 +141,11 @@ public final class ConfiguredApplication implements Application { public ConfiguredApplication(ContainerActivator activator, OsgiFramework osgiFramework, com.yahoo.jdisc.Timer timer, - SubscriberFactory subscriberFactory, - Metric metric) { + SubscriberFactory subscriberFactory) { this.activator = activator; this.osgiFramework = osgiFramework; this.timerSingleton = timer; this.subscriberFactory = subscriberFactory; - this.metric = metric; this.configId = System.getProperty("config.id"); this.slobrokConfigSubscriber = (subscriberFactory instanceof CloudSubscriberFactory) ? new SlobrokConfigSubscriber(configId) @@ -166,6 +164,7 @@ public final class ConfiguredApplication implements Application { ContainerBuilder builder = createBuilderWithGuiceBindings(); configurer = createConfigurer(builder.guiceModules().activate()); + metric = configurer.getComponent(Metric.class); initializeAndActivateContainer(builder, () -> {}); reconfigurerThread.setDaemon(true); reconfigurerThread.start(); diff --git a/jdisc_core/src/main/java/com/yahoo/jdisc/application/MetricProvider.java b/jdisc_core/src/main/java/com/yahoo/jdisc/application/MetricProvider.java index 16d4861b244..c206393400d 100644 --- a/jdisc_core/src/main/java/com/yahoo/jdisc/application/MetricProvider.java +++ b/jdisc_core/src/main/java/com/yahoo/jdisc/application/MetricProvider.java @@ -21,4 +21,5 @@ public class MetricProvider implements Provider<Metric> { public Metric get() { return new MetricImpl(consumerProvider); } + } diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/core/MetricsManager.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/core/MetricsManager.java index ba51bed4407..7ce8dd12b30 100644 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/core/MetricsManager.java +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/core/MetricsManager.java @@ -79,7 +79,7 @@ public class MetricsManager { * @return metrics for all matching services */ public List<MetricsPacket> getMetrics(List<VespaService> services, Instant startTime) { - MetricsPacket.Builder [] builderArray = getMetricsBuildersAsArray(services, startTime, null); + MetricsPacket.Builder[] builderArray = getMetricsBuildersAsArray(services, startTime, null); List<MetricsPacket> metricsPackets = new ArrayList<>(builderArray.length); for (int i = 0; i < builderArray.length; i++) { metricsPackets.add(builderArray[i].build()); @@ -87,6 +87,7 @@ public class MetricsManager { } return metricsPackets; } + public List<MetricsPacket> getMetrics(List<VespaService> services, Instant startTime, ConsumerId consumerId) { MetricsPacket.Builder [] builderArray = getMetricsBuildersAsArray(services, startTime, consumerId); List<MetricsPacket> metricsPackets = new ArrayList<>(builderArray.length); |