Skip to content

Python: Bug in logging to App Insights #2795

@jspoelstra

Description

@jspoelstra

agent-framework ==1.0.0b251108

I was using setup_observability() with applicationinsights_connection_string argument. Did not see any logs in App Insights - instead logs ended up on the console.

The issue was a type mismatch bug in the agent_framework library:

  • The library checks for isinstance(exporter, LogExporter)
  • But Azure Monitor exporters inherit from LogRecordExporter (not LogExporter)
  • These are two different classes, so the isinstance check fails
  • The library then adds a ConsoleLogExporter as a fallback, causing the verbose JSON output

The fix: Bypass agent_framework.setup_observability() entirely and manually configure OpenTelemetry providers directly, ensuring only Azure Monitor exporters are added (no console exporter):

conn_str = os.getenv("APPLICATIONINSIGHTS_CONNECTION_STRING")

    if conn_str:
        # Create Azure Monitor exporters
        from azure.monitor.opentelemetry.exporter import (
            AzureMonitorLogExporter,
            AzureMonitorTraceExporter,
            AzureMonitorMetricExporter,
        )

        # Set up resource
        resource = Resource.create({"service.name": "ioc-agent-batch"})

        # Configure trace provider
        trace_provider = TracerProvider(resource=resource)
        trace_provider.add_span_processor(BatchSpanProcessor(AzureMonitorTraceExporter(connection_string=conn_str)))
        trace.set_tracer_provider(trace_provider)

        # Configure log provider (MANUALLY - no console exporter!)
        log_provider = LoggerProvider(resource=resource)
        log_provider.add_log_record_processor(BatchLogRecordProcessor(AzureMonitorLogExporter(connection_string=conn_str)))
        _logs.set_logger_provider(log_provider)

        # Configure metrics provider
        metric_reader = PeriodicExportingMetricReader(AzureMonitorMetricExporter(connection_string=conn_str))
        metric_provider = MeterProvider(resource=resource, metric_readers=[metric_reader])
        metrics.set_meter_provider(metric_provider)

        # Attach OpenTelemetry handler to root logger
        root_logger = logging.getLogger()
        root_logger.addHandler(LoggingHandler(logger_provider=log_provider))
    else:
        # No App Insights connection - just use agent_framework defaults
        setup_observability(
            enable_sensitive_data=os.environ.get("ENABLE_SENSITIVE_DATA", "false").lower() == "true",
        )

Metadata

Metadata

Labels

observabilityIssues related to observability or telemetrypythonv1.0Features being tracked for the version 1.0 GA

Type

Projects

Status

Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions