diff --git a/server/poetry.lock b/server/poetry.lock index 8af4d656..bef08557 100644 --- a/server/poetry.lock +++ b/server/poetry.lock @@ -1835,6 +1835,49 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +[[package]] +name = "sentry-sdk" +version = "1.29.2" +description = "Python client for Sentry (https://sentry.io)" +optional = false +python-versions = "*" +files = [ + {file = "sentry-sdk-1.29.2.tar.gz", hash = "sha256:a99ee105384788c3f228726a88baf515fe7b5f1d2d0f215a03d194369f158df7"}, + {file = "sentry_sdk-1.29.2-py2.py3-none-any.whl", hash = "sha256:3e17215d8006612e2df02b0e73115eb8376c37e3f586d8436fa41644e605074d"}, +] + +[package.dependencies] +certifi = "*" +fastapi = {version = ">=0.79.0", optional = true, markers = "extra == \"fastapi\""} +urllib3 = {version = ">=1.26.11", markers = "python_version >= \"3.6\""} + +[package.extras] +aiohttp = ["aiohttp (>=3.5)"] +arq = ["arq (>=0.23)"] +beam = ["apache-beam (>=2.12)"] +bottle = ["bottle (>=0.12.13)"] +celery = ["celery (>=3)"] +chalice = ["chalice (>=1.16.0)"] +django = ["django (>=1.8)"] +falcon = ["falcon (>=1.4)"] +fastapi = ["fastapi (>=0.79.0)"] +flask = ["blinker (>=1.1)", "flask (>=0.11)", "markupsafe"] +grpcio = ["grpcio (>=1.21.1)"] +httpx = ["httpx (>=0.16.0)"] +huey = ["huey (>=2)"] +loguru = ["loguru (>=0.5)"] +opentelemetry = ["opentelemetry-distro (>=0.35b0)"] +pure-eval = ["asttokens", "executing", "pure-eval"] +pymongo = ["pymongo (>=3.1)"] +pyspark = ["pyspark (>=2.4.4)"] +quart = ["blinker (>=1.1)", "quart (>=0.16.1)"] +rq = ["rq (>=0.6)"] +sanic = ["sanic (>=0.8)"] +sqlalchemy = ["sqlalchemy (>=1.2)"] +starlette = ["starlette (>=0.19.1)"] +starlite = ["starlite (>=1.48)"] +tornado = ["tornado (>=5)"] + [[package]] name = "sniffio" version = "1.3.0" @@ -2327,4 +2370,4 @@ multidict = ">=4.0" [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "d696a09d54edbfc0ab52bd4e7b1ba09f3930ac5d3156df511cc3094ddb7d6ac5" +content-hash = "f94162f1217c3767f792902a9a45fec81275ae3a98f2809662bf3a3d574984e2" diff --git a/server/pyproject.toml b/server/pyproject.toml index d2c5e8fa..3fb95f39 100644 --- a/server/pyproject.toml +++ b/server/pyproject.toml @@ -20,6 +20,7 @@ pydantic-settings = "^2.0.2" structlog = "^23.1.0" uvicorn = {extras = ["standard"], version = "^0.23.1"} fastapi = "^0.100.1" +sentry-sdk = {extras = ["fastapi"], version = "^1.29.2"} [tool.poetry.group.dev.dependencies] diff --git a/server/reflector/app.py b/server/reflector/app.py index b07ef54e..36e86d9a 100644 --- a/server/reflector/app.py +++ b/server/reflector/app.py @@ -2,8 +2,15 @@ from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from reflector.views.rtc_offer import router as rtc_offer_router from reflector.events import subscribers_startup, subscribers_shutdown +from reflector.logger import logger +from reflector.settings import settings from contextlib import asynccontextmanager +try: + import sentry_sdk +except ImportError: + sentry_sdk = None + # lifespan events @asynccontextmanager @@ -15,6 +22,17 @@ async def lifespan(app: FastAPI): await func() +# use sentry if available +if settings.SENTRY_DSN: + if not sentry_sdk: + logger.error("Sentry is not installed, avoided") + else: + logger.info("Sentry enabled") + sentry_sdk.init(dsn=settings.SENTRY_DSN, traces_sample_rate=1.0) +else: + logger.info("Sentry disabled") + + # build app app = FastAPI(lifespan=lifespan) app.add_middleware( diff --git a/server/reflector/settings.py b/server/reflector/settings.py index 0b6f6df5..fe1243bf 100644 --- a/server/reflector/settings.py +++ b/server/reflector/settings.py @@ -44,5 +44,8 @@ class Settings(BaseSettings): STORAGE_AWS_SECRET_KEY: str = "" STORAGE_AWS_BUCKET: str = "" + # Sentry + SENTRY_DSN: str | None = None + settings = Settings()