Skip to content
This repository has been archived by the owner on Jan 8, 2019. It is now read-only.

Commit

Permalink
Merge pull request #1590 from Graylog2/issue-1589
Browse files Browse the repository at this point in the history
Improve error handling on dashboard widgets
  • Loading branch information
kroepke committed Sep 2, 2015
2 parents 07c8c27 + 0b2553d commit 6eab898
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 7 deletions.
15 changes: 13 additions & 2 deletions app/assets/stylesheets/graylog2.less
Expand Up @@ -1270,7 +1270,7 @@ dl.metric-histogram dd {
}

.dashboard .widget .number .value {
line-height: 90px;
line-height: 100px;
text-align: center;
font-size: 70px;
position: relative;
Expand Down Expand Up @@ -1331,10 +1331,21 @@ dl.metric-histogram dd {
padding: 0 5px 0 5px;
}

.dashboard .widget .loading {
.dashboard .widget .not-available {
font-size: 70px;
}

.dashboard .widget .loading,
.dashboard .widget .not-available {
line-height: 100px;
text-align: center;
}

.dashboard .widget .loading .spinner,
.dashboard .widget .not-available .spinner {
vertical-align: middle;
}

/* End new widgets */

.configuration-field-optional {
Expand Down
16 changes: 12 additions & 4 deletions app/controllers/api/DashboardsApiController.java
Expand Up @@ -17,12 +17,14 @@

package controllers.api;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.net.MediaType;
import controllers.AuthenticatedController;
import lib.ApiErrorMessage;
import lib.json.Json;
import lib.security.RestPermissions;
import org.graylog2.rest.models.dashboards.requests.AddWidgetRequest;
Expand Down Expand Up @@ -69,10 +71,12 @@

public class DashboardsApiController extends AuthenticatedController {
private final DashboardService dashboardService;
private final ObjectMapper mapper;

@Inject
public DashboardsApiController(DashboardService dashboardService) {
public DashboardsApiController(DashboardService dashboardService, ObjectMapper mapper) {
this.dashboardService = dashboardService;
this.mapper = mapper;
}

public Result index() {
Expand Down Expand Up @@ -253,10 +257,14 @@ public Result widgetValue(String dashboardId, String widgetId, int resolution) {

return ok(Json.toJsonString(result)).as(MediaType.JSON_UTF_8.toString());
} catch (APIException e) {
String message = "Could not get dashboard. We expected HTTP 200, but got a HTTP " + e.getHttpCode() + ".";
return status(504, views.html.errors.error.render(message, e, request()));
try {
final ApiErrorMessage apiErrorMessage = mapper.readValue(e.getResponseBody(), ApiErrorMessage.class);
return status(e.getHttpCode(), apiErrorMessage.message);
} catch (IOException e1) {
return status(504, e.getMessage());
}
} catch (IOException e) {
return status(504, views.html.errors.error.render(ApiClient.ERROR_MSG_IO, e, request()));
return status(504, e.getMessage());
}
}

Expand Down
9 changes: 8 additions & 1 deletion javascript/src/components/widgets/Widget.jsx
Expand Up @@ -121,9 +121,12 @@ var Widget = React.createClass({

var dataPromise = WidgetsStore.loadValue(this.props.dashboardId, this.props.widgetId, width);
dataPromise.fail((jqXHR, textStatus, errorThrown) => {
var error = jqXHR.responseText === "" || jqXHR.responseText === "\"\"" ? errorThrown : jqXHR.responseText;
var newResult = this.state.result === undefined ? "N/A" : this.state.result;
this.setState({
result: newResult,
error: true,
errorMessage: "Error loading widget value: " + errorThrown
errorMessage: "Error loading widget value: " + error
});
});
dataPromise.done((value) => {
Expand Down Expand Up @@ -160,6 +163,10 @@ var Widget = React.createClass({
</div>;
}

if (this.state.result === "N/A") {
return <div className="not-available">{this.state.result}</div>;
}

var visualization;

switch (this.state.type) {
Expand Down

0 comments on commit 6eab898

Please sign in to comment.