-
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathutils.py
More file actions
136 lines (120 loc) · 5.05 KB
/
Copy pathutils.py
File metadata and controls
136 lines (120 loc) · 5.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import logging
from logging import Logger
# from azure.identity import ManagedIdentityCredential
from azure.monitor.opentelemetry.exporter import (
ApplicationInsightsSampler,
AzureMonitorLogExporter,
AzureMonitorMetricExporter,
AzureMonitorTraceExporter,
)
from fastapi import FastAPI
from fastapp.core.config import settings
from opentelemetry import trace
from opentelemetry._logs import set_logger_provider
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
from opentelemetry.instrumentation.httpx import HTTPXClientInstrumentor
from opentelemetry.instrumentation.system_metrics import SystemMetricsInstrumentor
from opentelemetry.metrics import set_meter_provider
from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
from opentelemetry.sdk.metrics import MeterProvider
from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader
from opentelemetry.sdk.resources import SERVICE_NAME, Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.trace import Tracer, set_tracer_provider
def setup_logging(module) -> Logger:
"""Setup logging and event handler.
RETURNS (Logger): The logger object to log activities.
"""
logger = logging.getLogger(module)
logger.setLevel(settings.LOGGING_LEVEL)
logger.propagate = False
# Create stream handler
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(
logging.Formatter("[%(asctime)s] [%(levelname)s] [%(module)-8.8s] %(message)s")
)
logger.addHandler(stream_handler)
return logger
def setup_tracer(module) -> Tracer:
"""Setup tracer and event handler.
RETURNS (Tracer): The tracer object to create spans.
"""
tracer = trace.get_tracer(module)
return tracer
def setup_opentelemetry(app: FastAPI):
"""Setup tracer for Open Telemetry.
app (FastAPI): The app to be instrumented by Open Telemetry.
RETURNS (None): Nothing is being returned.
"""
if settings.APPLICATIONINSIGHTS_CONNECTION_STRING:
# credential = ManagedIdentityCredential()
resource = Resource.create(
{
"service.name": settings.WEBSITE_NAME,
"service.namespace": settings.WEBSITE_NAME,
"service.instance.id": settings.WEBSITE_INSTANCE_ID,
}
)
# Create logger provider
logger_exporter = AzureMonitorLogExporter.from_connection_string(
settings.APPLICATIONINSIGHTS_CONNECTION_STRING,
# credential=credential
)
logger_provider = LoggerProvider(resource=resource)
logger_provider.add_log_record_processor(
BatchLogRecordProcessor(
exporter=logger_exporter,
schedule_delay_millis=settings.LOGGING_SCHEDULE_DELAY,
)
)
set_logger_provider(logger_provider)
handler = LoggingHandler(
level=settings.LOGGING_LEVEL, logger_provider=logger_provider
)
logging.getLogger().addHandler(handler)
# Create tracer provider
tracer_exporter = AzureMonitorTraceExporter.from_connection_string(
settings.APPLICATIONINSIGHTS_CONNECTION_STRING,
# credential=credential
)
sampler = ApplicationInsightsSampler(
sampling_ratio=settings.LOGGING_SAMPLING_RATIO
)
tracer_provider = TracerProvider(resource=resource, sampler=sampler)
tracer_provider.add_span_processor(
BatchSpanProcessor(
span_exporter=tracer_exporter,
schedule_delay_millis=settings.LOGGING_SCHEDULE_DELAY,
)
)
set_tracer_provider(tracer_provider)
# Create meter provider
metrics_exporter = AzureMonitorMetricExporter.from_connection_string(
settings.APPLICATIONINSIGHTS_CONNECTION_STRING,
# credential=credential
)
reader = PeriodicExportingMetricReader(
exporter=metrics_exporter,
export_interval_millis=settings.LOGGING_SCHEDULE_DELAY,
)
meter_provider = MeterProvider(metric_readers=[reader], resource=resource)
set_meter_provider(meter_provider)
# Configure custom metrics
system_metrics_config = {
"system.memory.usage": ["used", "free", "cached"],
"system.cpu.time": ["idle", "user", "system", "irq"],
"system.network.io": ["transmit", "receive"],
"process.runtime.memory": ["rss", "vms"],
"process.runtime.cpu.time": ["user", "system"],
}
# Create instrumenter
FastAPIInstrumentor.instrument_app(
app,
excluded_urls=f".*.in.applicationinsights.azure.com/.*,{settings.API_V1_STR}/health/heartbeat",
tracer_provider=tracer_provider,
meter_provider=meter_provider,
)
HTTPXClientInstrumentor().instrument()
SystemMetricsInstrumentor(config=system_metrics_config).instrument()