Skip to content

Commit

Permalink
Complete getAlerts criteria (#346)
Browse files Browse the repository at this point in the history
  • Loading branch information
lucasponce authored and jshaughn committed Jun 20, 2017
1 parent 018e0fe commit aa7963d
Show file tree
Hide file tree
Showing 5 changed files with 426 additions and 4 deletions.
Expand Up @@ -17,10 +17,13 @@
package org.hawkular.alerts.engine.impl.ispn;

import static org.hawkular.alerts.engine.impl.ispn.IspnPk.pk;
import static org.hawkular.alerts.engine.impl.ispn.IspnPk.pkFromAlertId;
import static org.hawkular.alerts.engine.tags.ExpressionTagQueryParser.ExpressionTagResolver.EQ;
import static org.hawkular.alerts.engine.tags.ExpressionTagQueryParser.ExpressionTagResolver.IN;
import static org.hawkular.alerts.engine.tags.ExpressionTagQueryParser.ExpressionTagResolver.NEQ;
import static org.hawkular.alerts.engine.tags.ExpressionTagQueryParser.ExpressionTagResolver.NOT;
import static org.hawkular.alerts.engine.util.Utils.extractStatus;
import static org.hawkular.alerts.engine.util.Utils.extractTriggerIds;
import static org.hawkular.alerts.engine.util.Utils.isEmpty;

import java.util.Arrays;
Expand All @@ -33,9 +36,11 @@
import java.util.concurrent.ExecutorService;
import java.util.stream.Collectors;

import org.hawkular.alerts.api.model.Severity;
import org.hawkular.alerts.api.model.condition.ConditionEval;
import org.hawkular.alerts.api.model.data.Data;
import org.hawkular.alerts.api.model.event.Alert;
import org.hawkular.alerts.api.model.event.Alert.Status;
import org.hawkular.alerts.api.model.event.Event;
import org.hawkular.alerts.api.model.paging.AlertComparator;
import org.hawkular.alerts.api.model.paging.Order;
Expand Down Expand Up @@ -289,7 +294,13 @@ public int deleteEvents(String tenantId, EventsCriteria criteria) throws Excepti

@Override
public Alert getAlert(String tenantId, String alertId, boolean thin) throws Exception {
return null;
if (isEmpty(tenantId)) {
throw new IllegalArgumentException("TenantId must be not null");
}
if (isEmpty(alertId)) {
throw new IllegalArgumentException("AlertId must be not null");
}
return (Alert) backend.get(pkFromAlertId(tenantId, alertId));
}

@Override
Expand Down Expand Up @@ -338,6 +349,94 @@ public Page<Alert> getAlerts(Set<String> tenantIds, AlertsCriteria criteria, Pag
parseTagQuery(criteria.getTagQuery(), query);
query.append(") ");
}
if (criteria.hasTriggerIdCriteria()) {
query.append("and (");
iter = extractTriggerIds(criteria).iterator();
while (iter.hasNext()) {
String triggerId = iter.next();
query.append("triggerId = '").append(triggerId).append("' ");
if (iter.hasNext()) {
query.append("or ");
}
}
query.append(") ");
}
if (criteria.hasCTimeCriteria()) {
query.append("and (");
if (criteria.getStartTime() != null) {
query.append("ctime >= ").append(criteria.getStartTime()).append(" ");
}
if (criteria.getEndTime() != null) {
if (criteria.getStartTime() != null) {
query.append("and ");
}
query.append("ctime <= ").append(criteria.getEndTime()).append(" ");
}
query.append(") ");
}
if (criteria.hasResolvedTimeCriteria()) {
query.append("and (status = '").append(Status.RESOLVED.name()).append("' and ");
if (criteria.getStartResolvedTime() != null) {
query.append("stime >= ").append(criteria.getStartResolvedTime()).append(" ");
}
if (criteria.getEndResolvedTime() != null) {
if (criteria.getStartResolvedTime() != null) {
query.append("and ");
}
query.append("stime <= ").append(criteria.getEndResolvedTime()).append(" ");
}
query.append(") ");
}
if (criteria.hasAckTimeCriteria()) {
query.append("and (status = '").append(Status.ACKNOWLEDGED.name()).append("' and ");
if (criteria.getStartAckTime() != null) {
query.append("stime >= ").append(criteria.getStartAckTime()).append(" ");
}
if (criteria.getEndAckTime() != null) {
if (criteria.getStartAckTime() != null) {
query.append("and ");
}
query.append("stime <= ").append(criteria.getEndAckTime()).append(" ");
}
query.append(") ");
}
if (criteria.hasStatusTimeCriteria()) {
query.append("and (");
if (criteria.getStartStatusTime() != null) {
query.append("stime >= ").append(criteria.getStartStatusTime()).append(" ");
}
if (criteria.getEndTime() != null) {
if (criteria.getStartTime() != null) {
query.append("and ");
}
query.append("stime <= ").append(criteria.getEndStatusTime()).append(" ");
}
query.append(") ");
}
if (criteria.hasSeverityCriteria()) {
query.append("and (");
Iterator<Severity> iterSev = criteria.getSeverities().iterator();
while (iterSev.hasNext()) {
Severity severity = iterSev.next();
query.append("severity = '").append(severity.name()).append("' ");
if (iterSev.hasNext()) {
query.append(" or ");
}
}
query.append(") ");
}
if (criteria.hasStatusCriteria()) {
query.append("and (");
Iterator<Status> iterStatus = extractStatus(criteria).iterator();
while (iterStatus.hasNext()) {
Status status = iterStatus.next();
query.append("status = '").append(status.name()).append("' ");
if (iterStatus.hasNext()) {
query.append(" or ");
}
}
query.append(") ");
}
}

List<IspnEvent> ispnEvents = queryFactory.create(query.toString()).list();
Expand Down
Expand Up @@ -99,4 +99,15 @@ public static String pk(Alert alert) {
.toString();
}

public static String pkFromAlertId(String tenantId, String alertId) {
if (tenantId == null || alertId == null) {
return null;
}
return new StringBuilder("Alert-")
.append(tenantId)
.append("-")
.append(alertId)
.toString();
}

}
Expand Up @@ -32,6 +32,21 @@ public class IspnEvent implements Serializable {
@FieldBridge(impl = TagsBridge.class)
private Map<String, String> tags;

@Field(store = Store.YES, analyze = Analyze.NO)
private String triggerId;

@Field(store = Store.YES, analyze = Analyze.NO)
private long ctime;

@Field(store = Store.YES, analyze = Analyze.NO)
private String status;

@Field(store = Store.YES, analyze = Analyze.NO)
private long stime;

@Field(store = Store.YES, analyze = Analyze.NO)
private String severity;

private Event event;

public IspnEvent() {
Expand All @@ -47,13 +62,18 @@ private void updateEvent(Event event) {
}
if (event instanceof Alert) {
this.event = new Alert((Alert) event);
this.status = ((Alert) event).getCurrentLifecycle().getStatus().name();
this.stime = ((Alert) event).getCurrentLifecycle().getStime();
this.severity = ((Alert) event).getSeverity().name();
} else {
this.event = new Event(event);
}
this.id = event.getId();
this.eventType = event.getEventType();
this.tenantId = event.getTenantId();
this.tags = this.event.getTags();
this.triggerId = event.getTrigger() != null ? event.getTrigger().getId() : null;
this.ctime = event.getCtime();
}

public String getEventType() {
Expand Down Expand Up @@ -99,17 +119,62 @@ public void setEvent(Event event) {
updateEvent(event);
}

public String getTriggerId() {
return triggerId;
}

public void setTriggerId(String triggerId) {
this.triggerId = triggerId;
}

public long getCtime() {
return ctime;
}

public void setCtime(long ctime) {
this.ctime = ctime;
}

public String getStatus() {
return status;
}

public void setStatus(String status) {
this.status = status;
}

public long getStime() {
return stime;
}

public void setStime(long stime) {
this.stime = stime;
}

public String getSeverity() {
return severity;
}

public void setSeverity(String severity) {
this.severity = severity;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;

IspnEvent ispnEvent = (IspnEvent) o;

if (ctime != ispnEvent.ctime) return false;
if (stime != ispnEvent.stime) return false;
if (eventType != null ? !eventType.equals(ispnEvent.eventType) : ispnEvent.eventType != null) return false;
if (tenantId != null ? !tenantId.equals(ispnEvent.tenantId) : ispnEvent.tenantId != null) return false;
if (id != null ? !id.equals(ispnEvent.id) : ispnEvent.id != null) return false;
if (tags != null ? !tags.equals(ispnEvent.tags) : ispnEvent.tags != null) return false;
if (triggerId != null ? !triggerId.equals(ispnEvent.triggerId) : ispnEvent.triggerId != null) return false;
if (status != null ? !status.equals(ispnEvent.status) : ispnEvent.status != null) return false;
if (severity != null ? !severity.equals(ispnEvent.severity) : ispnEvent.severity != null) return false;
return event != null ? event.equals(ispnEvent.event) : ispnEvent.event == null;
}

Expand All @@ -119,6 +184,11 @@ public int hashCode() {
result = 31 * result + (tenantId != null ? tenantId.hashCode() : 0);
result = 31 * result + (id != null ? id.hashCode() : 0);
result = 31 * result + (tags != null ? tags.hashCode() : 0);
result = 31 * result + (triggerId != null ? triggerId.hashCode() : 0);
result = 31 * result + (int) (ctime ^ (ctime >>> 32));
result = 31 * result + (status != null ? status.hashCode() : 0);
result = 31 * result + (int) (stime ^ (stime >>> 32));
result = 31 * result + (severity != null ? severity.hashCode() : 0);
result = 31 * result + (event != null ? event.hashCode() : 0);
return result;
}
Expand All @@ -130,6 +200,11 @@ public String toString() {
", tenantId='" + tenantId + '\'' +
", id='" + id + '\'' +
", tags=" + tags +
", triggerId='" + triggerId + '\'' +
", ctime=" + ctime +
", status='" + status + '\'' +
", stime=" + stime +
", severity='" + severity + '\'' +
", event=" + event +
'}';
}
Expand Down
41 changes: 41 additions & 0 deletions engine/src/main/java/org/hawkular/alerts/engine/util/Utils.java
Expand Up @@ -17,11 +17,17 @@
package org.hawkular.alerts.engine.util;

import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.hawkular.alerts.api.model.action.ActionDefinition;
import org.hawkular.alerts.api.model.dampening.Dampening;
import org.hawkular.alerts.api.model.event.Alert;
import org.hawkular.alerts.api.model.event.Alert.Status;
import org.hawkular.alerts.api.model.trigger.Trigger;
import org.hawkular.alerts.api.services.AlertsCriteria;

/**
* @author Jay Shaughnessy
Expand Down Expand Up @@ -72,4 +78,39 @@ public static void checkTenantId(String tenantId, Object obj) {
}
}
}

public static Set<String> extractTriggerIds(AlertsCriteria criteria) {

boolean hasTriggerId = !isEmpty(criteria.getTriggerId());
boolean hasTriggerIds = !isEmpty(criteria.getTriggerIds());

Set<String> triggerIds = hasTriggerId || hasTriggerIds ? new HashSet<>() : Collections.emptySet();

if (!hasTriggerIds) {
if (hasTriggerId) {
triggerIds.add(criteria.getTriggerId());
}
} else {
for (String triggerId : criteria.getTriggerIds()) {
if (isEmpty(triggerId)) {
continue;
}
triggerIds.add(triggerId);
}
}

return triggerIds;
}

public static Set<Status> extractStatus(AlertsCriteria criteria) {
Set<Status> statuses = new HashSet<>();
if (criteria.getStatus() != null) {
statuses.add(criteria.getStatus());
}
if (!isEmpty(criteria.getStatusSet())) {
statuses.addAll(criteria.getStatusSet());
}
return statuses;
}

}

0 comments on commit aa7963d

Please sign in to comment.