summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjørn Christian Seime <bjorncs@verizonmedia.com>2022-06-28 15:11:46 +0200
committerBjørn Christian Seime <bjorncs@verizonmedia.com>2022-06-28 15:52:33 +0200
commitea43c079fd365c2fdbf91bedf8412a903fecca9e (patch)
tree105cf3f5a25a011db3f2c3798b8644139324e50d
parent878cc49535f5ff9fe6220e31ef0afb9481c21710 (diff)
Move ApplicationStatusHandler to container-disc
-rwxr-xr-xconfig-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java4
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/container/docproc/DocprocChains.java8
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/container/search/ContainerSearch.java2
-rw-r--r--container-disc/src/main/java/com/yahoo/container/handler/observability/ApplicationStatusHandler.java (renamed from container-search-and-docproc/src/main/java/com/yahoo/container/handler/observability/ApplicationStatusHandler.java)83
-rw-r--r--container-disc/src/main/java/com/yahoo/container/handler/observability/package-info.java (renamed from container-search-and-docproc/src/main/java/com/yahoo/container/handler/observability/package-info.java)5
-rw-r--r--container-disc/src/main/resources/configdefinitions/container.handler.observability.application-userdata.def (renamed from container-search-and-docproc/src/main/resources/configdefinitions/container.handler.observability.application-userdata.def)0
-rw-r--r--container-disc/src/test/java/com/yahoo/container/handler/observability/ApplicationStatusHandlerTest.java (renamed from container-search-and-docproc/src/test/java/com/yahoo/container/handler/observability/ApplicationStatusHandlerTest.java)1
-rw-r--r--container-search/pom.xml6
-rw-r--r--container-search/src/main/java/com/yahoo/search/handler/observability/SearchStatusExtension.java33
-rw-r--r--container-search/src/main/java/com/yahoo/search/handler/observability/package-info.java8
-rw-r--r--docproc/pom.xml6
-rw-r--r--docproc/src/main/java/com/yahoo/docproc/jdisc/observability/DocprocsStatusExtension.java52
-rw-r--r--docproc/src/main/java/com/yahoo/docproc/jdisc/observability/package-info.java8
13 files changed, 160 insertions, 56 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java
index 4755f674f69..f0b1af30c88 100755
--- a/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java
@@ -227,8 +227,8 @@ public abstract class ContainerCluster<CONTAINER extends Container>
public void addApplicationStatusHandler() {
Handler<AbstractConfigProducer<?>> statusHandler = new Handler<>(
- new ComponentModel(BundleInstantiationSpecification.getInternalHandlerSpecificationFromStrings(
- APPLICATION_STATUS_HANDLER_CLASS, null), null));
+ new ComponentModel(BundleInstantiationSpecification.getFromStrings(
+ APPLICATION_STATUS_HANDLER_CLASS, null, null), null)); // null bundle, as the handler is in container-disc
statusHandler.addServerBindings(SystemBindingPattern.fromHttpPath("/ApplicationStatus"));
addComponent(statusHandler);
}
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/docproc/DocprocChains.java b/config-model/src/main/java/com/yahoo/vespa/model/container/docproc/DocprocChains.java
index 4b9897d0950..31ba195775b 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/container/docproc/DocprocChains.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/container/docproc/DocprocChains.java
@@ -3,7 +3,10 @@ package com.yahoo.vespa.model.container.docproc;
import com.yahoo.component.ComponentId;
import com.yahoo.config.model.producer.AbstractConfigProducer;
+import com.yahoo.container.bundle.BundleInstantiationSpecification;
import com.yahoo.container.jdisc.config.SessionConfig;
+import com.yahoo.docproc.jdisc.observability.DocprocsStatusExtension;
+import com.yahoo.osgi.provider.model.ComponentModel;
import com.yahoo.vespa.model.container.ApplicationContainerCluster;
import com.yahoo.vespa.model.container.ContainerCluster;
import com.yahoo.vespa.model.container.component.Component;
@@ -25,6 +28,11 @@ public class DocprocChains extends Chains<DocprocChain> {
super(parent, subId);
docprocHandler = new ProcessingHandler<>(this, "com.yahoo.docproc.jdisc.DocumentProcessingHandler");
addComponent(docprocHandler);
+ addComponent(
+ new SimpleComponent(
+ new ComponentModel(
+ BundleInstantiationSpecification.getInternalProcessingSpecificationFromStrings(
+ DocprocsStatusExtension.class.getName(), null), null)));
if (! (getParent() instanceof ApplicationContainerCluster)) {
// All application containers already have a DocumentTypeManager,
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/search/ContainerSearch.java b/config-model/src/main/java/com/yahoo/vespa/model/container/search/ContainerSearch.java
index 97c3f85dced..58151063956 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/container/search/ContainerSearch.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/container/search/ContainerSearch.java
@@ -5,6 +5,7 @@ import com.yahoo.container.QrSearchersConfig;
import com.yahoo.prelude.semantics.SemanticRulesConfig;
import com.yahoo.search.config.IndexInfoConfig;
import com.yahoo.search.config.SchemaInfoConfig;
+import com.yahoo.search.handler.observability.SearchStatusExtension;
import com.yahoo.search.pagetemplates.PageTemplatesConfig;
import com.yahoo.search.query.profile.compiled.CompiledQueryProfileRegistry;
import com.yahoo.search.query.profile.config.QueryProfilesConfig;
@@ -57,6 +58,7 @@ public class ContainerSearch extends ContainerSubsystem<SearchChains>
owningCluster.addComponent(Component.fromClassAndBundle(QUERY_PROFILE_REGISTRY_CLASS, searchAndDocprocBundle));
owningCluster.addComponent(Component.fromClassAndBundle(com.yahoo.search.schema.SchemaInfo.class.getName(), searchAndDocprocBundle));
+ owningCluster.addComponent(Component.fromClassAndBundle(SearchStatusExtension.class.getName(), searchAndDocprocBundle));
}
public void connectSearchClusters(Map<String, SearchCluster> searchClusters) {
diff --git a/container-search-and-docproc/src/main/java/com/yahoo/container/handler/observability/ApplicationStatusHandler.java b/container-disc/src/main/java/com/yahoo/container/handler/observability/ApplicationStatusHandler.java
index 09b5a6ff85e..fffb33fa796 100644
--- a/container-search-and-docproc/src/main/java/com/yahoo/container/handler/observability/ApplicationStatusHandler.java
+++ b/container-disc/src/main/java/com/yahoo/container/handler/observability/ApplicationStatusHandler.java
@@ -6,18 +6,15 @@ import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.yahoo.component.annotation.Inject;
import com.yahoo.component.AbstractComponent;
import com.yahoo.component.ComponentId;
import com.yahoo.component.Vtag;
+import com.yahoo.component.annotation.Inject;
import com.yahoo.component.chain.Chain;
import com.yahoo.component.provider.ComponentRegistry;
import com.yahoo.container.Container;
import com.yahoo.container.core.ApplicationMetadataConfig;
import com.yahoo.container.jdisc.JdiscBindingsConfig;
-import com.yahoo.docproc.Call;
-import com.yahoo.docproc.impl.DocprocService;
-import com.yahoo.docproc.jdisc.DocumentProcessingHandler;
import com.yahoo.jdisc.handler.AbstractRequestHandler;
import com.yahoo.jdisc.handler.CompletionHandler;
import com.yahoo.jdisc.handler.ContentChannel;
@@ -32,15 +29,13 @@ import com.yahoo.jdisc.service.ServerProvider;
import com.yahoo.processing.Processor;
import com.yahoo.processing.execution.chain.ChainRegistry;
import com.yahoo.processing.handler.ProcessingHandler;
-import com.yahoo.search.handler.SearchHandler;
-import com.yahoo.search.searchchain.SearchChainRegistry;
import org.osgi.framework.Bundle;
import org.osgi.framework.FrameworkUtil;
import java.nio.ByteBuffer;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Date;
-import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -49,10 +44,15 @@ import java.util.Map;
*
* @author gjoranv
* @author Einar M R Rosenvinge
+ * @author bjorncs
*/
public class ApplicationStatusHandler extends AbstractRequestHandler {
- private static final ObjectMapper jsonMapper = new ObjectMapper();
+ public interface Extension {
+ Map<String, ? extends JsonNode> produceExtraFields(ApplicationStatusHandler handler);
+ }
+
+ public static final ObjectMapper jsonMapper = new ObjectMapper();
private final JsonNode applicationJson;
private final JsonNode clientsJson;
@@ -60,6 +60,7 @@ public class ApplicationStatusHandler extends AbstractRequestHandler {
private final JsonNode requestFiltersJson;
private final JsonNode responseFiltersJson;
private final JdiscBindingsConfig bindingsConfig;
+ private final Collection<Extension> extensions;
@Inject
public ApplicationStatusHandler(ApplicationMetadataConfig metaConfig,
@@ -68,8 +69,8 @@ public class ApplicationStatusHandler extends AbstractRequestHandler {
ComponentRegistry<ClientProvider> clientProviderRegistry,
ComponentRegistry<ServerProvider> serverProviderRegistry,
ComponentRegistry<RequestFilterBase> requestFilterRegistry,
- ComponentRegistry<ResponseFilterBase> responseFilterRegistry) {
-
+ ComponentRegistry<ResponseFilterBase> responseFilterRegistry,
+ ComponentRegistry<Extension> extensions) {
applicationJson = renderApplicationConfigs(metaConfig, userConfig);
clientsJson = renderRequestHandlers(bindingsConfig, clientProviderRegistry.allComponentsById());
serversJson = renderObjectComponents(serverProviderRegistry.allComponentsById());
@@ -77,12 +78,13 @@ public class ApplicationStatusHandler extends AbstractRequestHandler {
responseFiltersJson = renderObjectComponents(responseFilterRegistry.allComponentsById());
this.bindingsConfig = bindingsConfig;
+ this.extensions = extensions.allComponents();
}
@Override
public ContentChannel handleRequest(com.yahoo.jdisc.Request request, ResponseHandler handler) {
JsonNode json = new StatusResponse(applicationJson, clientsJson, serversJson,
- requestFiltersJson, responseFiltersJson, bindingsConfig)
+ requestFiltersJson, responseFiltersJson, bindingsConfig, this, extensions)
.render();
FastContentWriter writer = new FastContentWriter(new ResponseDispatch() {
@@ -105,7 +107,7 @@ public class ApplicationStatusHandler extends AbstractRequestHandler {
}
static JsonNode renderApplicationConfigs(ApplicationMetadataConfig metaConfig,
- ApplicationUserdataConfig userConfig) {
+ ApplicationUserdataConfig userConfig) {
ObjectNode vespa = jsonMapper.createObjectNode();
vespa.put("version", Vtag.currentVersion.toString());
@@ -139,7 +141,7 @@ public class ApplicationStatusHandler extends AbstractRequestHandler {
}
static JsonNode renderRequestHandlers(JdiscBindingsConfig bindingsConfig,
- Map<ComponentId, ? extends RequestHandler> handlersById) {
+ Map<ComponentId, ? extends RequestHandler> handlersById) {
ArrayNode ret = jsonMapper.createArrayNode();
for (Map.Entry<ComponentId, ? extends RequestHandler> handlerEntry : handlersById.entrySet()) {
@@ -185,7 +187,7 @@ public class ApplicationStatusHandler extends AbstractRequestHandler {
return ret;
}
- private static ObjectNode renderComponent(Object component, ComponentId id) {
+ public static ObjectNode renderComponent(Object component, ComponentId id) {
ObjectNode jc = jsonMapper.createObjectNode();
jc.put("id", id.stringValue());
addBundleInfo(jc, component);
@@ -221,26 +223,32 @@ public class ApplicationStatusHandler extends AbstractRequestHandler {
}
}
- static final class StatusResponse {
+ public static final class StatusResponse {
private final JsonNode applicationJson;
private final JsonNode clientsJson;
private final JsonNode serversJson;
private final JsonNode requestFiltersJson;
private final JsonNode responseFiltersJson;
private final JdiscBindingsConfig bindingsConfig;
+ private final ApplicationStatusHandler handler;
+ private final Collection<Extension> extensions;
StatusResponse(JsonNode applicationJson,
JsonNode clientsJson,
JsonNode serversJson,
JsonNode requestFiltersJson,
JsonNode responseFiltersJson,
- JdiscBindingsConfig bindingsConfig) {
+ JdiscBindingsConfig bindingsConfig,
+ ApplicationStatusHandler handler,
+ Collection<Extension> extensions) {
this.applicationJson = applicationJson;
this.clientsJson = clientsJson;
this.serversJson = serversJson;
this.requestFiltersJson = requestFiltersJson;
this.responseFiltersJson = responseFiltersJson;
this.bindingsConfig = bindingsConfig;
+ this.handler = handler;
+ this.extensions = extensions;
}
public JsonNode render() {
@@ -257,34 +265,15 @@ public class ApplicationStatusHandler extends AbstractRequestHandler {
root.set("httpRequestFilters", requestFiltersJson);
root.set("httpResponseFilters", responseFiltersJson);
- root.set("searchChains", renderSearchChains(Container.get()));
- root.set("docprocChains", renderDocprocChains(Container.get()));
root.set("processingChains", renderProcessingChains(Container.get()));
+ for (Extension extension : extensions) {
+ extension.produceExtraFields(handler).forEach((field, json) -> {
+ if (root.has(field)) throw new IllegalArgumentException("Field '" + field + "' already defined");
+ root.set(field, json);
+ });
- return root;
- }
-
- private static JsonNode renderSearchChains(Container container) {
- for (RequestHandler h : container.getRequestHandlerRegistry().allComponents()) {
- if (h instanceof SearchHandler) {
- SearchChainRegistry scReg = ((SearchHandler) h).getSearchChainRegistry();
- return renderChains(scReg);
- }
- }
- return jsonMapper.createObjectNode();
- }
-
- private static JsonNode renderDocprocChains(Container container) {
- ObjectNode ret = jsonMapper.createObjectNode();
- for (RequestHandler h : container.getRequestHandlerRegistry().allComponents()) {
- if (h instanceof DocumentProcessingHandler) {
- ComponentRegistry<DocprocService> registry = ((DocumentProcessingHandler) h).getDocprocServiceRegistry();
- for (DocprocService service : registry.allComponents()) {
- ret.set(service.getId().stringValue(), renderCalls(service.getCallStack().iterator()));
- }
- }
}
- return ret;
+ return root;
}
private static JsonNode renderProcessingChains(Container container) {
@@ -299,7 +288,7 @@ public class ApplicationStatusHandler extends AbstractRequestHandler {
}
// Note the generic param here! The key to make this work is '? extends Chain', but why?
- static JsonNode renderChains(ComponentRegistry<? extends Chain<?>> chains) {
+ public static JsonNode renderChains(ComponentRegistry<? extends Chain<?>> chains) {
ObjectNode ret = jsonMapper.createObjectNode();
for (Chain<?> chain : chains.allComponents()) {
ret.set(chain.getId().stringValue(), renderAbstractComponents(chain.components()));
@@ -307,16 +296,6 @@ public class ApplicationStatusHandler extends AbstractRequestHandler {
return ret;
}
- private static JsonNode renderCalls(Iterator<Call> components) {
- ArrayNode ret = jsonMapper.createArrayNode();
- while (components.hasNext()) {
- Call c = components.next();
- JsonNode jc = renderComponent(c.getDocumentProcessor(), c.getDocumentProcessor().getId());
- ret.add(jc);
- }
- return ret;
- }
-
}
private class IgnoredContent implements ContentChannel {
diff --git a/container-search-and-docproc/src/main/java/com/yahoo/container/handler/observability/package-info.java b/container-disc/src/main/java/com/yahoo/container/handler/observability/package-info.java
index 7f9dc3d1cd9..1a669b176d0 100644
--- a/container-search-and-docproc/src/main/java/com/yahoo/container/handler/observability/package-info.java
+++ b/container-disc/src/main/java/com/yahoo/container/handler/observability/package-info.java
@@ -1,5 +1,8 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+/**
+ * @author bjorncs
+ */
@ExportPackage
package com.yahoo.container.handler.observability;
-import com.yahoo.osgi.annotation.ExportPackage;
+import com.yahoo.osgi.annotation.ExportPackage; \ No newline at end of file
diff --git a/container-search-and-docproc/src/main/resources/configdefinitions/container.handler.observability.application-userdata.def b/container-disc/src/main/resources/configdefinitions/container.handler.observability.application-userdata.def
index cde92df9ef4..cde92df9ef4 100644
--- a/container-search-and-docproc/src/main/resources/configdefinitions/container.handler.observability.application-userdata.def
+++ b/container-disc/src/main/resources/configdefinitions/container.handler.observability.application-userdata.def
diff --git a/container-search-and-docproc/src/test/java/com/yahoo/container/handler/observability/ApplicationStatusHandlerTest.java b/container-disc/src/test/java/com/yahoo/container/handler/observability/ApplicationStatusHandlerTest.java
index 317f5fc1329..2f1cbf997c1 100644
--- a/container-search-and-docproc/src/test/java/com/yahoo/container/handler/observability/ApplicationStatusHandlerTest.java
+++ b/container-disc/src/test/java/com/yahoo/container/handler/observability/ApplicationStatusHandlerTest.java
@@ -22,7 +22,6 @@ import static org.junit.Assert.assertTrue;
/**
* @author gjoranv
- * @since 5.1.10
*/
public class ApplicationStatusHandlerTest {
diff --git a/container-search/pom.xml b/container-search/pom.xml
index ccec1330d68..031d25c7d02 100644
--- a/container-search/pom.xml
+++ b/container-search/pom.xml
@@ -73,6 +73,12 @@
<scope>provided</scope>
</dependency>
<dependency>
+ <groupId>com.yahoo.vespa</groupId>
+ <artifactId>container-disc</artifactId>
+ <version>${project.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<exclusions>
diff --git a/container-search/src/main/java/com/yahoo/search/handler/observability/SearchStatusExtension.java b/container-search/src/main/java/com/yahoo/search/handler/observability/SearchStatusExtension.java
new file mode 100644
index 00000000000..aba2f9cd689
--- /dev/null
+++ b/container-search/src/main/java/com/yahoo/search/handler/observability/SearchStatusExtension.java
@@ -0,0 +1,33 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.search.handler.observability;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.yahoo.container.Container;
+import com.yahoo.container.handler.observability.ApplicationStatusHandler;
+import com.yahoo.jdisc.handler.RequestHandler;
+import com.yahoo.search.handler.SearchHandler;
+import com.yahoo.search.searchchain.SearchChainRegistry;
+
+import java.util.Map;
+
+/**
+ * @author bjorncs
+ */
+public class SearchStatusExtension implements ApplicationStatusHandler.Extension {
+
+ @Override
+ public Map<String, ? extends JsonNode> produceExtraFields(ApplicationStatusHandler handler) {
+ return Map.of("searchChains", renderSearchChains(Container.get()));
+ }
+
+ private static JsonNode renderSearchChains(Container container) {
+ for (RequestHandler h : container.getRequestHandlerRegistry().allComponents()) {
+ if (h instanceof SearchHandler) {
+ SearchChainRegistry scReg = ((SearchHandler) h).getSearchChainRegistry();
+ return ApplicationStatusHandler.StatusResponse.renderChains(scReg);
+ }
+ }
+ return ApplicationStatusHandler.jsonMapper.createObjectNode();
+ }
+
+}
diff --git a/container-search/src/main/java/com/yahoo/search/handler/observability/package-info.java b/container-search/src/main/java/com/yahoo/search/handler/observability/package-info.java
new file mode 100644
index 00000000000..baf24b4a94d
--- /dev/null
+++ b/container-search/src/main/java/com/yahoo/search/handler/observability/package-info.java
@@ -0,0 +1,8 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+/**
+ * @author bjorncs
+ */
+@ExportPackage
+package com.yahoo.search.handler.observability;
+
+import com.yahoo.osgi.annotation.ExportPackage; \ No newline at end of file
diff --git a/docproc/pom.xml b/docproc/pom.xml
index e7d8d6e3a3e..d656559d5ec 100644
--- a/docproc/pom.xml
+++ b/docproc/pom.xml
@@ -48,6 +48,12 @@
</dependency>
<dependency>
<groupId>com.yahoo.vespa</groupId>
+ <artifactId>container-disc</artifactId>
+ <version>${project.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.yahoo.vespa</groupId>
<artifactId>container-messagebus</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
diff --git a/docproc/src/main/java/com/yahoo/docproc/jdisc/observability/DocprocsStatusExtension.java b/docproc/src/main/java/com/yahoo/docproc/jdisc/observability/DocprocsStatusExtension.java
new file mode 100644
index 00000000000..91d1fa8457b
--- /dev/null
+++ b/docproc/src/main/java/com/yahoo/docproc/jdisc/observability/DocprocsStatusExtension.java
@@ -0,0 +1,52 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.docproc.jdisc.observability;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.yahoo.component.provider.ComponentRegistry;
+import com.yahoo.container.Container;
+import com.yahoo.container.handler.observability.ApplicationStatusHandler;
+import com.yahoo.docproc.Call;
+import com.yahoo.docproc.impl.DocprocService;
+import com.yahoo.docproc.jdisc.DocumentProcessingHandler;
+import com.yahoo.jdisc.handler.RequestHandler;
+
+import java.util.Iterator;
+import java.util.Map;
+
+
+/**
+ * @author bjorncs
+ */
+public class DocprocsStatusExtension implements ApplicationStatusHandler.Extension {
+
+ @Override
+ public Map<String, ? extends JsonNode> produceExtraFields(ApplicationStatusHandler handler) {
+ return Map.of("docprocChains", renderDocprocChains(Container.get()));
+ }
+
+ private static JsonNode renderDocprocChains(Container container) {
+ ObjectNode ret = ApplicationStatusHandler.jsonMapper.createObjectNode();
+ for (RequestHandler h : container.getRequestHandlerRegistry().allComponents()) {
+ if (h instanceof DocumentProcessingHandler) {
+ ComponentRegistry<DocprocService> registry = ((DocumentProcessingHandler) h).getDocprocServiceRegistry();
+ for (DocprocService service : registry.allComponents()) {
+ ret.set(service.getId().stringValue(), renderCalls(service.getCallStack().iterator()));
+ }
+ }
+ }
+ return ret;
+ }
+
+ private static JsonNode renderCalls(Iterator<Call> components) {
+ ArrayNode ret = ApplicationStatusHandler.jsonMapper.createArrayNode();
+ while (components.hasNext()) {
+ Call c = components.next();
+ JsonNode jc = ApplicationStatusHandler.renderComponent(c.getDocumentProcessor(), c.getDocumentProcessor().getId());
+ ret.add(jc);
+ }
+ return ret;
+ }
+
+}
diff --git a/docproc/src/main/java/com/yahoo/docproc/jdisc/observability/package-info.java b/docproc/src/main/java/com/yahoo/docproc/jdisc/observability/package-info.java
new file mode 100644
index 00000000000..0040acf1fdc
--- /dev/null
+++ b/docproc/src/main/java/com/yahoo/docproc/jdisc/observability/package-info.java
@@ -0,0 +1,8 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+/**
+ * @author bjorncs
+ */
+@ExportPackage
+package com.yahoo.docproc.jdisc.observability;
+
+import com.yahoo.osgi.annotation.ExportPackage; \ No newline at end of file