summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandler.java13
-rw-r--r--container-core/src/main/java/com/yahoo/container/handler/LogHandler.java40
-rw-r--r--container-core/src/main/java/com/yahoo/container/handler/LogReader.java41
-rw-r--r--container-core/src/test/java/com/yahoo/container/handler/LogReaderTest.java12
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java8
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());