package com.linkedin.thirdeye.dashboard.resources.v2;
import com.linkedin.thirdeye.anomaly.events.EventDataProviderLoader;
import com.linkedin.thirdeye.anomaly.events.HolidayEventProvider;
import com.linkedin.thirdeye.anomaly.events.EventDataProviderManager;
import com.linkedin.thirdeye.anomaly.events.EventFilter;
import com.linkedin.thirdeye.anomaly.events.EventType;
import com.linkedin.thirdeye.anomaly.events.HistoricalAnomalyEventProvider;
import com.linkedin.thirdeye.client.DAORegistry;
import com.linkedin.thirdeye.common.ThirdEyeConfiguration;
import com.linkedin.thirdeye.datalayer.bao.EventManager;
import com.linkedin.thirdeye.datalayer.dto.EventDTO;
import java.io.File;
import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Path(value = "/event")
@Produces(MediaType.APPLICATION_JSON)
public class EventResource {
private static final Logger LOG = LoggerFactory.getLogger(EventResource.class);
static final EventDataProviderManager EVENT_DATA_PROVIDER_MANAGER = EventDataProviderManager.getInstance();
static final EventManager eventDAO = DAORegistry.getInstance().getEventDAO();
public EventResource(ThirdEyeConfiguration thirdeyeConfig) {
EVENT_DATA_PROVIDER_MANAGER
.registerEventDataProvider(EventType.HOLIDAY.toString(), new HolidayEventProvider());
EVENT_DATA_PROVIDER_MANAGER.registerEventDataProvider(EventType.HISTORICAL_ANOMALY.toString(),
new HistoricalAnomalyEventProvider());
// External event providers
File rcaConfig = new File(thirdeyeConfig.getRootDir() + "/rca.yml");
if (rcaConfig.exists()) {
EventDataProviderLoader.registerEventDataProvidersFromConfig(rcaConfig, EVENT_DATA_PROVIDER_MANAGER);
}
}
@GET
@Path ("/{start}/{end}")
public List<EventDTO> getHolidayEventsByTime(@PathParam("start") long start,
@PathParam("end") long end) {
EventFilter eventFilter = new EventFilter();
eventFilter.setStartTime(start);
eventFilter.setEndTime(end);
eventFilter.setEventType(EventType.HOLIDAY.toString());
return EVENT_DATA_PROVIDER_MANAGER.getEvents(eventFilter);
}
@POST
@Path("/filter")
public List<EventDTO> getEventsByFilter(EventFilter eventFilter) {
return EVENT_DATA_PROVIDER_MANAGER.getEvents(eventFilter);
}
@POST
@Path("/upload")
public Response uploadEvents(List<EventDTO> eventDTOs) {
try {
for (EventDTO e : eventDTOs) {
List<EventDTO> dupes = eventDAO
.findEventsBetweenTimeRangeByName(e.getEventType(), e.getName(), e.getStartTime(),
e.getEndTime());
if (dupes.size() > 0) {
LOG.info("Found duplicate events, skipping {}", e.toString());
} else {
eventDAO.save(e);
}
}
} catch (Exception e) {
LOG.error("Could not ingest the event :" + e.toString(), e);
return Response.serverError().build();
}
return Response.ok().build();
}
}