This is an automated email from the ASF dual-hosted git repository. beto pushed a commit to branch 1.1.0rc1 in repository https://gitbox.apache.org/repos/asf/superset.git
commit 2facfd82d04083223f16c20d9aa3be9fca66017e Author: Beto Dealmeida <[email protected]> AuthorDate: Fri Feb 26 16:50:10 2021 -0800 WIP --- superset/utils/log.py | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/superset/utils/log.py b/superset/utils/log.py index 824487e..f8a15e9 100644 --- a/superset/utils/log.py +++ b/superset/utils/log.py @@ -22,6 +22,7 @@ import textwrap import time from abc import ABC, abstractmethod from contextlib import contextmanager +from datetime import timedelta from typing import Any, Callable, cast, Dict, Iterator, Optional, Type, Union from flask import current_app, g, request @@ -72,9 +73,68 @@ class AbstractEventLogger(ABC): ) -> None: pass + def log_with_context( + self, + action: str, + duration: Optional[timedelta] = None, + object_ref: Optional[str] = None, + log_to_statsd: bool = True, + ) -> None: + from superset.views.core import get_form_data + + referrer = request.referrer[:1000] if request.referrer else None + user_id = g.user.get_id() if hasattr(g, "user") and g.user else None + + payload = collect_request_payload() + if object_ref: + payload["object_ref"] = object_ref + + dashboard_id: Optional[int] = None + try: + dashboard_id = int(payload.get("dashboard_id")) # type: ignore + except (TypeError, ValueError): + dashboard_id = None + + if "form_data" in payload: + form_data, _ = get_form_data() + payload["form_data"] = form_data + slice_id = form_data.get("slice_id") + else: + slice_id = payload.get("slice_id") + + try: + slice_id = int(slice_id) # type: ignore + except (TypeError, ValueError): + slice_id = 0 + + if log_to_statsd: + self.stats_logger.incr(action) + + try: + # bulk insert + explode_by = payload.get("explode") + records = json.loads(payload.get(explode_by)) # type: ignore + except Exception: # pylint: disable=broad-except + records = [payload] + + duration_ms = duration.total_seconds() * 1000 if duration else None + + self.log( + user_id, + action, + records=records, + dashboard_id=dashboard_id, + slice_id=slice_id, + duration_ms=duration_ms, + referrer=referrer, + ) + @contextmanager def log_context( # pylint: disable=too-many-locals - self, action: str, object_ref: Optional[str] = None, log_to_statsd: bool = True, + self, + action: str, + object_ref: Optional[str] = None, + log_to_statsd: bool = True, ) -> Iterator[Callable[..., None]]: """ Log an event with additional information from the request context.
