Skip to content

Commit

Permalink
[notification] Allow NotificationPayloadApi to support completed anom…
Browse files Browse the repository at this point in the history
…alies
  • Loading branch information
suvodeep-pyne committed Feb 23, 2024
1 parent 46e2673 commit 7282513
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
*/
package ai.startree.thirdeye.notification;

import static ai.startree.thirdeye.spi.util.SpiUtils.optional;

import ai.startree.thirdeye.mapper.ApiBeanMapper;
import ai.startree.thirdeye.spi.api.NotificationPayloadApi;
import ai.startree.thirdeye.spi.api.NotificationReportApi;
Expand All @@ -39,19 +41,27 @@ public NotificationPayloadBuilder(final NotificationReportBuilder notificationRe
this.notificationEventsBuilder = notificationEventsBuilder;
}

public NotificationPayloadApi build(
final NotificationTaskFilterResult result) {
public NotificationPayloadApi build(final NotificationTaskFilterResult result) {
final SubscriptionGroupDTO subscriptionGroup = result.getSubscriptionGroup();
final Set<AnomalyDTO> anomalies = result.getAnomalies();
final NotificationReportApi report = notificationReportBuilder.buildNotificationReportApi(
subscriptionGroup,
anomalies);
final Set<AnomalyDTO> anomalies = optional(result.getAnomalies())
.orElse(Set.of());
final Set<AnomalyDTO> completedAnomalies = optional(result.getCompletedAnomalies())
.orElse(Set.of());

if (anomalies.isEmpty() && completedAnomalies.isEmpty()) {
/* No notification required. Do not generate a report */
return null;
}

report.setRelatedEvents(notificationEventsBuilder.getRelatedEvents(anomalies));
final NotificationReportApi report = notificationReportBuilder
.buildNotificationReportApi(subscriptionGroup, anomalies)
.setRelatedEvents(notificationEventsBuilder.getRelatedEvents(anomalies));

return new NotificationPayloadApi()
.setSubscriptionGroup(ApiBeanMapper.toApi(subscriptionGroup))
.setReport(report)
.setAnomalyReports(notificationReportBuilder.buildAnomalyReports(anomalies));
.setAnomalyReports(notificationReportBuilder.toSortedAnomalyReports(anomalies))
.setCompletedAnomalyReports(notificationReportBuilder
.toSortedAnomalyReports(result.getCompletedAnomalies()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
import static ai.startree.thirdeye.notification.AnomalyReportHelper.getFeedbackValue;
import static ai.startree.thirdeye.notification.AnomalyReportHelper.getTimezoneString;
import static ai.startree.thirdeye.spi.util.SpiUtils.optional;
import static com.google.common.base.Preconditions.checkArgument;
import static java.util.Objects.requireNonNull;

import ai.startree.thirdeye.config.TimeConfiguration;
Expand Down Expand Up @@ -126,10 +125,12 @@ public NotificationReportApi buildNotificationReportApi(
return report;
}

public List<AnomalyReportApi> buildAnomalyReports(
public List<AnomalyReportApi> toSortedAnomalyReports(
final Set<AnomalyDTO> anomalies) {
requireNonNull(anomalies, "anomalies is null");
checkArgument(anomalies.size() > 0, "anomalies is empty");
if (anomalies.isEmpty()) {
return List.of();
}

final List<AnomalyDTO> sortedAnomalyResults = new ArrayList<>(anomalies);
sortedAnomalyResults.sort((o1, o2) -> -1 * Long.compare(o1.getStartTime(), o2.getStartTime()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,14 @@

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.google.common.base.Objects;
import java.util.List;

@JsonInclude(Include.NON_NULL)
public class NotificationPayloadApi implements ThirdEyeApi {

private SubscriptionGroupApi subscriptionGroup;
private List<AnomalyReportApi> anomalyReports;
private List<AnomalyReportApi> completedAnomalyReports;
private NotificationReportApi report;

public SubscriptionGroupApi getSubscriptionGroup() {
Expand All @@ -44,30 +44,22 @@ public NotificationPayloadApi setAnomalyReports(final List<AnomalyReportApi> ano
return this;
}

public NotificationReportApi getReport() {
return report;
public List<AnomalyReportApi> getCompletedAnomalyReports() {
return completedAnomalyReports;
}

public NotificationPayloadApi setReport(final NotificationReportApi report) {
this.report = report;
public NotificationPayloadApi setCompletedAnomalyReports(
final List<AnomalyReportApi> completedAnomalyReports) {
this.completedAnomalyReports = completedAnomalyReports;
return this;
}

@Override
public boolean equals(final Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
final NotificationPayloadApi that = (NotificationPayloadApi) o;
return Objects.equal(subscriptionGroup, that.subscriptionGroup)
&& Objects.equal(anomalyReports, that.anomalyReports);
public NotificationReportApi getReport() {
return report;
}

@Override
public int hashCode() {
return Objects.hashCode(subscriptionGroup, anomalyReports);
public NotificationPayloadApi setReport(final NotificationReportApi report) {
this.report = report;
return this;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -143,18 +143,16 @@ private void executeInternal(final SubscriptionGroupDTO sg) {
final long now = System.currentTimeMillis();
final var result = notificationTaskFilter.filter(sg, now);
final var anomalies = result.getAnomalies();
final var completedAnomalies = result.getCompletedAnomalies();

if (anomalies.isEmpty() && completedAnomalies.isEmpty()) {
/* Dispatch notifications */
final NotificationPayloadApi payload = notificationPayloadBuilder.build(result);
if (payload == null) {
LOG.debug("Subscription group: {} "
+ "has no anomalies to notify and no completed anomalies to notify",
sg.getId());
return;
}

/* Dispatch notifications */
final NotificationPayloadApi payload = notificationPayloadBuilder.build(result);

/* fire notifications */
notificationDispatcher.dispatch(sg, payload);

Expand Down

0 comments on commit 7282513

Please sign in to comment.