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