예제 #1
0
def deliver_alert(alert: Alert, recipients: Optional[str] = None) -> None:
    logging.info("Triggering alert: %s", alert)
    img_data = None
    images = {}
    recipients = recipients or alert.recipients

    if alert.slice:

        chart_url = get_url_path("Superset.slice",
                                 slice_id=alert.slice.id,
                                 standalone="true")
        screenshot = ChartScreenshot(chart_url, alert.slice.digest)
        cache_key = screenshot.cache_key()
        image_url = get_url_path("ChartRestApi.screenshot",
                                 pk=alert.slice.id,
                                 digest=cache_key)

        user = security_manager.find_user(
            current_app.config["THUMBNAIL_SELENIUM_USER"])
        img_data = screenshot.compute_and_cache(
            user=user,
            cache=thumbnail_cache,
            force=True,
        )
    else:
        # TODO: dashboard delivery!
        image_url = "https://media.giphy.com/media/dzaUX7CAG0Ihi/giphy.gif"

    # generate the email
    subject = f"[Superset] Triggered alert: {alert.label}"
    deliver_as_group = False
    data = None
    if img_data:
        images = {"screenshot": img_data}
    body = __(
        textwrap.dedent("""\
            <h2>Alert: %(label)s</h2>
            <img src="cid:screenshot" alt="%(label)s" />
        """),
        label=alert.label,
        image_url=image_url,
    )

    _deliver_email(recipients, deliver_as_group, subject, body, data, images)
예제 #2
0
    def cache_screenshot(self, pk: int,
                         **kwargs: Dict[str, bool]) -> WerkzeugResponse:
        """
        ---
        get:
          description: Compute and cache a screenshot.
          parameters:
          - in: path
            schema:
              type: integer
            name: pk
          - in: query
            name: q
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/screenshot_query_schema'
          responses:
            200:
              description: Chart async result
              content:
                application/json:
                  schema:
                    $ref: "#/components/schemas/ChartCacheScreenshotResponseSchema"
            302:
              description: Redirects to the current digest
            400:
              $ref: '#/components/responses/400'
            401:
              $ref: '#/components/responses/401'
            404:
              $ref: '#/components/responses/404'
            500:
              $ref: '#/components/responses/500'
        """
        rison_dict = kwargs["rison"]
        window_size = rison_dict.get("window_size") or (800, 600)

        # Don't shrink the image if thumb_size is not specified
        thumb_size = rison_dict.get("thumb_size") or window_size

        chart = self.datamodel.get(pk, self._base_filters)
        if not chart:
            return self.response_404()

        chart_url = get_url_path("Superset.slice",
                                 slice_id=chart.id,
                                 standalone="true")
        screenshot_obj = ChartScreenshot(chart_url, chart.digest)
        cache_key = screenshot_obj.cache_key(window_size, thumb_size)
        image_url = get_url_path("ChartRestApi.screenshot",
                                 pk=chart.id,
                                 digest=cache_key)

        def trigger_celery() -> WerkzeugResponse:
            logger.info("Triggering screenshot ASYNC")
            kwargs = {
                "url": chart_url,
                "digest": chart.digest,
                "force": True,
                "window_size": window_size,
                "thumb_size": thumb_size,
            }
            cache_chart_thumbnail.delay(**kwargs)
            return self.response(
                202,
                cache_key=cache_key,
                chart_url=chart_url,
                image_url=image_url,
            )

        return trigger_celery()