|
7 | 7 | from logging import getLogger, Formatter |
8 | 8 | from typing import Dict, List, cast |
9 | 9 |
|
10 | | -from opentelemetry._events import _set_event_logger_provider |
11 | | -from opentelemetry._logs import set_logger_provider |
12 | | -from opentelemetry.instrumentation.dependencies import ( |
13 | | - get_dist_dependency_conflicts, |
14 | | -) |
15 | 10 | from opentelemetry.instrumentation.instrumentor import ( # type: ignore |
16 | 11 | BaseInstrumentor, |
17 | 12 | ) |
18 | 13 | from opentelemetry.metrics import set_meter_provider |
19 | | -from opentelemetry.sdk._events import EventLoggerProvider |
20 | | -from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler |
21 | | -from opentelemetry.sdk._logs.export import BatchLogRecordProcessor |
22 | 14 | from opentelemetry.sdk.metrics import MeterProvider |
23 | 15 | from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader |
24 | 16 | from opentelemetry.sdk.metrics.view import View |
|
32 | 24 | entry_points, |
33 | 25 | ) |
34 | 26 |
|
35 | | -from azure.core.settings import settings |
36 | | -from azure.core.tracing.ext.opentelemetry_span import OpenTelemetrySpan |
37 | 27 | from azure.monitor.opentelemetry._constants import ( |
38 | 28 | _ALL_SUPPORTED_INSTRUMENTED_LIBRARIES, |
39 | 29 | _AZURE_SDK_INSTRUMENTATION_NAME, |
|
58 | 48 | ) |
59 | 49 | from azure.monitor.opentelemetry.exporter import ( # pylint: disable=import-error,no-name-in-module |
60 | 50 | ApplicationInsightsSampler, |
61 | | - AzureMonitorLogExporter, |
62 | 51 | AzureMonitorMetricExporter, |
63 | 52 | AzureMonitorTraceExporter, |
64 | 53 | ) |
|
74 | 63 | _get_configurations, |
75 | 64 | _is_instrumentation_enabled, |
76 | 65 | ) |
| 66 | +from azure.monitor.opentelemetry._utils.instrumentation import ( |
| 67 | + get_dist_dependency_conflicts, |
| 68 | +) |
77 | 69 |
|
78 | 70 | _logger = getLogger(__name__) |
79 | 71 |
|
@@ -156,42 +148,91 @@ def _setup_tracing(configurations: Dict[str, ConfigurationValue]): |
156 | 148 | ) |
157 | 149 | tracer_provider.add_span_processor(bsp) |
158 | 150 | set_tracer_provider(tracer_provider) |
| 151 | + |
159 | 152 | if _is_instrumentation_enabled(configurations, _AZURE_SDK_INSTRUMENTATION_NAME): |
160 | | - settings.tracing_implementation = OpenTelemetrySpan |
| 153 | + try: |
| 154 | + from azure.core.settings import settings |
| 155 | + from azure.core.tracing.ext.opentelemetry_span import OpenTelemetrySpan |
| 156 | + |
| 157 | + settings.tracing_implementation = OpenTelemetrySpan |
| 158 | + except ImportError as ex: |
| 159 | + # This could possibly be due to breaking change in upstream OpenTelemetry |
| 160 | + # Advise user to upgrade to latest OpenTelemetry version |
| 161 | + _logger.warning( # pylint: disable=do-not-log-exceptions-if-not-debug |
| 162 | + "Exception occurred when importing Azure SDK Tracing." \ |
| 163 | + "Please upgrade to the latest OpenTelemetry version: %s.", |
| 164 | + ex, |
| 165 | + ) |
| 166 | + except Exception as ex: # pylint: disable=broad-except |
| 167 | + _logger.warning( # pylint: disable=do-not-log-exceptions-if-not-debug |
| 168 | + "Exception occurred when setting Azure SDK Tracing: %s.", |
| 169 | + ex, |
| 170 | + ) |
161 | 171 |
|
162 | 172 |
|
163 | 173 | def _setup_logging(configurations: Dict[str, ConfigurationValue]): |
164 | | - resource: Resource = configurations[RESOURCE_ARG] # type: ignore |
165 | | - logger_provider = LoggerProvider(resource=resource) |
166 | | - if configurations.get(ENABLE_LIVE_METRICS_ARG): |
167 | | - qlp = _QuickpulseLogRecordProcessor() |
168 | | - logger_provider.add_log_record_processor(qlp) |
169 | | - log_exporter = AzureMonitorLogExporter(**configurations) |
170 | | - log_record_processor = BatchLogRecordProcessor( |
171 | | - log_exporter, |
172 | | - ) |
173 | | - logger_provider.add_log_record_processor(log_record_processor) |
174 | | - set_logger_provider(logger_provider) |
175 | | - logger_name: str = configurations[LOGGER_NAME_ARG] # type: ignore |
176 | | - logging_formatter: Formatter = configurations[LOGGING_FORMATTER_ARG] # type: ignore |
177 | | - logger = getLogger(logger_name) |
178 | | - # Only add OpenTelemetry LoggingHandler if logger does not already have the handler |
179 | | - # This is to prevent most duplicate logging telemetry |
180 | | - if not any(isinstance(handler, LoggingHandler) for handler in logger.handlers): |
181 | | - handler = LoggingHandler(logger_provider=logger_provider) |
182 | | - if logging_formatter: |
183 | | - try: |
184 | | - handler.setFormatter(logging_formatter) |
185 | | - except Exception as ex: # pylint: disable=broad-except |
186 | | - _logger.warning( # pylint: disable=do-not-log-exceptions-if-not-debug |
187 | | - "Exception occurred when adding logging Formatter: %s.", |
188 | | - ex, |
189 | | - ) |
190 | | - logger.addHandler(handler) |
| 174 | + # Setup logging |
| 175 | + # Use try catch while signal is experimental |
| 176 | + try: |
| 177 | + from opentelemetry._logs import set_logger_provider |
| 178 | + from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler |
| 179 | + from opentelemetry.sdk._logs.export import BatchLogRecordProcessor |
| 180 | + |
| 181 | + from azure.monitor.opentelemetry.exporter import ( # pylint: disable=import-error,no-name-in-module |
| 182 | + AzureMonitorLogExporter |
| 183 | + ) |
191 | 184 |
|
192 | | - # Setup EventLoggerProvider |
193 | | - event_provider = EventLoggerProvider(logger_provider) |
194 | | - _set_event_logger_provider(event_provider, False) |
| 185 | + resource: Resource = configurations[RESOURCE_ARG] # type: ignore |
| 186 | + logger_provider = LoggerProvider(resource=resource) |
| 187 | + if configurations.get(ENABLE_LIVE_METRICS_ARG): |
| 188 | + qlp = _QuickpulseLogRecordProcessor() |
| 189 | + logger_provider.add_log_record_processor(qlp) |
| 190 | + log_exporter = AzureMonitorLogExporter(**configurations) |
| 191 | + log_record_processor = BatchLogRecordProcessor( |
| 192 | + log_exporter, |
| 193 | + ) |
| 194 | + logger_provider.add_log_record_processor(log_record_processor) |
| 195 | + set_logger_provider(logger_provider) |
| 196 | + logger_name: str = configurations[LOGGER_NAME_ARG] # type: ignore |
| 197 | + logging_formatter: Formatter = configurations[LOGGING_FORMATTER_ARG] # type: ignore |
| 198 | + logger = getLogger(logger_name) |
| 199 | + # Only add OpenTelemetry LoggingHandler if logger does not already have the handler |
| 200 | + # This is to prevent most duplicate logging telemetry |
| 201 | + if not any(isinstance(handler, LoggingHandler) for handler in logger.handlers): |
| 202 | + handler = LoggingHandler(logger_provider=logger_provider) |
| 203 | + if logging_formatter: |
| 204 | + try: |
| 205 | + handler.setFormatter(logging_formatter) |
| 206 | + except Exception as ex: # pylint: disable=broad-except |
| 207 | + _logger.warning( # pylint: disable=do-not-log-exceptions-if-not-debug |
| 208 | + "Exception occurred when adding logging Formatter: %s.", |
| 209 | + ex, |
| 210 | + ) |
| 211 | + logger.addHandler(handler) |
| 212 | + |
| 213 | + # Setup Events |
| 214 | + try: |
| 215 | + from opentelemetry._events import _set_event_logger_provider |
| 216 | + from opentelemetry.sdk._events import EventLoggerProvider |
| 217 | + |
| 218 | + event_provider = EventLoggerProvider(logger_provider) |
| 219 | + _set_event_logger_provider(event_provider, False) |
| 220 | + except ImportError as ex: |
| 221 | + # If the events is not available, we will not set it up. |
| 222 | + # This could possibly be due to breaking change in upstream OpenTelemetry |
| 223 | + # Advise user to upgrade to latest OpenTelemetry version |
| 224 | + _logger.warning( # pylint: disable=do-not-log-exceptions-if-not-debug |
| 225 | + "Exception occurred when setting up Events. Please upgrade to the latest OpenTelemetry version: %s.", |
| 226 | + ex, |
| 227 | + ) |
| 228 | + except ImportError as ex: |
| 229 | + # If the events is not available, we will not set it up. |
| 230 | + # This could possibly be due to breaking change in upstream OpenTelemetry |
| 231 | + # Advise user to upgrade to latest OpenTelemetry version |
| 232 | + _logger.warning( # pylint: disable=do-not-log-exceptions-if-not-debug |
| 233 | + "Exception occurred when setting up Logging. Please upgrade to the latest OpenTelemetry version: %s.", |
| 234 | + ex, |
| 235 | + ) |
195 | 236 |
|
196 | 237 |
|
197 | 238 | def _setup_metrics(configurations: Dict[str, ConfigurationValue]): |
|
0 commit comments