/
urusai
/
code_sample
Обзор
Документация
Войти
/
urusai
/
code_sample
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/main.py
113 строк
4 KB
nick
linters
30 сен 2024, 16:13
30 сен 2024, 16:13
09a0f4a
Код
Авторство
О чём код?
import logging from logging.config import dictConfig from fastapi import FastAPI from opentelemetry import trace from starlette_exporter import PrometheusMiddleware, handle_metrics from starlette.middleware.cors import CORSMiddleware from starlette.middleware.trustedhost import TrustedHostMiddleware from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor from opentelemetry.instrumentation.logging import LoggingInstrumentor from opentelemetry.instrumentation.sqlalchemy import SQLAlchemyInstrumentor from opentelemetry.instrumentation.aiohttp_client import AioHttpClientInstrumentor from di.factory import ConfigFactory, EngineFactory, SentryFactory, TracerFactory from di.markers import SettingsAPIMarker, AsyncEngineFactoryMarker from api.v1.binding import own_router_v1 from di.dependencies import fastapi_dependency_overrides from exceptions.binding import setup_exception_handlers from settings.api.settings import SettingsApplication from settings.logs.settings import settings_sensus_app from utils.logs.middlewares import LoggingMiddleware from settings.sentry.settings import SentrySettings dictConfig(settings_sensus_app.log_config) logger = logging.getLogger(__name__) tracer_factory = TracerFactory( service_name="nri-core-v1", sentry=SentryFactory( settings=SentrySettings(), traces_sample_rate=1.0, ), ) tracer = tracer_factory.tracer() trace.set_tracer_provider(tracer) tracer_factory.sentry.init() def get_app() -> FastAPI: config = ConfigFactory() application = FastAPI( debug=False, docs_url=None, openapi_url="/api/v1/openapi.json", title="NRI Core Microservice", version="1.0.0", root_path="/api/v1", ) dependency_overrides = fastapi_dependency_overrides(config=config) application.dependency_overrides = dependency_overrides application.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) application.add_middleware(TrustedHostMiddleware, allowed_hosts=["*"]) application.add_middleware( PrometheusMiddleware, app_name="v3", skip_paths=["/api/v1/docs", "/api/v1/metrics"], ) if config.application.LOGGING: engine_factory: EngineFactory = application.dependency_overrides.get( AsyncEngineFactoryMarker )() application.middleware("http")(LoggingMiddleware()) if config.logs.ENABLE_TELEMETRY: LoggingInstrumentor().instrument(set_logging_format=True) AioHttpClientInstrumentor().instrument() FastAPIInstrumentor.instrument_app(application, tracer_provider=tracer) SQLAlchemyInstrumentor().instrument( engine=engine_factory.engine.sync_engine ) application = setup_exception_handlers(app=application) application.include_router(own_router_v1) application_settings: SettingsApplication = application.dependency_overrides.get( SettingsAPIMarker )() tags_metadata = [ { "name": "v1", "description": "Версия API - v1. Нажмите справа для перехода в документацию", "externalDocs": { "description": "дополнительная документация", "url": f"{application_settings.BASE_DOMAIN}/api/v1/docs", }, }, ] application_own = FastAPI( openapi_tags=tags_metadata, version="1.0.0a", ) application_own.mount("/api/v1", application) application_own.add_route("/metrics", handle_metrics) return application_own app = get_app()