-
Notifications
You must be signed in to change notification settings - Fork 67
/
Copy pathmain.py
113 lines (93 loc) · 2.75 KB
/
main.py
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
import pika
import redis
import sentry_sdk
from fastapi import FastAPI
from fastapi.routing import APIRoute
from sqladmin import Admin
from sqlalchemy.exc import OperationalError
from .core.admin.auth import AdminAuth
from .core.celery import celery
from .core.db.engine import get_engine
from .core.middleware.db_session_context import DBSessionMiddleware
from .core.middleware.nocache import NoCacheMiddleware
from .services.admin.config import admin_models, admin_views
from .services.user.routes import router as user_router
from .settings import settings
# SDK CLIENT GENERATION
def custom_generate_unique_id(route: APIRoute):
"""Modifier of tags for openapi for improving the sdk client experience"""
return f"{route.tags[0]}-{route.name}"
# Sentry Integration
sentry_sdk.init(
dsn=settings.sentry_dsn,
traces_sample_rate=settings.trace_rate,
)
app = FastAPI(generate_unique_id_function=custom_generate_unique_id)
# ROUTERS
routers = [user_router]
for router in routers:
app.include_router(router)
# ADMIN
admin = Admin(
app,
get_engine(),
templates_dir="app/services/admin/templates",
authentication_backend=AdminAuth(secret_key=settings.secret_key),
)
for item in admin_models + admin_views:
admin.add_view(item)
# MIDDLEWARES
app.add_middleware(NoCacheMiddleware)
app.add_middleware(DBSessionMiddleware, custom_engine=get_engine())
@app.get("/", tags=["general"])
def read_root():
return {"msg": "Welcome to the backend core in FastAPI!"}
def check_db_connection():
try:
with get_engine().connect():
return True
except OperationalError:
return False
@app.get("/check_health", tags=["general"])
async def check_health():
"""
Check all the services in the infrastructure are working
"""
ok_code = "running"
ko_code = "down"
# DB check
db_status = check_db_connection()
if db_status:
db_status = ok_code
else:
db_status = ko_code
# Celery check
celery_status = celery.control.inspect().ping()
if celery_status:
celery_status = ok_code
else:
celery_status = ko_code
# RabbitMQ check
try:
connection = pika.BlockingConnection(
pika.ConnectionParameters(host=settings.rabbit_host)
)
connection.close()
rabbitmq_check = ok_code
except Exception:
rabbitmq_check = ko_code
# Redis check
try:
redis_client = redis.StrictRedis(
host=settings.redis_host, port=settings.redis_port
)
redis_client.ping()
redis_status = ok_code
except Exception:
redis_status = ko_code
return {
"db": db_status,
"celery": celery_status,
"rabbitmq": rabbitmq_check,
"redis": redis_status,
}