You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pinot.apache.org by ak...@apache.org on 2019/02/13 18:51:55 UTC

[incubator-pinot] branch master updated: [TE] Return yaml errors after grouping and use consistent convention (subscription over notification) (#3822)

This is an automated email from the ASF dual-hosted git repository.

akshayrai09 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 16eb7c7  [TE] Return yaml errors after grouping and use consistent convention (subscription over notification) (#3822)
16eb7c7 is described below

commit 16eb7c7255e4cceaa19d7e61101324a29bc25053
Author: Akshay Rai <ak...@gmail.com>
AuthorDate: Wed Feb 13 10:51:50 2019 -0800

    [TE] Return yaml errors after grouping and use consistent convention (subscription over notification) (#3822)
---
 .../thirdeye/detection/yaml/YamlResource.java      | 101 ++++++++++++---------
 1 file changed, 60 insertions(+), 41 deletions(-)

diff --git a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/yaml/YamlResource.java b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/yaml/YamlResource.java
index b1dc8db..63c741d 100644
--- a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/yaml/YamlResource.java
+++ b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/yaml/YamlResource.java
@@ -191,62 +191,80 @@ public class YamlResource {
   public Response createYamlAlert(@ApiParam(value =  "a json contains both subscription and detection yaml as string")  String payload,
       @ApiParam("tuning window start time for tunable components") @QueryParam("startTime") long startTime,
       @ApiParam("tuning window end time for tunable components") @QueryParam("endTime") long endTime) throws Exception {
-    Map<String, String> yamls = OBJECT_MAPPER.readValue(payload, Map.class);
-    if (StringUtils.isBlank(payload)){
-      return Response.status(Response.Status.BAD_REQUEST).entity(ImmutableMap.of("message", "The Yaml Payload in the request is empty.")).build();
-    }
-    if (!yamls.containsKey("detection")) {
-      return Response.status(Response.Status.BAD_REQUEST).entity(ImmutableMap.of("message", "detection pipeline yaml is missing")).build();
-    }
-    if (!yamls.containsKey("notification")){
-      return Response.status(Response.Status.BAD_REQUEST).entity(ImmutableMap.of("message", "subscription group yaml is missing")).build();
-    }
+    Map<String, String> yamls;
 
     // Detection
+    Map<String, String> responseMessage = new HashMap<>();
     long detectionConfigId;
     try {
+      yamls = OBJECT_MAPPER.readValue(payload, Map.class);
+
+      if (StringUtils.isBlank(payload)) {
+        throw new ValidationException("The Yaml Payload in the request is empty.");
+      }
+
+      if (!yamls.containsKey("detection")) {
+        throw new ValidationException("Detection pipeline yaml is missing");
+      }
+
       detectionConfigId = createDetectionPipeline(yamls.get("detection"), startTime, endTime);
     } catch (ValidationException e) {
       LOG.warn("Validation error while creating detection pipeline with payload " + payload, e);
-      return Response.status(Response.Status.BAD_REQUEST).entity(ImmutableMap.of("message", "Validation Error! " + e.getMessage())).build();
+      responseMessage.put("detectionMsg", "Validation Error! " + e.getMessage());
+      return Response.status(Response.Status.BAD_REQUEST).entity(responseMessage).build();
     } catch (Exception e) {
       LOG.error("Error creating detection pipeline with payload " + payload, e);
-      return Response.serverError().entity(ImmutableMap.of("message", "Failed to create the detection pipeline. Reach out to the ThirdEye team.",
-          "more-info", "Error = " + e.getMessage())).build();
+      responseMessage.put("detectionMsg", "Failed to create the detection pipeline. Reach out to the ThirdEye team.");
+      responseMessage.put("detectionMsg-moreInfo", "Error = " + e.getMessage());
+      return Response.serverError().entity(responseMessage).build();
     }
 
     // Notification
-    String notificationYaml = yamls.get("notification");
-
-    Map<String, Object> notificationYamlConfig;
+    long detectionAlertConfigId;
     try {
-      notificationYamlConfig = ConfigUtils.getMap(this.yaml.load(notificationYaml));
-    } catch (Exception e){
-      this.detectionConfigDAO.deleteById(detectionConfigId);
-      return Response.status(Response.Status.BAD_REQUEST)
-          .entity(ImmutableMap.of("message", "notification yaml parsing error, " + e.getMessage())).build();
-    }
+      if (!yamls.containsKey("subscription")) {
+        throw new ValidationException("Subscription group yaml is missing.");
+      }
 
-    // Check if existing or new subscription group
-    String groupName = MapUtils.getString(notificationYamlConfig, PROP_SUBS_GROUP_NAME);
-    List<DetectionAlertConfigDTO> alertConfigDTOS = detectionAlertConfigDAO.findByPredicate(Predicate.EQ("name", groupName));
-    Response response;
-    if (!alertConfigDTOS.isEmpty()) {
-      response = updateSubscriptionGroupApi(notificationYaml, alertConfigDTOS.get(0).getId());
-    } else {
-      response = createSubscriptionGroupApi(notificationYaml);
-    }
-    if (response.getStatusInfo() != Response.Status.OK) {
-      // revert detection DTO
+      String subscriptionYaml = yamls.get("subscription");
+      Map<String, Object> subscriptionYamlConfig;
+      try {
+        subscriptionYamlConfig = ConfigUtils.getMap(this.yaml.load(subscriptionYaml));
+      } catch (Exception e) {
+        throw new ValidationException(e.getMessage());
+      }
+
+      // Check if existing or new subscription group
+      String groupName = MapUtils.getString(subscriptionYamlConfig, PROP_SUBS_GROUP_NAME);
+      List<DetectionAlertConfigDTO> alertConfigDTOS = detectionAlertConfigDAO.findByPredicate(Predicate.EQ("name", groupName));
+      if (!alertConfigDTOS.isEmpty()) {
+        detectionAlertConfigId = alertConfigDTOS.get(0).getId();
+        updateSubscriptionGroup(detectionAlertConfigId, subscriptionYaml);
+      } else {
+        detectionAlertConfigId = createSubscriptionGroup(subscriptionYaml);
+      }
+    } catch (ValidationException e) {
+      LOG.warn("Validation error while creating subscription group with payload " + payload, e);
+      this.detectionConfigDAO.deleteById(detectionConfigId);
+      responseMessage.put("subscriptionMsg", "Validation Error! " + e.getMessage());
+      return Response.status(Response.Status.BAD_REQUEST).entity(responseMessage).build();
+    } catch (Exception e) {
+      LOG.error("Error creating subscription group with payload " + payload, e);
       this.detectionConfigDAO.deleteById(detectionConfigId);
-      return response;
+      responseMessage.put("subscriptionMsg", "Failed to create the subscription group. Reach out to the ThirdEye team.");
+      responseMessage.put("subscriptionMsg-moreInfo", "Error = " + e.getMessage());
+      return Response.serverError().entity(responseMessage).build();
     }
 
     // create an yaml onboarding task to run replay and tuning
     createYamlOnboardingTask(detectionConfigId, startTime, endTime);
 
-    long alertId = Long.parseLong(ConfigUtils.getMap(response.getEntity()).get("detectionAlertConfigId").toString());
-    return Response.ok().entity(ImmutableMap.of("detectionConfigId", detectionConfigId, "detectionAlertConfigId", alertId)).build();
+    LOG.info("Alert created successfully with detection ID " + detectionConfigId + " and subscription ID "
+        + detectionAlertConfigId);
+    return Response.ok().entity(ImmutableMap.of(
+        "detectionConfigId", detectionConfigId,
+        "detectionAlertConfigId", detectionAlertConfigId)
+    ).build();
   }
 
   long createDetectionPipeline(String yamlDetectionConfig, long startTime, long endTime) throws ValidationException {
@@ -315,7 +333,8 @@ public class YamlResource {
     return Response.ok().entity(responseMessage).build();
   }
 
-  void updateDetectionPipeline(long detectionID, String yamlDetectionConfig, long startTime, long endTime) throws Exception {
+  void updateDetectionPipeline(long detectionID, String yamlDetectionConfig, long startTime, long endTime)
+      throws ValidationException {
     DetectionConfigDTO existingDetectionConfig = this.detectionConfigDAO.findById(detectionID);
     DetectionConfigDTO detectionConfig;
     if (existingDetectionConfig == null) {
@@ -405,10 +424,10 @@ public class YamlResource {
   }
 
   @POST
-  @Path("/notification")
+  @Path("/subscription")
   @Produces(MediaType.APPLICATION_JSON)
   @Consumes(MediaType.TEXT_PLAIN)
-  @ApiOperation("Create a notification group using a YAML config")
+  @ApiOperation("Create a subscription group using a YAML config")
   @SuppressWarnings("unchecked")
   public Response createSubscriptionGroupApi(
       @ApiParam("payload") String yamlAlertConfig) {
@@ -483,10 +502,10 @@ public class YamlResource {
   }
 
   @PUT
-  @Path("/notification/{id}")
+  @Path("/subscription/{id}")
   @Produces(MediaType.APPLICATION_JSON)
   @Consumes(MediaType.TEXT_PLAIN)
-  @ApiOperation("Edit a notification group using a YAML config")
+  @ApiOperation("Edit a subscription group using a YAML config")
   public Response updateSubscriptionGroupApi(
       @ApiParam("payload") String yamlAlertConfig,
       @ApiParam("the detection alert config id to edit") @PathParam("id") long id) {


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For additional commands, e-mail: commits-help@pinot.apache.org