aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2023-03-03 15:16:12 +0100
committerJon Bratseth <bratseth@gmail.com>2023-03-03 15:16:12 +0100
commit47188f0c7749ec328e4f9bc555c44b8ab2b90182 (patch)
tree8216de8385b45ed52364c8e52ae92f00d86c7e1f
parentf3d1ec3b144acbfde712a6cd61a5ff47e1ecf1b1 (diff)
Use the metric provider returned after configuration
-rw-r--r--application/src/main/java/com/yahoo/application/Application.java2
-rw-r--r--application/src/test/java/com/yahoo/application/ApplicationTest.java22
-rw-r--r--application/src/test/java/com/yahoo/application/container/components/ComponentWithMetrics.java27
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/admin/metricsproxy/MetricsProxyContainerCluster.java2
-rw-r--r--container-core/src/main/java/com/yahoo/metrics/simple/MetricAggregator.java4
-rw-r--r--container-core/src/main/java/com/yahoo/metrics/simple/MetricReceiver.java265
-rw-r--r--container-core/src/main/java/com/yahoo/metrics/simple/jdisc/SimpleMetricConsumer.java2
-rw-r--r--container-disc/src/main/java/com/yahoo/container/jdisc/ConfiguredApplication.java7
-rw-r--r--jdisc_core/src/main/java/com/yahoo/jdisc/application/MetricProvider.java1
-rw-r--r--metrics-proxy/src/main/java/ai/vespa/metricsproxy/core/MetricsManager.java3
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);