Exemple #1
0
def _create_telemetry_handler() -> "AzureLogHandler":
    """
    Configure, create, and return the telemetry handler
    """
    from opencensus.ext.azure.log_exporter import AzureLogHandler
    global telemetry_handler

    # The default_custom_dimensions will appear in the "customDimensions"
    # field in Azure log analytics for every log message alongside any
    # custom dimensions that message may have. All messages additionally come
    # with custom dimensions fileName, level, lineNumber, module, and process
    default_custom_dimensions = {"pythonExecutable": sys.executable}

    class CustomDimensionsFilter(logging.Filter):
        """
        Add application-wide properties to the customDimension field of
        AzureLogHandler records
        """
        def __init__(self, custom_dimensions: Dict[str, str]):
            super().__init__()
            self.custom_dimensions = custom_dimensions

        def filter(self, record: logging.LogRecord) -> bool:
            """
            Add the default custom_dimensions into the current log record
            """
            cdim = self.custom_dimensions.copy()
            cdim.update(getattr(record, "custom_dimensions", {}))
            record.custom_dimensions = cdim  # type: ignore[attr-defined]

            return True

    # Transport module of opencensus-ext-azure logs info 'transmission
    # succeeded' which is also exported to azure if AzureLogHandler is
    # in root_logger. The following lines stops that.
    logging.getLogger("opencensus.ext.azure.common.transport").setLevel(
        logging.WARNING)

    loc = qc.config.GUID_components.location
    stat = qc.config.GUID_components.work_station

    def callback_function(envelope: "Envelope") -> bool:
        envelope.tags["ai.user.accountId"] = platform.node()
        envelope.tags["ai.user.id"] = f"{loc:02x}-{stat:06x}"
        return True

    telemetry_handler = AzureLogHandler(
        connection_string=f"InstrumentationKey="
        f"{qc.config.telemetry.instrumentation_key}")
    telemetry_handler.add_telemetry_processor(callback_function)
    telemetry_handler.setLevel(logging.INFO)
    telemetry_handler.addFilter(
        CustomDimensionsFilter(default_custom_dimensions))
    telemetry_handler.setFormatter(get_formatter_for_telemetry())

    return telemetry_handler
    def _initialize_azure_log_handler(self, component_name, custom_dimensions):
        """Initialize azure log handler."""
        # Adding logging to trace_integrations
        # This will help in adding trace and span ids to logs
        # https://github.com/census-instrumentation/opencensus-python/tree/master/contrib/opencensus-ext-logging

        logging.basicConfig(
            format="%(asctime)s name=%(name)s level=%(levelname)s "
            "traceId=%(traceId)s spanId=%(spanId)s %(message)s"
        )
        app_insights_cs = "InstrumentationKey=" + self._get_app_insights_key()
        log_handler = AzureLogHandler(
            connection_string=app_insights_cs, export_interval=0.0
        )
        log_handler.add_telemetry_processor(self._get_callback(component_name))
        log_handler.name = self.HANDLER_NAME
        log_handler.addFilter(CustomDimensionsFilter(custom_dimensions))
        return log_handler