Skip to content

Commit a4ba297

Browse files
committed
Switch to manual Exporter
1 parent 610e93b commit a4ba297

File tree

2 files changed

+66
-9
lines changed

2 files changed

+66
-9
lines changed

code/function/fastapp/core/config.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ class Settings(BaseSettings):
1414
APPLICATIONINSIGHTS_CONNECTION_STRING: str = Field(
1515
default="", env="APPLICATIONINSIGHTS_CONNECTION_STRING"
1616
)
17-
WEBSITE_NAME: str = Field(default="", env="WEBSITE_SITE_NAME")
18-
WEBSITE_INSTANCE_ID: str = Field(default="", env="WEBSITE_INSTANCE_ID")
17+
WEBSITE_NAME: str = Field(default="test", env="WEBSITE_SITE_NAME")
18+
WEBSITE_INSTANCE_ID: str = Field(default="0", env="WEBSITE_INSTANCE_ID")
1919
MY_SECRET_CONFIG: str = Field(default="", env="MY_SECRET_CONFIG")
2020

2121

code/function/fastapp/utils.py

Lines changed: 64 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,28 @@
44
from azure.monitor.opentelemetry import configure_azure_monitor
55

66
# from azure.identity import ManagedIdentityCredential
7+
from azure.monitor.opentelemetry.exporter import (
8+
ApplicationInsightsSampler,
9+
AzureMonitorLogExporter,
10+
AzureMonitorMetricExporter,
11+
AzureMonitorTraceExporter,
12+
)
713
from fastapi import FastAPI
814
from fastapp.core.config import settings
915
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
1119
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
1329

1430

1531
def setup_logging(module) -> Logger:
@@ -47,13 +63,48 @@ def setup_opentelemetry(app: FastAPI):
4763
"""
4864
if settings.APPLICATIONINSIGHTS_CONNECTION_STRING:
4965
# 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)
5087

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
5692
)
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)
57108

58109
# Configure custom metrics
59110
system_metrics_config = {
@@ -65,5 +116,11 @@ def setup_opentelemetry(app: FastAPI):
65116
}
66117

67118
# 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+
)
68125
HTTPXClientInstrumentor().instrument()
69126
SystemMetricsInstrumentor(config=system_metrics_config).instrument()

0 commit comments

Comments
 (0)