Example #1
0
    def emit(self, record):
        """Actually log the specified logging record.

        Overrides the default emit behavior of ``StreamHandler``.

        See https://docs.python.org/2/library/logging.html#handler-objects

        Args:
            record (logging.LogRecord): The record to be logged.
        """
        message = super(AppEngineHandler, self).format(record)
        inferred_http, inferred_trace, _, _ = get_request_data()
        if inferred_trace is not None:
            inferred_trace = f"projects/{self.project_id}/traces/{inferred_trace}"
        # allow user overrides
        trace = getattr(record, "trace", inferred_trace)
        span_id = getattr(record, "span_id", None)
        http_request = getattr(record, "http_request", inferred_http)
        resource = getattr(record, "resource", self.resource)
        user_labels = getattr(record, "labels", {})
        # merge labels
        gae_labels = self.get_gae_labels()
        gae_labels.update(user_labels)
        # send off request
        self.transport.send(
            record,
            message,
            resource=resource,
            labels=gae_labels,
            trace=trace,
            span_id=span_id,
            http_request=http_request,
        )
Example #2
0
 def filter(self, record):
     """
     Add new Cloud Logging data to each LogRecord as it comes in
     """
     user_labels = getattr(record, "labels", {})
     # infer request data from the environment
     inferred_http, inferred_trace, inferred_span = get_request_data()
     if inferred_http is not None:
         # filter inferred_http to include only well-supported fields
         inferred_http = {
             k: v
             for (k, v) in inferred_http.items()
             if k in self._supported_http_fields and v is not None
         }
     if inferred_trace is not None and self.project is not None:
         # add full path for detected trace
         inferred_trace = f"projects/{self.project}/traces/{inferred_trace}"
     # set new record values
     record._resource = getattr(record, "resource", None)
     record._trace = getattr(record, "trace", inferred_trace) or None
     record._span_id = getattr(record, "span_id", inferred_span) or None
     record._http_request = getattr(record, "http_request", inferred_http)
     record._source_location = CloudLoggingFilter._infer_source_location(
         record)
     record._labels = {**self.default_labels, **user_labels} or None
     # create string representations for structured logging
     record._trace_str = record._trace or ""
     record._span_id_str = record._span_id or ""
     record._http_request_str = json.dumps(record._http_request or {})
     record._source_location_str = json.dumps(record._source_location or {})
     record._labels_str = json.dumps(record._labels or {})
     # break quotes for parsing through structured logging
     record._msg_str = str(record.msg).replace('"',
                                               '\\"') if record.msg else ""
     return True
Example #3
0
    def get_gae_labels(self):
        """Return the labels for GAE app.

        If the trace ID can be detected, it will be included as a label.
        Currently, no other labels are included.

        Returns:
            dict: Labels for GAE app.
        """
        gae_labels = {}

        _, trace_id, _, _ = get_request_data()
        if trace_id is not None:
            gae_labels[_TRACE_ID_LABEL] = trace_id

        return gae_labels
Example #4
0
 def filter(self, record):
     """
     Add new Cloud Logging data to each LogRecord as it comes in
     """
     user_labels = getattr(record, "labels", {})
     # infer request data from the environment
     (
         inferred_http,
         inferred_trace,
         inferred_span,
         inferred_sampled,
     ) = get_request_data()
     if inferred_trace is not None and self.project is not None:
         # add full path for detected trace
         inferred_trace = f"projects/{self.project}/traces/{inferred_trace}"
     # set new record values
     record._resource = getattr(record, "resource", None)
     record._trace = getattr(record, "trace", inferred_trace) or None
     record._span_id = getattr(record, "span_id", inferred_span) or None
     record._trace_sampled = bool(
         getattr(record, "trace_sampled", inferred_sampled))
     record._http_request = getattr(record, "http_request", inferred_http)
     record._source_location = CloudLoggingFilter._infer_source_location(
         record)
     # add logger name as a label if possible
     logger_label = {"python_logger": record.name} if record.name else {}
     record._labels = {
         **logger_label,
         **self.default_labels,
         **user_labels
     } or None
     # create string representations for structured logging
     record._trace_str = record._trace or ""
     record._span_id_str = record._span_id or ""
     record._trace_sampled_str = "true" if record._trace_sampled else "false"
     record._http_request_str = json.dumps(record._http_request or {},
                                           ensure_ascii=False)
     record._source_location_str = json.dumps(record._source_location or {},
                                              ensure_ascii=False)
     record._labels_str = json.dumps(record._labels or {},
                                     ensure_ascii=False)
     return True
    def _call_fut():
        from google.cloud.logging_v2.handlers import _helpers

        return _helpers.get_request_data()
    def _call_fut():
        from google.cloud.logging_v2.handlers import _helpers

        http, trace, span, sampled = _helpers.get_request_data()
        return http, trace, span, sampled