This is an automated email from the ASF dual-hosted git repository. apucher pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-pinot.git
The following commit(s) were added to refs/heads/master by this push: new 234abc6 [TE] Display Holidays only from Top Countries (#3544) 234abc6 is described below commit 234abc6f8cc1d8e3aa7adfa2a170fca002122b74 Author: Akshay Rai <akshayra...@gmail.com> AuthorDate: Mon Nov 26 12:27:39 2018 -0800 [TE] Display Holidays only from Top Countries (#3544) Instead of listing all the holidays in the email, display holidays from a whitelist of countries. --- .../alert/content/BaseEmailContentFormatter.java | 16 ++++------------ .../content/EmailContentFormatterConfiguration.java | 11 +++++++++++ .../HierarchicalAnomaliesEmailContentFormatter.java | 7 ++++--- .../content/MultipleAnomaliesEmailContentFormatter.java | 9 +++------ .../thirdeye/anomaly/ThirdEyeAnomalyConfiguration.java | 10 ++++++++++ .../linkedin/thirdeye/anomaly/events/EventFilter.java | 7 ++++--- .../thirdeye/anomaly/events/HolidayEventProvider.java | 17 +++++++++++------ .../eventprovider/TestHolidayEventProvider.java | 1 + 8 files changed, 48 insertions(+), 30 deletions(-) diff --git a/thirdeye/thirdeye-pinot/src/main/java/com/linkedin/thirdeye/alert/content/BaseEmailContentFormatter.java b/thirdeye/thirdeye-pinot/src/main/java/com/linkedin/thirdeye/alert/content/BaseEmailContentFormatter.java index d0c7657..9f62687 100644 --- a/thirdeye/thirdeye-pinot/src/main/java/com/linkedin/thirdeye/alert/content/BaseEmailContentFormatter.java +++ b/thirdeye/thirdeye-pinot/src/main/java/com/linkedin/thirdeye/alert/content/BaseEmailContentFormatter.java @@ -450,7 +450,7 @@ public abstract class BaseEmailContentFormatter implements EmailContentFormatter , String metricName, String serviceName, Map<String, List<String>> targetDimensions) { List<EventDTO> relatedEvents = new ArrayList<>(); for (EventType eventType : eventTypes) { - relatedEvents.addAll(getRelatedEvents(eventType, start, end, metricName, serviceName, targetDimensions)); + relatedEvents.addAll(getHolidayEvents(start, end, targetDimensions)); } return relatedEvents; } @@ -509,27 +509,19 @@ public abstract class BaseEmailContentFormatter implements EmailContentFormatter /** * Taking advantage of event data provider, extract the events around the given start and end time - * @param eventType a given event type * @param start the start time of the event, preEventCrawlOffset is added before the given date time * @param end the end time of the event, postEventCrawlOffset is added after the given date time - * @param metricName the affected metric name - * @param serviceName the affected service name * @param targetDimensions the affected dimensions * @return a list of related events */ - public List<EventDTO> getRelatedEvents(EventType eventType, DateTime start, DateTime end - , String metricName, String serviceName, Map<String, List<String>> targetDimensions) { - List<EventDTO> relatedEvents = new ArrayList<>(); - - // Set Event Filters + public List<EventDTO> getHolidayEvents(DateTime start, DateTime end, Map<String, List<String>> targetDimensions) { EventFilter eventFilter = new EventFilter(); + eventFilter.setEventType(EventType.HOLIDAY.name()); eventFilter.setStartTime(start.minus(preEventCrawlOffset).getMillis()); eventFilter.setEndTime(end.plus(postEventCrawlOffset).getMillis()); - eventFilter.setMetricName(metricName); - eventFilter.setServiceName(serviceName); eventFilter.setTargetDimensionMap(targetDimensions); - eventFilter.setEventType(eventType.toString()); + LOG.info("Fetching holidays with preEventCrawlOffset {} and postEventCrawlOffset {}", preEventCrawlOffset, postEventCrawlOffset); return new HolidayEventProvider().getEvents(eventFilter); } diff --git a/thirdeye/thirdeye-pinot/src/main/java/com/linkedin/thirdeye/alert/content/EmailContentFormatterConfiguration.java b/thirdeye/thirdeye-pinot/src/main/java/com/linkedin/thirdeye/alert/content/EmailContentFormatterConfiguration.java index fa93496..f904803 100644 --- a/thirdeye/thirdeye-pinot/src/main/java/com/linkedin/thirdeye/alert/content/EmailContentFormatterConfiguration.java +++ b/thirdeye/thirdeye-pinot/src/main/java/com/linkedin/thirdeye/alert/content/EmailContentFormatterConfiguration.java @@ -18,6 +18,7 @@ package com.linkedin.thirdeye.alert.content; import com.linkedin.thirdeye.anomaly.SmtpConfiguration; import com.linkedin.thirdeye.anomaly.ThirdEyeAnomalyConfiguration; +import java.util.List; import static com.linkedin.thirdeye.anomaly.SmtpConfiguration.SMTP_CONFIG_KEY; @@ -32,6 +33,7 @@ public class EmailContentFormatterConfiguration{ private String phantomJsPath = ""; private String failureFromAddress; private String failureToAddress; + private List<String> holidayCountriesWhitelist; public String getFunctionConfigPath() { return functionConfigPath; @@ -97,6 +99,14 @@ public class EmailContentFormatterConfiguration{ this.failureToAddress = failureToAddress; } + public List<String> getHolidayCountriesWhitelist() { + return holidayCountriesWhitelist; + } + + public void setHolidayCountriesWhitelist(List<String> holidayCountriesWhitelist) { + this.holidayCountriesWhitelist = holidayCountriesWhitelist; + } + public static EmailContentFormatterConfiguration fromThirdEyeAnomalyConfiguration(ThirdEyeAnomalyConfiguration thirdeyeConfig) { EmailContentFormatterConfiguration emailConfig = new EmailContentFormatterConfiguration(); emailConfig.setDashboardHost(thirdeyeConfig.getDashboardHost()); @@ -106,6 +116,7 @@ public class EmailContentFormatterConfiguration{ emailConfig.setFunctionConfigPath(thirdeyeConfig.getFunctionConfigPath()); emailConfig.setAlertFilterConfigPath(thirdeyeConfig.getAlertFilterConfigPath()); emailConfig.setPhantomJsPath(thirdeyeConfig.getPhantomJsPath()); + emailConfig.setHolidayCountriesWhitelist(thirdeyeConfig.getHolidayCountriesWhitelist()); emailConfig.setSmtpConfiguration( SmtpConfiguration.createFromProperties(thirdeyeConfig.getAlerterConfiguration().get(SMTP_CONFIG_KEY))); diff --git a/thirdeye/thirdeye-pinot/src/main/java/com/linkedin/thirdeye/alert/content/HierarchicalAnomaliesEmailContentFormatter.java b/thirdeye/thirdeye-pinot/src/main/java/com/linkedin/thirdeye/alert/content/HierarchicalAnomaliesEmailContentFormatter.java index 9008529..3d2b1dd 100644 --- a/thirdeye/thirdeye-pinot/src/main/java/com/linkedin/thirdeye/alert/content/HierarchicalAnomaliesEmailContentFormatter.java +++ b/thirdeye/thirdeye-pinot/src/main/java/com/linkedin/thirdeye/alert/content/HierarchicalAnomaliesEmailContentFormatter.java @@ -153,9 +153,10 @@ public class HierarchicalAnomaliesEmailContentFormatter extends BaseEmailContent if (affectedCountries.size() > 0) { // if the anomaly is on country level Map<String, List<String>> targetDimensions = new HashMap<>(); targetDimensions.put(EVENT_FILTER_COUNTRY, affectedCountries); - relatedEvents.addAll(getRelatedEvents(EventType.HOLIDAY, - new DateTime(anomaly.getStartTime(), dateTimeZone), new DateTime(anomaly.getEndTime(), dateTimeZone), - null, null, targetDimensions)); + relatedEvents.addAll(getHolidayEvents( + new DateTime(anomaly.getStartTime(), dateTimeZone), + new DateTime(anomaly.getEndTime(), dateTimeZone), + targetDimensions)); } return anomalyReport; diff --git a/thirdeye/thirdeye-pinot/src/main/java/com/linkedin/thirdeye/alert/content/MultipleAnomaliesEmailContentFormatter.java b/thirdeye/thirdeye-pinot/src/main/java/com/linkedin/thirdeye/alert/content/MultipleAnomaliesEmailContentFormatter.java index 24c5b27..dd82847 100644 --- a/thirdeye/thirdeye-pinot/src/main/java/com/linkedin/thirdeye/alert/content/MultipleAnomaliesEmailContentFormatter.java +++ b/thirdeye/thirdeye-pinot/src/main/java/com/linkedin/thirdeye/alert/content/MultipleAnomaliesEmailContentFormatter.java @@ -52,12 +52,9 @@ public class MultipleAnomaliesEmailContentFormatter extends BaseEmailContentForm private static final Logger LOG = LoggerFactory.getLogger(MultipleAnomaliesEmailContentFormatter.class); public static final String EMAIL_TEMPLATE = "emailTemplate"; - private static final String DATE_PATTERN = "MMM dd, HH:mm"; public static final String DEFAULT_EMAIL_TEMPLATE = "holiday-anomaly-report.ftl"; - private static final long EVENT_TIME_TOLERANCE = TimeUnit.DAYS.toMillis(2); - private EventManager eventDAO = null; private DetectionConfigManager configDAO = null; public MultipleAnomaliesEmailContentFormatter(){ @@ -68,7 +65,6 @@ public class MultipleAnomaliesEmailContentFormatter extends BaseEmailContentForm public void init(Properties properties, EmailContentFormatterConfiguration configuration) { super.init(properties, configuration); this.emailTemplate = properties.getProperty(EMAIL_TEMPLATE, DEFAULT_EMAIL_TEMPLATE); - this.eventDAO = DAORegistry.getInstance().getEventDAO(); this.configDAO = DAORegistry.getInstance().getDetectionConfigManager(); } @@ -163,8 +159,9 @@ public class MultipleAnomaliesEmailContentFormatter extends BaseEmailContentForm // holidays final DateTime eventStart = windowStart.minus(preEventCrawlOffset); final DateTime eventEnd = windowEnd.plus(postEventCrawlOffset); - List<EventDTO> holidays = eventDAO.findEventsBetweenTimeRange(EventType.HOLIDAY.toString(), - eventStart.getMillis(), eventEnd.getMillis()); + Map<String, List<String>> targetDimensions = new HashMap<>(); + targetDimensions.put(EVENT_FILTER_COUNTRY, emailContentFormatterConfiguration.getHolidayCountriesWhitelist()); + List<EventDTO> holidays = getHolidayEvents(eventStart, eventEnd, targetDimensions); Collections.sort(holidays, new Comparator<EventDTO>() { @Override public int compare(EventDTO o1, EventDTO o2) { diff --git a/thirdeye/thirdeye-pinot/src/main/java/com/linkedin/thirdeye/anomaly/ThirdEyeAnomalyConfiguration.java b/thirdeye/thirdeye-pinot/src/main/java/com/linkedin/thirdeye/anomaly/ThirdEyeAnomalyConfiguration.java index e6f985b..d166a5c 100644 --- a/thirdeye/thirdeye-pinot/src/main/java/com/linkedin/thirdeye/anomaly/ThirdEyeAnomalyConfiguration.java +++ b/thirdeye/thirdeye-pinot/src/main/java/com/linkedin/thirdeye/anomaly/ThirdEyeAnomalyConfiguration.java @@ -22,6 +22,7 @@ import com.linkedin.thirdeye.auto.onboard.AutoOnboardConfiguration; import com.linkedin.thirdeye.common.ThirdEyeConfiguration; import java.util.Collection; import java.util.HashSet; +import java.util.List; public class ThirdEyeAnomalyConfiguration extends ThirdEyeConfiguration { @@ -46,6 +47,7 @@ public class ThirdEyeAnomalyConfiguration extends ThirdEyeConfiguration { private TaskDriverConfiguration taskDriverConfiguration = new TaskDriverConfiguration(); private String failureFromAddress; private String failureToAddress; + private List<String> holidayCountriesWhitelist; public HolidayEventsLoaderConfiguration getHolidayEventsLoaderConfiguration() { return holidayEventsLoaderConfiguration; @@ -198,4 +200,12 @@ public class ThirdEyeAnomalyConfiguration extends ThirdEyeConfiguration { public void setFailureToAddress(String failureToAddress) { this.failureToAddress = failureToAddress; } + + public List<String> getHolidayCountriesWhitelist() { + return holidayCountriesWhitelist; + } + + public void setHolidayCountriesWhitelist(List<String> holidayCountriesWhitelist) { + this.holidayCountriesWhitelist = holidayCountriesWhitelist; + } } diff --git a/thirdeye/thirdeye-pinot/src/main/java/com/linkedin/thirdeye/anomaly/events/EventFilter.java b/thirdeye/thirdeye-pinot/src/main/java/com/linkedin/thirdeye/anomaly/events/EventFilter.java index a29eaef..f61826f 100644 --- a/thirdeye/thirdeye-pinot/src/main/java/com/linkedin/thirdeye/anomaly/events/EventFilter.java +++ b/thirdeye/thirdeye-pinot/src/main/java/com/linkedin/thirdeye/anomaly/events/EventFilter.java @@ -105,7 +105,6 @@ public class EventFilter { // if filter map not empty, filter events if (MapUtils.isNotEmpty(eventFilterDimensionMap)) { - // go over each event for (EventDTO event : allEvents) { boolean eventAdded = false; @@ -163,8 +162,10 @@ public class EventFilter { private static List<String> transformDimensionValues(List<String> dimensionValues) { List<String> dimensionValuesTransformed = new ArrayList<>(); - for (String value : dimensionValues) { - dimensionValuesTransformed.add(value.toLowerCase()); + if (dimensionValues != null) { + for (String value : dimensionValues) { + dimensionValuesTransformed.add(value.toLowerCase()); + } } return dimensionValuesTransformed; } diff --git a/thirdeye/thirdeye-pinot/src/main/java/com/linkedin/thirdeye/anomaly/events/HolidayEventProvider.java b/thirdeye/thirdeye-pinot/src/main/java/com/linkedin/thirdeye/anomaly/events/HolidayEventProvider.java index b172617..6455823 100644 --- a/thirdeye/thirdeye-pinot/src/main/java/com/linkedin/thirdeye/anomaly/events/HolidayEventProvider.java +++ b/thirdeye/thirdeye-pinot/src/main/java/com/linkedin/thirdeye/anomaly/events/HolidayEventProvider.java @@ -21,19 +21,24 @@ import com.linkedin.thirdeye.datalayer.dto.EventDTO; import com.linkedin.thirdeye.datasource.DAORegistry; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + public class HolidayEventProvider implements EventDataProvider<EventDTO> { + private static final Logger LOG = LoggerFactory.getLogger(HolidayEventProvider.class); + private EventManager eventDAO = DAORegistry.getInstance().getEventDAO(); @Override public List<EventDTO> getEvents(EventFilter eventFilter) { + LOG.info("Fetching all {} events between {} and {}", eventFilter.getEventType(), eventFilter.getStartTime(), eventFilter.getEndTime()); + List<EventDTO> allEventsBetweenTimeRange = eventDAO.findEventsBetweenTimeRange( + eventFilter.getEventType(), + eventFilter.getStartTime(), + eventFilter.getEndTime()); - List<EventDTO> allEventsBetweenTimeRange = - eventDAO.findEventsBetweenTimeRange(EventType.HOLIDAY.name(), eventFilter.getStartTime(), - eventFilter.getEndTime()); - - List<EventDTO> holidayEvents = EventFilter.applyDimensionFilter(allEventsBetweenTimeRange, eventFilter.getTargetDimensionMap()); - return holidayEvents; + return EventFilter.applyDimensionFilter(allEventsBetweenTimeRange, eventFilter.getTargetDimensionMap()); } @Override diff --git a/thirdeye/thirdeye-pinot/src/test/java/com/linkedin/thirdeye/eventprovider/TestHolidayEventProvider.java b/thirdeye/thirdeye-pinot/src/test/java/com/linkedin/thirdeye/eventprovider/TestHolidayEventProvider.java index 0a0af8b..b5ef670 100644 --- a/thirdeye/thirdeye-pinot/src/test/java/com/linkedin/thirdeye/eventprovider/TestHolidayEventProvider.java +++ b/thirdeye/thirdeye-pinot/src/test/java/com/linkedin/thirdeye/eventprovider/TestHolidayEventProvider.java @@ -109,6 +109,7 @@ public class TestHolidayEventProvider { // check that it gets all HOLIDAY events in time range, and only HOLIDAY events eventFilter.setStartTime(hoursAgo5); eventFilter.setEndTime(hoursAgo3); + eventFilter.setEventType(EventType.HOLIDAY.name()); events = holidayEventProvider.getEvents(eventFilter); Assert.assertEquals(events.size(), 2); --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@pinot.apache.org For additional commands, e-mail: commits-h...@pinot.apache.org