This documentation was generated with AI assistance and is still being audited. Some, or potentially a lot, of this information may be inaccurate. Learn more.
defsetup_opentelemetry_metrics(config:TelemetryConfig)->None:"""Setup OpenTelemetry metrics with configuration. Args: config: Telemetry configuration """# Check if metrics are disabled first, before checking dependenciesifnotconfig.metrics_enabledorconfig.globally_disabled:slog.debug("π OpenTelemetry metrics disabled")return# Check if OpenTelemetry metrics are availableifnot_HAS_OTEL_METRICS:slog.debug("π OpenTelemetry metrics not available (dependencies not installed)")returnslog.debug("ππ Setting up OpenTelemetry metrics")# Create resource with service informationresource_attrs={}ifconfig.service_name:resource_attrs["service.name"]=config.service_nameifconfig.service_version:resource_attrs["service.version"]=config.service_versionresource=Resource.create(resource_attrs)# Setup metric readers with OTLP exporters if configuredreaders=[]ifconfig.otlp_endpoint:endpoint=config.otlp_endpointheaders=config.get_otlp_headers_dict()slog.debug(f"ππ€ Configuring OTLP metrics exporter: {endpoint}")# Choose exporter based on protocolifconfig.otlp_protocol=="grpc":exporter:OTLPGrpcMetricExporter|OTLPHttpMetricExporter=OTLPGrpcMetricExporter(endpoint=endpoint,headers=headers,)else:# http/protobufexporter=OTLPHttpMetricExporter(endpoint=endpoint,headers=headers,)# Create periodic reader (exports every 60 seconds by default)reader=PeriodicExportingMetricReader(exporter,export_interval_millis=60000)readers.append(reader)# Create meter providermeter_provider=MeterProvider(resource=resource,metric_readers=readers)# Set the global meter provider (only if not already set)try:current_provider=otel_metrics.get_meter_provider()provider_type=type(current_provider).__name__# Always allow setup if:# 1. It's a default/no-op provider# 2. It's a mock (for testing)# 3. It's our own MeterProvider type (allow re-configuration)should_setup=(provider_typein["NoOpMeterProvider","ProxyMeterProvider","Mock","MagicMock"]ornothasattr(current_provider,"get_meter")orcurrent_provider.__class__.__module__.startswith("unittest.mock"))ifshould_setup:otel_metrics.set_meter_provider(meter_provider)# Set the global meter for our metrics modulefromprovide.foundation.metricsimport_set_metermeter=otel_metrics.get_meter(__name__)_set_meter(meter)else:slog.debug("π OpenTelemetry meter provider already configured")exceptException:# Broad catch intentional: get_meter_provider() may fail in various OTEL environments# Proceed with setup if provider check failsotel_metrics.set_meter_provider(meter_provider)# Set the global meter for our metrics modulefromprovide.foundation.metricsimport_set_metermeter=otel_metrics.get_meter(__name__)_set_meter(meter)