예제 #1
0
    async def _message_loop(self):
        async for message in self.websocket:
            # Clear context vars for logging
            clear_contextvars()
            bind_contextvars(message=message)

            if message.type == aiohttp.WSMsgType.ERROR:
                await self.websocket_message_error(message)
                continue

            try:
                data = json.loads(message.data)
            except JSONDecodeError as exception:
                await self.websocket_message_not_parsable(message, exception)
                continue

            unbind_contextvars("message")
            # bind_contextvars(data=data)

            if "msg" not in data:
                await self.websocket_message_missing_data_msg(data)
                continue

            num_fired = self.websocket_event_system.fire_event(
                event=data["msg"], data=data)
            if num_fired == 0:
                await self.missing_message_handler(data)
예제 #2
0
async def _bind_logger_tracecontext_middleware(request: Request, call_next) -> Response:
    """Bind request and tracing variables to logging."""
    # X-Request-ID can be used to assign a user-defined value to all log messages
    # and to the tracing span context.
    request_id = request.headers.get("x-request-id")
    current_span = trace.get_current_span()
    if request_id is not None:
        current_span.set_attribute("request_id", request_id)

    # The Trace-ID and Span-ID from the spancontext will be bound to log messages
    spancontext = current_span.get_span_context()
    trace_id = hex(spancontext.trace_id)
    span_id = hex(spancontext.span_id)

    clear_contextvars()
    with _bind_context(trace_id=trace_id):
        with _bind_context(span_id=span_id):
            with _bind_context(request_id=request_id):
                response = await call_next(request)

    # Set response headers with tracing information
    if request_id is not None:
        response.headers["X-Request-ID"] = request_id
    response.headers["X-Trace-ID"] = trace_id
    response.headers["X-Span-ID"] = span_id

    return response
예제 #3
0
    def close(self):
        """Flush and tear down the context."""
        self._bulk.flush()
        clear_contextvars()

        # Explicitly clear HTTP cache:
        expire = timedelta(seconds=settings.CACHE_EXPIRE)
        expire_at = datetime.utcnow() - expire
        self.http.cache.remove_old_entries(expire_at)
예제 #4
0
def apply_task_context(task, **kwargs):
    """This clears the current structured logging context and readies it
    for a new task from `servicelayer.jobs`."""
    # Setup context for structured logging
    clear_contextvars()
    bind_contextvars(job_id=task.job.id,
                     stage=task.stage.stage,
                     dataset=task.job.dataset.name,
                     start_time=time.time(),
                     trace_id=str(uuid.uuid4()),
                     **kwargs)
예제 #5
0
    async def add_context_logging(request: Request, call_next):
        clear_contextvars()

        request_id = str(uuid.uuid4())

        bind_contextvars(request_id=request_id)

        response = await call_next(request)
        clear_contextvars()

        response.headers["X-Request-ID"] = request_id
        return response
예제 #6
0
def on_request(request: Request) -> None:
    """Middleware function that runs prior to processing a request via Sanic."""
    # Generate a unique request ID and use it as a field in any logging that
    # takes place during the request handling.
    req_id = shortuuid.uuid()
    request.ctx.uuid = req_id

    contextvars.clear_contextvars()
    contextvars.bind_contextvars(request_id=req_id, )

    logger.debug(
        'processing HTTP request',
        method=request.method,
        ip=request.ip,
        path=request.path,
        headers=dict(request.headers),
        args=request.args,
    )
예제 #7
0
파일: context.py 프로젝트: sunu/aleph
def setup_logging_context(request):
    role_id = None
    if hasattr(request, "authz"):
        role_id = request.authz.id
    # Set up context varibales for structured logging. The context is included
    # with every log entry produced by this particular request
    clear_contextvars()
    bind_contextvars(
        v=__version__,
        method=request.method,
        endpoint=request.endpoint,
        referrer=request.referrer,
        ip=_get_remote_ip(),
        ua=str(request.user_agent),
        begin_time=datetime.utcfromtimestamp(request._begin_time).isoformat(),
        role_id=role_id,
        session_id=getattr(request, "_session_id", None),
        locale=getattr(request, "_app_locale", None),
        url=request.url,
        path=request.full_path,
        trace_id=request._trace_id,
    )
예제 #8
0
 async def coro():
     bind_contextvars(a=1)
     clear_contextvars()
     return merge_contextvars(None, None, {"b": 2})
예제 #9
0
 async def coro():
     clear_contextvars()
     return merge_contextvars(None, None, {})
예제 #10
0
def bind_logger(tracker: Tracker):
    clear_contextvars()
    bind_contextvars(sender_id=tracker.sender_id)
예제 #11
0
 def close(self) -> None:
     """Flush and tear down the context."""
     self.http.close()
     clear_contextvars()
def _bind(request_id):
    bind_contextvars(request_id=request_id)
    yield
    clear_contextvars()
예제 #13
0
    async def clear_structlog_context(request: Request, call_next) -> Response:
        from structlog.contextvars import clear_contextvars

        clear_contextvars()

        return await call_next(request)
예제 #14
0
 def close(self) -> None:
     """Flush and tear down the context."""
     clear_contextvars()
     db.session.commit()