Let the xcontent type of alert history documents be based on the xcontent type of alert documents.
Closes elastic/elasticsearch#54 Original commit: elastic/x-pack-elasticsearch@e03bf5d3bf
This commit is contained in:
parent
c094430584
commit
8910a1f284
|
@ -12,6 +12,7 @@ import org.elasticsearch.common.joda.time.DateTime;
|
||||||
import org.elasticsearch.common.unit.TimeValue;
|
import org.elasticsearch.common.unit.TimeValue;
|
||||||
import org.elasticsearch.common.xcontent.ToXContent;
|
import org.elasticsearch.common.xcontent.ToXContent;
|
||||||
import org.elasticsearch.common.xcontent.XContentBuilder;
|
import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||||
|
import org.elasticsearch.common.xcontent.XContentType;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -26,12 +27,14 @@ public class Alert implements ToXContent {
|
||||||
private List<AlertAction> actions;
|
private List<AlertAction> actions;
|
||||||
private String schedule;
|
private String schedule;
|
||||||
private DateTime lastExecuteTime;
|
private DateTime lastExecuteTime;
|
||||||
private long version;
|
|
||||||
private TimeValue throttlePeriod = new TimeValue(0);
|
private TimeValue throttlePeriod = new TimeValue(0);
|
||||||
private DateTime timeLastActionExecuted = null;
|
private DateTime timeLastActionExecuted = null;
|
||||||
private AlertAckState ackState = AlertAckState.NOT_ACKABLE;
|
private AlertAckState ackState = AlertAckState.NOT_ACKABLE;
|
||||||
private Map<String,Object> metadata = null;
|
private Map<String,Object> metadata = null;
|
||||||
|
|
||||||
|
private transient long version;
|
||||||
|
private transient XContentType contentType;
|
||||||
|
|
||||||
public Alert() {
|
public Alert() {
|
||||||
actions = new ArrayList<>();
|
actions = new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
@ -110,6 +113,17 @@ public class Alert implements ToXContent {
|
||||||
this.version = version;
|
this.version = version;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setContentType(XContentType contentType) {
|
||||||
|
this.contentType = contentType;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return xcontext type of the _source of this action entry.
|
||||||
|
*/
|
||||||
|
public XContentType getContentType() {
|
||||||
|
return contentType;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return The unique name of this alert.
|
* @return The unique name of this alert.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -31,6 +31,7 @@ import org.elasticsearch.common.lucene.uid.Versions;
|
||||||
import org.elasticsearch.common.settings.Settings;
|
import org.elasticsearch.common.settings.Settings;
|
||||||
import org.elasticsearch.common.unit.TimeValue;
|
import org.elasticsearch.common.unit.TimeValue;
|
||||||
import org.elasticsearch.common.util.concurrent.ConcurrentCollections;
|
import org.elasticsearch.common.util.concurrent.ConcurrentCollections;
|
||||||
|
import org.elasticsearch.common.xcontent.XContentFactory;
|
||||||
import org.elasticsearch.common.xcontent.XContentHelper;
|
import org.elasticsearch.common.xcontent.XContentHelper;
|
||||||
import org.elasticsearch.common.xcontent.XContentParser;
|
import org.elasticsearch.common.xcontent.XContentParser;
|
||||||
import org.elasticsearch.search.SearchHit;
|
import org.elasticsearch.search.SearchHit;
|
||||||
|
@ -40,8 +41,6 @@ import java.util.List;
|
||||||
import java.util.concurrent.ConcurrentMap;
|
import java.util.concurrent.ConcurrentMap;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
public class AlertsStore extends AbstractComponent {
|
public class AlertsStore extends AbstractComponent {
|
||||||
|
@ -110,8 +109,7 @@ public class AlertsStore extends AbstractComponent {
|
||||||
*/
|
*/
|
||||||
public void updateAlert(Alert alert) throws IOException {
|
public void updateAlert(Alert alert) throws IOException {
|
||||||
ensureStarted();
|
ensureStarted();
|
||||||
// TODO: the content type should be based on the provided content type when the alert was initially added.
|
BytesReference source = XContentFactory.contentBuilder(alert.getContentType()).value(alert).bytes();
|
||||||
BytesReference source = jsonBuilder().value(alert).bytes();
|
|
||||||
IndexResponse response = client.index(createIndexRequest(alert.alertName(), source)).actionGet();
|
IndexResponse response = client.index(createIndexRequest(alert.alertName(), source)).actionGet();
|
||||||
alert.version(response.getVersion());
|
alert.version(response.getVersion());
|
||||||
// Don't need to update the alertMap, since we are working on an instance from it.
|
// Don't need to update the alertMap, since we are working on an instance from it.
|
||||||
|
@ -241,6 +239,8 @@ public class AlertsStore extends AbstractComponent {
|
||||||
Alert alert = new Alert();
|
Alert alert = new Alert();
|
||||||
alert.alertName(alertName);
|
alert.alertName(alertName);
|
||||||
try (XContentParser parser = XContentHelper.createParser(source)) {
|
try (XContentParser parser = XContentHelper.createParser(source)) {
|
||||||
|
alert.setContentType(parser.contentType());
|
||||||
|
|
||||||
String currentFieldName = null;
|
String currentFieldName = null;
|
||||||
XContentParser.Token token = parser.nextToken();
|
XContentParser.Token token = parser.nextToken();
|
||||||
assert token == XContentParser.Token.START_OBJECT;
|
assert token == XContentParser.Token.START_OBJECT;
|
||||||
|
|
|
@ -12,6 +12,7 @@ import org.elasticsearch.alerts.triggers.AlertTrigger;
|
||||||
import org.elasticsearch.common.joda.time.DateTime;
|
import org.elasticsearch.common.joda.time.DateTime;
|
||||||
import org.elasticsearch.common.xcontent.ToXContent;
|
import org.elasticsearch.common.xcontent.ToXContent;
|
||||||
import org.elasticsearch.common.xcontent.XContentBuilder;
|
import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||||
|
import org.elasticsearch.common.xcontent.XContentType;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -23,28 +24,29 @@ import java.util.Map;
|
||||||
public class AlertActionEntry implements ToXContent {
|
public class AlertActionEntry implements ToXContent {
|
||||||
|
|
||||||
private String id;
|
private String id;
|
||||||
private long version;
|
|
||||||
private String alertName;
|
private String alertName;
|
||||||
|
|
||||||
private DateTime fireTime;
|
private DateTime fireTime;
|
||||||
|
|
||||||
private DateTime scheduledTime;
|
private DateTime scheduledTime;
|
||||||
private AlertTrigger trigger;
|
private AlertTrigger trigger;
|
||||||
private List<AlertAction> actions;
|
private List<AlertAction> actions;
|
||||||
private AlertActionState state;
|
private AlertActionState state;
|
||||||
private SearchRequest searchRequest;
|
private SearchRequest searchRequest;
|
||||||
|
|
||||||
/*Optional*/
|
/*Optional*/
|
||||||
private Map<String, Object> searchResponse;
|
private Map<String, Object> searchResponse;
|
||||||
|
|
||||||
private boolean triggered;
|
private boolean triggered;
|
||||||
private String errorMsg;
|
private String errorMsg;
|
||||||
private Map<String,Object> metadata;
|
private Map<String,Object> metadata;
|
||||||
|
|
||||||
|
private transient long version;
|
||||||
|
private transient XContentType contentType;
|
||||||
|
|
||||||
AlertActionEntry() {
|
AlertActionEntry() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public AlertActionEntry(Alert alert, DateTime scheduledTime, DateTime fireTime, AlertActionState state) throws IOException {
|
public AlertActionEntry(Alert alert, DateTime scheduledTime, DateTime fireTime, AlertActionState state) throws IOException {
|
||||||
this.id = alert.alertName() + "#" + scheduledTime.toDateTimeISO();
|
this.id = alert.alertName() + "#" + scheduledTime.toDateTimeISO();
|
||||||
this.version = 1;
|
|
||||||
this.alertName = alert.alertName();
|
this.alertName = alert.alertName();
|
||||||
this.fireTime = fireTime;
|
this.fireTime = fireTime;
|
||||||
this.scheduledTime = scheduledTime;
|
this.scheduledTime = scheduledTime;
|
||||||
|
@ -52,6 +54,10 @@ public class AlertActionEntry implements ToXContent {
|
||||||
this.actions = alert.actions();
|
this.actions = alert.actions();
|
||||||
this.state = state;
|
this.state = state;
|
||||||
this.searchRequest = alert.getSearchRequest();
|
this.searchRequest = alert.getSearchRequest();
|
||||||
|
this.metadata = alert.getMetadata();
|
||||||
|
|
||||||
|
this.version = 1;
|
||||||
|
this.contentType = alert.getContentType();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -172,6 +178,17 @@ public class AlertActionEntry implements ToXContent {
|
||||||
this.version = version;
|
this.version = version;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return xcontext type of the _source of this action entry.
|
||||||
|
*/
|
||||||
|
public XContentType getContentType() {
|
||||||
|
return contentType;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setContentType(XContentType contentType) {
|
||||||
|
this.contentType = contentType;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return The error if an error occured otherwise null
|
* @return The error if an error occured otherwise null
|
||||||
*/
|
*/
|
||||||
|
@ -194,8 +211,6 @@ public class AlertActionEntry implements ToXContent {
|
||||||
this.metadata = metadata;
|
this.metadata = metadata;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public XContentBuilder toXContent(XContentBuilder historyEntry, Params params) throws IOException {
|
public XContentBuilder toXContent(XContentBuilder historyEntry, Params params) throws IOException {
|
||||||
historyEntry.startObject();
|
historyEntry.startObject();
|
||||||
|
|
|
@ -206,6 +206,8 @@ public class AlertActionManager extends AbstractComponent {
|
||||||
entry.setVersion(version);
|
entry.setVersion(version);
|
||||||
|
|
||||||
try (XContentParser parser = XContentHelper.createParser(source)) {
|
try (XContentParser parser = XContentHelper.createParser(source)) {
|
||||||
|
entry.setContentType(parser.contentType());
|
||||||
|
|
||||||
String currentFieldName = null;
|
String currentFieldName = null;
|
||||||
XContentParser.Token token = parser.nextToken();
|
XContentParser.Token token = parser.nextToken();
|
||||||
assert token == XContentParser.Token.START_OBJECT;
|
assert token == XContentParser.Token.START_OBJECT;
|
||||||
|
@ -269,11 +271,8 @@ public class AlertActionManager extends AbstractComponent {
|
||||||
logger.debug("Adding alert action for alert [{}]", alert.alertName());
|
logger.debug("Adding alert action for alert [{}]", alert.alertName());
|
||||||
String alertHistoryIndex = getAlertHistoryIndexNameForTime(scheduledFireTime);
|
String alertHistoryIndex = getAlertHistoryIndexNameForTime(scheduledFireTime);
|
||||||
AlertActionEntry entry = new AlertActionEntry(alert, scheduledFireTime, fireTime, AlertActionState.SEARCH_NEEDED);
|
AlertActionEntry entry = new AlertActionEntry(alert, scheduledFireTime, fireTime, AlertActionState.SEARCH_NEEDED);
|
||||||
if (alert.getMetadata() != null) {
|
|
||||||
entry.setMetadata(alert.getMetadata());
|
|
||||||
}
|
|
||||||
IndexResponse response = client.prepareIndex(alertHistoryIndex, ALERT_HISTORY_TYPE, entry.getId())
|
IndexResponse response = client.prepareIndex(alertHistoryIndex, ALERT_HISTORY_TYPE, entry.getId())
|
||||||
.setSource(XContentFactory.jsonBuilder().value(entry))
|
.setSource(XContentFactory.contentBuilder(alert.getContentType()).value(entry))
|
||||||
.setOpType(IndexRequest.OpType.CREATE)
|
.setOpType(IndexRequest.OpType.CREATE)
|
||||||
.get();
|
.get();
|
||||||
entry.setVersion(response.getVersion());
|
entry.setVersion(response.getVersion());
|
||||||
|
@ -298,7 +297,7 @@ public class AlertActionManager extends AbstractComponent {
|
||||||
ensureStarted();
|
ensureStarted();
|
||||||
logger.debug("Updating alert action [{}]", entry.getId());
|
logger.debug("Updating alert action [{}]", entry.getId());
|
||||||
IndexResponse response = client.prepareIndex(getAlertHistoryIndexNameForTime(entry.getScheduledTime()), ALERT_HISTORY_TYPE, entry.getId())
|
IndexResponse response = client.prepareIndex(getAlertHistoryIndexNameForTime(entry.getScheduledTime()), ALERT_HISTORY_TYPE, entry.getId())
|
||||||
.setSource(XContentFactory.jsonBuilder().value(entry))
|
.setSource(XContentFactory.contentBuilder(entry.getContentType()).value(entry))
|
||||||
.get();
|
.get();
|
||||||
logger.debug("Updated alert action [{}]", entry.getId());
|
logger.debug("Updated alert action [{}]", entry.getId());
|
||||||
entry.setVersion(response.getVersion());
|
entry.setVersion(response.getVersion());
|
||||||
|
|
|
@ -34,7 +34,7 @@ import java.io.IOException;
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
|
import static org.elasticsearch.common.xcontent.XContentFactory.*;
|
||||||
import static org.elasticsearch.index.query.QueryBuilders.boolQuery;
|
import static org.elasticsearch.index.query.QueryBuilders.boolQuery;
|
||||||
import static org.elasticsearch.index.query.QueryBuilders.matchQuery;
|
import static org.elasticsearch.index.query.QueryBuilders.matchQuery;
|
||||||
import static org.hamcrest.Matchers.*;
|
import static org.hamcrest.Matchers.*;
|
||||||
|
@ -94,7 +94,17 @@ public abstract class AbstractAlertingTests extends ElasticsearchIntegrationTest
|
||||||
}
|
}
|
||||||
|
|
||||||
protected BytesReference createAlertSource(String cron, SearchRequest request, String scriptTrigger, Map<String,Object> metadata) throws IOException {
|
protected BytesReference createAlertSource(String cron, SearchRequest request, String scriptTrigger, Map<String,Object> metadata) throws IOException {
|
||||||
XContentBuilder builder = jsonBuilder().startObject();
|
XContentBuilder builder;
|
||||||
|
if (randomBoolean()) {
|
||||||
|
builder = jsonBuilder();
|
||||||
|
} else if (randomBoolean()) {
|
||||||
|
builder = yamlBuilder();
|
||||||
|
} else if (randomBoolean()) {
|
||||||
|
builder = cborBuilder();
|
||||||
|
} else {
|
||||||
|
builder = smileBuilder();
|
||||||
|
}
|
||||||
|
builder.startObject();
|
||||||
builder.field("schedule", cron);
|
builder.field("schedule", cron);
|
||||||
builder.field("request");
|
builder.field("request");
|
||||||
AlertUtils.writeSearchRequest(request, builder, ToXContent.EMPTY_PARAMS);
|
AlertUtils.writeSearchRequest(request, builder, ToXContent.EMPTY_PARAMS);
|
||||||
|
|
Loading…
Reference in New Issue