diff options
6 files changed, 72 insertions, 2 deletions
diff --git a/node-admin/src/main/application/services.xml b/node-admin/src/main/application/services.xml index c40d1560e90..c746afa0e85 100644 --- a/node-admin/src/main/application/services.xml +++ b/node-admin/src/main/application/services.xml @@ -8,6 +8,7 @@ </handler> <component id="node-admin" class="com.yahoo.vespa.hosted.node.admin.provider.ComponentsProviderImpl" bundle="node-admin"/> <component id="docker-api" class="com.yahoo.vespa.hosted.dockerapi.DockerImpl" bundle="docker-api"/> + <component id="metrics-wrapper" class="com.yahoo.vespa.hosted.dockerapi.metrics.MetricReceiverWrapper" bundle="docker-api"/> <config name='vespa.hosted.dockerapi.docker'> <uri>tcp://localhost:2376</uri> diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/provider/ComponentsProvider.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/provider/ComponentsProvider.java index b0e07e03eea..1b05b236bb9 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/provider/ComponentsProvider.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/provider/ComponentsProvider.java @@ -2,6 +2,7 @@ package com.yahoo.vespa.hosted.node.admin.provider; import com.yahoo.vespa.hosted.node.admin.nodeadmin.NodeAdminStateUpdater; +import com.yahoo.vespa.hosted.node.admin.restapi.SecretAgentHandler; /** * Class for setting up instances of classes; enables testing. @@ -10,4 +11,6 @@ import com.yahoo.vespa.hosted.node.admin.nodeadmin.NodeAdminStateUpdater; */ public interface ComponentsProvider { NodeAdminStateUpdater getNodeAdminStateUpdater(); + + SecretAgentHandler getSecretAgentHandler(); } diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/provider/ComponentsProviderImpl.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/provider/ComponentsProviderImpl.java index f2e519f9ccf..b2b3baef5ab 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/provider/ComponentsProviderImpl.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/provider/ComponentsProviderImpl.java @@ -1,6 +1,7 @@ // Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.node.admin.provider; +import com.yahoo.vespa.hosted.dockerapi.metrics.MetricReceiverWrapper; import com.yahoo.vespa.hosted.node.admin.maintenance.MaintenanceScheduler; import com.yahoo.vespa.hosted.node.admin.maintenance.MaintenanceSchedulerImpl; import com.yahoo.vespa.hosted.node.admin.nodeadmin.NodeAdmin; @@ -14,6 +15,7 @@ import com.yahoo.vespa.hosted.node.admin.noderepository.NodeRepository; import com.yahoo.vespa.hosted.node.admin.noderepository.NodeRepositoryImpl; import com.yahoo.vespa.hosted.node.admin.orchestrator.Orchestrator; import com.yahoo.vespa.hosted.node.admin.orchestrator.OrchestratorImpl; +import com.yahoo.vespa.hosted.node.admin.restapi.SecretAgentHandler; import com.yahoo.vespa.hosted.node.admin.util.Environment; import java.util.Set; @@ -27,6 +29,7 @@ import java.util.function.Function; public class ComponentsProviderImpl implements ComponentsProvider { private final NodeAdminStateUpdater nodeAdminStateUpdater; + private final SecretAgentHandler secretAgentHandler; private static final long INITIAL_SCHEDULER_DELAY_MILLIS = 1; private static final int NODE_AGENT_SCAN_INTERVAL_MILLIS = 30000; @@ -35,7 +38,8 @@ public class ComponentsProviderImpl implements ComponentsProvider { // We only scan for new nodes within a host every 5 minutes. This is only if new nodes are added or removed // which happens rarely. Changes of apps running etc it detected by the NodeAgent. private static final int NODE_ADMIN_STATE_INTERVAL_MILLIS = 5 * 60000; - public ComponentsProviderImpl(final Docker docker) { + + public ComponentsProviderImpl(final Docker docker, final MetricReceiverWrapper metricReceiver) { String baseHostName = java.util.Optional.ofNullable(System.getenv(ENV_HOSTNAME)) .orElseThrow(() -> new IllegalStateException("Environment variable " + ENV_HOSTNAME + " unset")); @@ -51,10 +55,17 @@ public class ComponentsProviderImpl implements ComponentsProvider { final NodeAdmin nodeAdmin = new NodeAdminImpl(docker, nodeAgentFactory, maintenanceScheduler, NODE_AGENT_SCAN_INTERVAL_MILLIS); nodeAdminStateUpdater = new NodeAdminStateUpdater( nodeRepository, nodeAdmin, INITIAL_SCHEDULER_DELAY_MILLIS, NODE_ADMIN_STATE_INTERVAL_MILLIS, orchestrator, baseHostName); + + secretAgentHandler = new SecretAgentHandler(metricReceiver); } @Override public NodeAdminStateUpdater getNodeAdminStateUpdater() { return nodeAdminStateUpdater; } + + @Override + public SecretAgentHandler getSecretAgentHandler() { + return secretAgentHandler; + } } diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/restapi/RestApiHandler.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/restapi/RestApiHandler.java index 2ce4151f497..50887ca7978 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/restapi/RestApiHandler.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/restapi/RestApiHandler.java @@ -30,12 +30,14 @@ import static com.yahoo.jdisc.http.HttpRequest.Method.PUT; */ public class RestApiHandler extends LoggingRequestHandler{ - private final NodeAdminStateUpdater refresher; private final static ObjectMapper objectMapper = new ObjectMapper(); + private final NodeAdminStateUpdater refresher; + private final SecretAgentHandler secretAgentHandler; public RestApiHandler(Executor executor, AccessLog accessLog, ComponentsProvider componentsProvider) { super(executor, accessLog); this.refresher = componentsProvider.getNodeAdminStateUpdater(); + this.secretAgentHandler = componentsProvider.getSecretAgentHandler(); } @Override @@ -59,6 +61,13 @@ public class RestApiHandler extends LoggingRequestHandler{ objectMapper.writeValue(outputStream, refresher.getDebugPage()); } }; + } else if (path.endsWith("/metrics")) { + return new HttpResponse(200) { + @Override + public void render(OutputStream outputStream) throws IOException { + objectMapper.writeValue(outputStream, secretAgentHandler.getSecretAgentReport()); + } + }; } return new SimpleResponse(400, "unknown path" + path); } diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/restapi/SecretAgentHandler.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/restapi/SecretAgentHandler.java new file mode 100644 index 00000000000..7b8afd9041b --- /dev/null +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/restapi/SecretAgentHandler.java @@ -0,0 +1,40 @@ +package com.yahoo.vespa.hosted.node.admin.restapi; + +import com.google.inject.Inject; +import com.yahoo.vespa.hosted.dockerapi.metrics.MetricReceiverWrapper; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author valerijf + */ +public class SecretAgentHandler { + private final String applicationName = "node-admin"; + private final String hostName; + private final MetricReceiverWrapper metricReceiver; + + @Inject + public SecretAgentHandler(MetricReceiverWrapper metricReceiver) { + this.hostName = com.yahoo.net.HostName.getLocalhost(); + this.metricReceiver = metricReceiver; + } + + public Map<String, Object> getSecretAgentReport() { + Map<String, String> dimensions = new LinkedHashMap<>(); + dimensions.put("host", hostName); + + Map<String, Number> metrics = new LinkedHashMap<>(); + for (String metricName : metricReceiver.getMetricNames()) { + metrics.put(metricName, metricReceiver.getMetricByName(metricName).getValue()); + } + + Map<String, Object> report = new LinkedHashMap<>(); + report.put("application", applicationName); + report.put("timestamp", System.currentTimeMillis() / 1000.); + report.put("dimensions", dimensions); + report.put("metrics", metrics); + + return report; + } +} diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/ComponentsProviderWithMocks.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/ComponentsProviderWithMocks.java index 2984bbd563b..1f8d397a39e 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/ComponentsProviderWithMocks.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/ComponentsProviderWithMocks.java @@ -9,6 +9,7 @@ import com.yahoo.vespa.hosted.node.admin.nodeagent.NodeAgentImpl; import com.yahoo.vespa.hosted.dockerapi.Docker; import com.yahoo.vespa.hosted.node.admin.docker.DockerOperationsImpl; import com.yahoo.vespa.hosted.node.admin.provider.ComponentsProvider; +import com.yahoo.vespa.hosted.node.admin.restapi.SecretAgentHandler; import com.yahoo.vespa.hosted.node.admin.util.Environment; import java.util.function.Function; @@ -35,4 +36,9 @@ public class ComponentsProviderWithMocks implements ComponentsProvider { public NodeAdminStateUpdater getNodeAdminStateUpdater() { return new NodeAdminStateUpdater(nodeRepositoryMock, nodeAdmin, 1, 5, orchestratorMock, "localhost"); } + + @Override + public SecretAgentHandler getSecretAgentHandler() { + return null; + } } |