summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java4
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandler.java3
-rw-r--r--container-core/src/main/java/com/yahoo/container/handler/LogHandler.java9
-rw-r--r--container-core/src/main/java/com/yahoo/container/handler/LogReader.java32
-rw-r--r--container-core/src/test/java/com/yahoo/container/handler/LogReaderTest.java3
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/ConfigServer.java2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java7
7 files changed, 48 insertions, 12 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java b/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java
index 6a55fb77933..6ed496a56fb 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java
@@ -483,8 +483,8 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye
// ---------------- Logs ----------------------------------------------------------------
- public HttpResponse getLogs(ApplicationId applicationId) {
- String logServerHostName = getLogServerURI(applicationId);
+ public HttpResponse getLogs(ApplicationId applicationId, String apiParams) {
+ String logServerHostName = getLogServerURI(applicationId) + "/" + apiParams;
LogRetriever logRetriever = new LogRetriever();
return logRetriever.getLogs(logServerHostName);
}
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandler.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandler.java
index b65cb370f93..2702bbdbc6e 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandler.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandler.java
@@ -97,7 +97,8 @@ public class ApplicationHandler extends HttpHandler {
}
if (isLogRequest(request)) {
- return applicationRepository.getLogs(applicationId);
+ String apiParams = request.hasProperty("numberOf") ? request.getProperty("numberOfLogs") : "";
+ return applicationRepository.getLogs(applicationId, apiParams);
}
return new GetApplicationResponse(Response.Status.OK, applicationRepository.getApplicationGeneration(applicationId));
diff --git a/container-core/src/main/java/com/yahoo/container/handler/LogHandler.java b/container-core/src/main/java/com/yahoo/container/handler/LogHandler.java
index 4183b642af1..a6918ed0442 100644
--- a/container-core/src/main/java/com/yahoo/container/handler/LogHandler.java
+++ b/container-core/src/main/java/com/yahoo/container/handler/LogHandler.java
@@ -24,9 +24,16 @@ public class LogHandler extends ThreadedHttpRequestHandler {
@Override
public HttpResponse handle(HttpRequest request) {
JSONObject logJson;
+ LogReader logReader;
try {
- logJson = LogReader.readLogs(LOG_DIRECTORY);
+ if (request.hasProperty("numberOfLogs")) {
+ int numberOfLogs = (Integer.valueOf(request.getProperty("numberOfLogs")));
+ logReader = new LogReader(numberOfLogs);
+ } else {
+ logReader = new LogReader();
+ }
+ logJson = logReader.readLogs(LOG_DIRECTORY);
} catch (IOException | JSONException e) {
return new HttpResponse(404) {
@Override
diff --git a/container-core/src/main/java/com/yahoo/container/handler/LogReader.java b/container-core/src/main/java/com/yahoo/container/handler/LogReader.java
index eb00446dd0e..9ac40158e07 100644
--- a/container-core/src/main/java/com/yahoo/container/handler/LogReader.java
+++ b/container-core/src/main/java/com/yahoo/container/handler/LogReader.java
@@ -7,21 +7,42 @@ import javax.xml.bind.DatatypeConverter;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
+import java.util.Arrays;
+import java.util.Comparator;
public class LogReader {
- protected static JSONObject readLogs(String logDirectory) throws IOException, JSONException {
+ int numberOfLogs;
+
+ public LogReader() {
+ this.numberOfLogs = -1;
+ }
+
+ public LogReader(int numberOfLogs) {
+ this.numberOfLogs = numberOfLogs;
+ }
+
+ protected JSONObject readLogs(String logDirectory) throws IOException, JSONException {
JSONObject json = new JSONObject();
File root = new File(logDirectory);
traverse_folder(root, json);
return json;
}
- private static void traverse_folder(File root, JSONObject json) throws IOException, JSONException {
- for(File child : root.listFiles()) {
+ private void traverse_folder(File root, JSONObject json) throws IOException, JSONException {
+ File[] files = root.listFiles();
+ Arrays.sort(files,new Comparator<File>(){
+ public int compare(File f1, File f2)
+ {
+ return Long.valueOf(f1.lastModified()).compareTo(f2.lastModified());
+ } });
+ Arrays.sort(files, Comparator.reverseOrder());
+ for(File child : files) {
+ if (numberOfLogs == 0) return;
JSONObject childJson = new JSONObject();
if(child.isFile()) {
json.put(child.getName(), DatatypeConverter.printBase64Binary(Files.readAllBytes(child.toPath())));
+ decrementLogNumber();
}
else {
json.put(child.getName(), childJson);
@@ -29,4 +50,9 @@ public class LogReader {
}
}
}
+
+ private void decrementLogNumber() {
+ numberOfLogs -= 1;
+ }
+
}
diff --git a/container-core/src/test/java/com/yahoo/container/handler/LogReaderTest.java b/container-core/src/test/java/com/yahoo/container/handler/LogReaderTest.java
index e5302ee43ee..aaa58a5004c 100644
--- a/container-core/src/test/java/com/yahoo/container/handler/LogReaderTest.java
+++ b/container-core/src/test/java/com/yahoo/container/handler/LogReaderTest.java
@@ -20,7 +20,8 @@ public class LogReaderTest {
@Test
public void testThatFilesAreWrittenCorrectlyToOutputStream() throws Exception{
String logDirectory = "src/test/resources/logfolder/";
- JSONObject json = LogReader.readLogs(logDirectory);
+ LogReader logReader = new LogReader(2);
+ JSONObject json = logReader.readLogs(logDirectory);
String expected = "{\"subfolder\":{\"log2.log\":\"VGhpcyBpcyBhbm90aGVyIGxvZyBmaWxl\"},\"log1.log\":\"VGhpcyBpcyBvbmUgbG9nIGZpbGU=\"}";
String actual = json.toString();
assertEquals(expected, actual);
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/ConfigServer.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/ConfigServer.java
index eb10c78f891..50749f3da82 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/ConfigServer.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/ConfigServer.java
@@ -42,7 +42,7 @@ public interface ConfigServer {
Map<?,?> getServiceApiResponse(String tenantName, String applicationName, String instanceName, String environment, String region, String serviceName, String restPath);
- HttpResponse getLogs(DeploymentId deployment);
+ HttpResponse getLogs(DeploymentId deployment, String apiParams);
/**
* Set new status on en endpoint in one zone.
*
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java
index 034db3d487d..b55b8025713 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java
@@ -168,7 +168,7 @@ public class ApplicationApiHandler extends LoggingRequestHandler {
if (path.matches("/application/v4/tenant/{tenant}")) return tenant(path.get("tenant"), request);
if (path.matches("/application/v4/tenant/{tenant}/application")) return applications(path.get("tenant"), request);
if (path.matches("/application/v4/tenant/{tenant}/application/{application}")) return application(path.get("tenant"), path.get("application"), request);
- if (path.matches("/application/v4/tenant/{tenant}/application/{application}/environment/{environment}/region/{region}/instance/{instance}/logs")) return logs(path.get("tenant"), path.get("application"), path.get("instance"), path.get("environment"), path.get("region"));
+ if (path.matches("/application/v4/tenant/{tenant}/application/{application}/environment/{environment}/region/{region}/instance/{instance}/logs")) return logs(path.get("tenant"), path.get("application"), path.get("instance"), path.get("environment"), path.get("region"), request);
if (path.matches("/application/v4/tenant/{tenant}/application/{application}/instance/{instance}/job")) return JobControllerApiHandlerHelper.jobTypeResponse(controller, appIdFromPath(path), request.getUri());
if (path.matches("/application/v4/tenant/{tenant}/application/{application}/instance/{instance}/job/{jobtype}")) return JobControllerApiHandlerHelper.runResponse(controller.jobController().runs(appIdFromPath(path), jobTypeFromPath(path)), request.getUri());
if (path.matches("/application/v4/tenant/{tenant}/application/{application}/instance/{instance}/job/{jobtype}/run/{number}")) return JobControllerApiHandlerHelper.runDetailsResponse(controller.jobController(), runIdFromPath(path), request.getProperty("after"));
@@ -346,11 +346,12 @@ public class ApplicationApiHandler extends LoggingRequestHandler {
return new SlimeJsonResponse(slime);
}
- private HttpResponse logs(String tenantName, String applicationName, String instanceName, String environment, String region) {
+ private HttpResponse logs(String tenantName, String applicationName, String instanceName, String environment, String region, HttpRequest request) {
+ String apiParams = request.hasProperty("numberOfLogs") ? request.getProperty("numberOfLogs") : "";
ApplicationId application = ApplicationId.from(tenantName, applicationName, instanceName);
ZoneId zone = ZoneId.from(environment, region);
DeploymentId deployment = new DeploymentId(application, zone);
- return controller.configServer().getLogs(deployment);
+ return controller.configServer().getLogs(deployment, apiParams);
}