diff options
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); } |