aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvalerijf <valerijf@yahoo-inc.com>2016-09-27 09:41:51 +0200
committervalerijf <valerijf@yahoo-inc.com>2016-09-29 09:45:46 +0200
commit5da079ece24d5c4d456cef15906a31fb75336263 (patch)
treee490ab45444d8bf70c7fcf0a38f0e42b49328b2f
parent93434d0455c70863cd47ceb89b4494c31b787793 (diff)
Added REST call to display metrics in secret-agent desired format
-rw-r--r--node-admin/src/main/application/services.xml1
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/provider/ComponentsProvider.java3
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/provider/ComponentsProviderImpl.java13
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/restapi/RestApiHandler.java11
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/restapi/SecretAgentHandler.java40
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integrationTests/ComponentsProviderWithMocks.java6
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;
+ }
}