4
4
from azure .monitor .opentelemetry import configure_azure_monitor
5
5
6
6
# from azure.identity import ManagedIdentityCredential
7
+ from azure .monitor .opentelemetry .exporter import (
8
+ ApplicationInsightsSampler ,
9
+ AzureMonitorLogExporter ,
10
+ AzureMonitorMetricExporter ,
11
+ AzureMonitorTraceExporter ,
12
+ )
7
13
from fastapi import FastAPI
8
14
from fastapp .core .config import settings
9
15
from opentelemetry import trace
10
- from opentelemetry .instrumentation .httpx import HTTPXClientInstrumentor
16
+ from opentelemetry ._logs import set_logger_provider
17
+ from opentelemetry .instrumentation .aiohttp_client import AioHttpClientInstrumentor
18
+ from opentelemetry .instrumentation .fastapi import FastAPIInstrumentor
11
19
from opentelemetry .instrumentation .system_metrics import SystemMetricsInstrumentor
12
- from opentelemetry .trace import Tracer
20
+ from opentelemetry .metrics import set_meter_provider
21
+ from opentelemetry .sdk ._logs import LoggerProvider , LoggingHandler
22
+ from opentelemetry .sdk ._logs .export import BatchLogRecordProcessor
23
+ from opentelemetry .sdk .metrics import MeterProvider
24
+ from opentelemetry .sdk .metrics .export import PeriodicExportingMetricReader
25
+ from opentelemetry .sdk .resources import SERVICE_NAME , Resource
26
+ from opentelemetry .sdk .trace import TracerProvider
27
+ from opentelemetry .sdk .trace .export import BatchSpanProcessor
28
+ from opentelemetry .trace import Tracer , get_tracer_provider , set_tracer_provider
13
29
14
30
15
31
def setup_logging (module ) -> Logger :
@@ -47,13 +63,48 @@ def setup_opentelemetry(app: FastAPI):
47
63
"""
48
64
if settings .APPLICATIONINSIGHTS_CONNECTION_STRING :
49
65
# credential = ManagedIdentityCredential()
66
+ resource = Resource .create (
67
+ {
68
+ "service.name" : settings .WEBSITE_NAME ,
69
+ "service.instance.id" : settings .WEBSITE_INSTANCE_ID ,
70
+ }
71
+ )
72
+
73
+ # Create logger provider
74
+ logger_exporter = AzureMonitorLogExporter .from_connection_string (
75
+ settings .APPLICATIONINSIGHTS_CONNECTION_STRING ,
76
+ # credential=credential
77
+ )
78
+ logger_provider = LoggerProvider (resource = resource )
79
+ logger_provider .add_log_record_processor (
80
+ BatchLogRecordProcessor (logger_exporter )
81
+ )
82
+ set_logger_provider (logger_provider )
83
+ handler = LoggingHandler (
84
+ level = settings .LOGGING_LEVEL , logger_provider = logger_provider
85
+ )
86
+ logging .getLogger ().addHandler (handler )
50
87
51
- # Configure azure monitor exporter
52
- configure_azure_monitor (
53
- connection_string = settings .APPLICATIONINSIGHTS_CONNECTION_STRING ,
54
- disable_offline_storage = False ,
55
- # credential=credential,
88
+ # Create tracer provider
89
+ tracer_exporter = AzureMonitorTraceExporter .from_connection_string (
90
+ settings .APPLICATIONINSIGHTS_CONNECTION_STRING ,
91
+ # credential=credential
56
92
)
93
+ sampler = ApplicationInsightsSampler (1.0 )
94
+ tracer_provider = TracerProvider (resource = resource , sampler = sampler )
95
+ tracer_provider .add_span_processor (BatchSpanProcessor (tracer_exporter ))
96
+ set_tracer_provider (tracer_provider )
97
+
98
+ # Create meter provider
99
+ metrics_exporter = AzureMonitorMetricExporter .from_connection_string (
100
+ settings .APPLICATIONINSIGHTS_CONNECTION_STRING ,
101
+ # credential=credential
102
+ )
103
+ reader = PeriodicExportingMetricReader (
104
+ metrics_exporter , export_interval_millis = 5000
105
+ )
106
+ meter_provider = MeterProvider (metric_readers = [reader ])
107
+ set_meter_provider (meter_provider )
57
108
58
109
# Configure custom metrics
59
110
system_metrics_config = {
@@ -65,5 +116,11 @@ def setup_opentelemetry(app: FastAPI):
65
116
}
66
117
67
118
# Create instrumenter
119
+ FastAPIInstrumentor .instrument_app (
120
+ app ,
121
+ excluded_urls = f"{ settings .API_V1_STR } /health/heartbeat" ,
122
+ tracer_provider = tracer_provider ,
123
+ meter_provider = meter_provider ,
124
+ )
68
125
HTTPXClientInstrumentor ().instrument ()
69
126
SystemMetricsInstrumentor (config = system_metrics_config ).instrument ()
0 commit comments