diff options
5 files changed, 70 insertions, 44 deletions
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 2702bbdbc6e..746ed8635e0 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,16 @@ public class ApplicationHandler extends HttpHandler { } if (isLogRequest(request)) { - String apiParams = request.hasProperty("numberOf") ? request.getProperty("numberOfLogs") : ""; + String apiParams = "?"; + if (request.hasProperty("from")) { + apiParams = apiParams + "from=" + request.getProperty("from") + "&"; + } + if (request.hasProperty("to")) { + apiParams = apiParams + "to=" + request.getProperty("to"); + } + StringBuilder api = new StringBuilder("?"); + request.propertyMap().entrySet().stream().forEach(entry -> api.append(entry.getKey() + "=" + entry.getValue() + "&")); + apiParams = getPathSuffix(request); return applicationRepository.getLogs(applicationId, apiParams); } @@ -146,7 +155,7 @@ public class ApplicationHandler extends HttpHandler { "http://*/application/v2/tenant/*/application/*/environment/*/region/*/instance/*/clustercontroller/*/status/*", "http://*/application/v2/tenant/*/application/*/environment/*/region/*/instance/*", "http://*/application/v2/tenant/*/application/*", - "http://*/application/v2/tenant/*/application/*/logs"); + "http://*/application/v2/tenant/*/application/*/logs/*"); } private static boolean isLogRequest(HttpRequest request) { 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 a6918ed0442..16f1b3ac62c 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 @@ -10,11 +10,14 @@ import org.json.JSONObject; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; +import java.net.URI; +import java.util.Arrays; +import java.util.HashMap; import java.util.concurrent.Executor; public class LogHandler extends ThreadedHttpRequestHandler { - private static final String LOG_DIRECTORY = "/home/y/logs/vespa/"; + private static final String LOG_DIRECTORY = "/home/y/logs/vespa/logarchive/"; @Inject public LogHandler(Executor executor) { @@ -24,15 +27,12 @@ public class LogHandler extends ThreadedHttpRequestHandler { @Override public HttpResponse handle(HttpRequest request) { JSONObject logJson; - LogReader logReader; + HashMap<String, String> apiParams = getParameters(request); + long earliestLogThreshold = getEarliestThreshold(apiParams); + long latestLogThreshold = getLatestThreshold(apiParams); + LogReader logReader= new LogReader(earliestLogThreshold, latestLogThreshold); try { - 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) { @@ -49,4 +49,28 @@ public class LogHandler extends ThreadedHttpRequestHandler { } }; } + + private HashMap<String, String> getParameters(HttpRequest request) { + String query = request.getUri().getQuery(); + HashMap<String, String> keyValPair = new HashMap<>(); + Arrays.stream(query.split("&")).forEach(pair -> { + String[] splitPair = pair.split("="); + keyValPair.put(splitPair[0], splitPair[1]); + }); + return keyValPair; + } + + private long getEarliestThreshold(HashMap<String, String> map) { + if (map.containsKey("from")) { + return Long.valueOf(map.get("from")); + } + return Long.MIN_VALUE; + } + + private long getLatestThreshold(HashMap<String, String> map) { + if (map.containsKey("to")) { + return Long.valueOf(map.get("to")); + } + return Long.MAX_VALUE; + } } 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 9ac40158e07..2483f2497d0 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,52 +7,37 @@ 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 { - int numberOfLogs; + long earliestLogThreshold; + long latestLogThreshold; - public LogReader() { - this.numberOfLogs = -1; - } - - public LogReader(int numberOfLogs) { - this.numberOfLogs = numberOfLogs; + public LogReader(long earliestLogThreshold, long latestLogThreshold) { + this.earliestLogThreshold = earliestLogThreshold; + this.latestLogThreshold = latestLogThreshold; } protected JSONObject readLogs(String logDirectory) throws IOException, JSONException { JSONObject json = new JSONObject(); File root = new File(logDirectory); - traverse_folder(root, json); + traverse_folder(root, json, ""); return json; } - private void traverse_folder(File root, JSONObject json) throws IOException, JSONException { + private void traverse_folder(File root, JSONObject json, String filename) 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; + File temp = child; JSONObject childJson = new JSONObject(); - if(child.isFile()) { - json.put(child.getName(), DatatypeConverter.printBase64Binary(Files.readAllBytes(child.toPath()))); - decrementLogNumber(); + long logTime = child.lastModified(); + if(child.isFile() && earliestLogThreshold < logTime && logTime < latestLogThreshold) { + json.put(filename + child.getName(), DatatypeConverter.printBase64Binary(Files.readAllBytes(child.toPath()))); } - else { - json.put(child.getName(), childJson); - traverse_folder(child, childJson); + else if (!child.isFile()){ + traverse_folder(child, json, filename + child.getName() + "-"); } } } - 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 aaa58a5004c..1a8d5680882 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,10 +20,20 @@ public class LogReaderTest { @Test public void testThatFilesAreWrittenCorrectlyToOutputStream() throws Exception{ String logDirectory = "src/test/resources/logfolder/"; - LogReader logReader = new LogReader(2); + LogReader logReader = new LogReader(21, Long.MAX_VALUE); JSONObject json = logReader.readLogs(logDirectory); String expected = "{\"subfolder\":{\"log2.log\":\"VGhpcyBpcyBhbm90aGVyIGxvZyBmaWxl\"},\"log1.log\":\"VGhpcyBpcyBvbmUgbG9nIGZpbGU=\"}"; String actual = json.toString(); assertEquals(expected, actual); } + + @Test + public void testThatLogsOutsideRangeAreExcluded() throws Exception { + String logDirectory = "src/test/resources/logfolder/"; + LogReader logReader = new LogReader(Long.MAX_VALUE, Long.MIN_VALUE); + JSONObject json = logReader.readLogs(logDirectory); + String expected = "{}"; + String actual = json.toString(); + assertEquals(expected, actual); + } }
\ No newline at end of file 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 b55b8025713..f3135d7b0af 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"), 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"), path.getRest()); 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,15 +346,13 @@ public class ApplicationApiHandler extends LoggingRequestHandler { return new SlimeJsonResponse(slime); } - private HttpResponse logs(String tenantName, String applicationName, String instanceName, String environment, String region, HttpRequest request) { - String apiParams = request.hasProperty("numberOfLogs") ? request.getProperty("numberOfLogs") : ""; + private HttpResponse logs(String tenantName, String applicationName, String instanceName, String environment, String region, String apiParams) { ApplicationId application = ApplicationId.from(tenantName, applicationName, instanceName); ZoneId zone = ZoneId.from(environment, region); DeploymentId deployment = new DeploymentId(application, zone); - return controller.configServer().getLogs(deployment, apiParams); + return controller.configServer().getLogs(deployment,apiParams); } - private void toSlime(Cursor object, Application application, HttpRequest request) { object.setString("application", application.id().application().value()); object.setString("instance", application.id().instance().value()); |