rollbar / pyrollbar

Error tracking and logging from Python to Rollbar
https://docs.rollbar.com/docs/python/
MIT License
213 stars 133 forks source link

Rollbar not working with FastAPI #424

Closed BenjaminIrwin closed 1 year ago

BenjaminIrwin commented 1 year ago

Python: 3.7.10 Rollbar: 0.16.3

I am trying to add rollbar to a complex open source FastAPI-based application (https://github.com/AUTOMATIC1111/stable-diffusion-webui). I want to get request body content, so I am trying to integrate via the FastAPI Router.

My rollbar init code:

rollbar.init('<token>',
             handler='async',
             include_request_body=True
             )

My setup code (added to line 140 of modules/api/api.py):

class Api:
    def __init__(self, app: FastAPI, queue_lock: Lock):
        self.router = APIRouter()
        rollbar_add_to(self.router)
        print("Rollbar added to API server")
        self.app = app
        self.queue_lock = queue_lock
        api_middleware(self.app)
       self.add_api_route_auth("/sdapi/v1/txt2img", self.text2imgapi, methods=["POST"], 
             response_model=TextToImageResponse)
       self.add_api_route_auth("/sdapi/v1/img2img", self.img2imgapi, methods=["POST"], 
             response_model=ImageToImageResponse)

The API runs and works with no problems, but when I trigger an error, Rollbar doesn't log anything. This is the stack trace from an error:

Server Error
ERROR:    Exception in ASGI application
Traceback (most recent call last):
  File "/home/ec2-user/stable-diffusion-backend/venv/lib64/python3.7/site-packages/anyio/streams/memory.py", line 94, in receive
    return self.receive_nowait()
  File "/home/ec2-user/stable-diffusion-backend/venv/lib64/python3.7/site-packages/anyio/streams/memory.py", line 89, in receive_nowait
    raise WouldBlock
anyio.WouldBlock

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ec2-user/stable-diffusion-backend/venv/lib64/python3.7/site-packages/starlette/middleware/base.py", line 77, in call_next
    message = await recv_stream.receive()
  File "/home/ec2-user/stable-diffusion-backend/venv/lib64/python3.7/site-packages/anyio/streams/memory.py", line 114, in receive
    raise EndOfStream
anyio.EndOfStream

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ec2-user/stable-diffusion-backend/venv/lib64/python3.7/site-packages/uvicorn/protocols/http/h11_impl.py", line 408, in run_asgi
    self.scope, self.receive, self.send
  File "/home/ec2-user/stable-diffusion-backend/venv/lib64/python3.7/site-packages/uvicorn/middleware/proxy_headers.py", line 78, in __call__
    return await self.app(scope, receive, send)
  File "/home/ec2-user/stable-diffusion-backend/venv/lib64/python3.7/site-packages/fastapi/applications.py", line 271, in __call__
    await super().__call__(scope, receive, send)
  File "/home/ec2-user/stable-diffusion-backend/venv/lib64/python3.7/site-packages/starlette/applications.py", line 125, in __call__
    await self.middleware_stack(scope, receive, send)
  File "/home/ec2-user/stable-diffusion-backend/venv/lib64/python3.7/site-packages/starlette/middleware/errors.py", line 184, in __call__
    raise exc
  File "/home/ec2-user/stable-diffusion-backend/venv/lib64/python3.7/site-packages/starlette/middleware/errors.py", line 162, in __call__
    await self.app(scope, receive, _send)
  File "/home/ec2-user/stable-diffusion-backend/venv/lib64/python3.7/site-packages/starlette/middleware/base.py", line 106, in __call__
    response = await self.dispatch_func(request, call_next)
  File "/home/ec2-user/stable-diffusion-backend/modules/api/api.py", line 120, in log_and_time
    res: Response = await call_next(req)
  File "/home/ec2-user/stable-diffusion-backend/venv/lib64/python3.7/site-packages/starlette/middleware/base.py", line 80, in call_next
    raise app_exc
  File "/home/ec2-user/stable-diffusion-backend/venv/lib64/python3.7/site-packages/starlette/middleware/base.py", line 69, in coro
    await self.app(scope, receive_or_disconnect, send_no_error)
  File "/home/ec2-user/stable-diffusion-backend/venv/lib64/python3.7/site-packages/starlette/middleware/gzip.py", line 24, in __call__
    await responder(scope, receive, send)
  File "/home/ec2-user/stable-diffusion-backend/venv/lib64/python3.7/site-packages/starlette/middleware/gzip.py", line 44, in __call__
    await self.app(scope, receive, self.send_with_gzip)
  File "/home/ec2-user/stable-diffusion-backend/venv/lib64/python3.7/site-packages/starlette/middleware/exceptions.py", line 79, in __call__
    raise exc
  File "/home/ec2-user/stable-diffusion-backend/venv/lib64/python3.7/site-packages/starlette/middleware/exceptions.py", line 68, in __call__
    await self.app(scope, receive, sender)
  File "/home/ec2-user/stable-diffusion-backend/venv/lib64/python3.7/site-packages/fastapi/middleware/asyncexitstack.py", line 21, in __call__
    raise e
  File "/home/ec2-user/stable-diffusion-backend/venv/lib64/python3.7/site-packages/fastapi/middleware/asyncexitstack.py", line 18, in __call__
    await self.app(scope, receive, send)
  File "/home/ec2-user/stable-diffusion-backend/venv/lib64/python3.7/site-packages/starlette/routing.py", line 706, in __call__
    await route.handle(scope, receive, send)
  File "/home/ec2-user/stable-diffusion-backend/venv/lib64/python3.7/site-packages/starlette/routing.py", line 276, in handle
    await self.app(scope, receive, send)
  File "/home/ec2-user/stable-diffusion-backend/venv/lib64/python3.7/site-packages/starlette/routing.py", line 66, in app
    response = await func(request)
  File "/home/ec2-user/stable-diffusion-backend/venv/lib64/python3.7/site-packages/fastapi/routing.py", line 238, in app
    dependant=dependant, values=values, is_coroutine=is_coroutine
  File "/home/ec2-user/stable-diffusion-backend/venv/lib64/python3.7/site-packages/fastapi/routing.py", line 165, in run_endpoint_function
    return await run_in_threadpool(dependant.call, **values)
  File "/home/ec2-user/stable-diffusion-backend/venv/lib64/python3.7/site-packages/starlette/concurrency.py", line 41, in run_in_threadpool
    return await anyio.to_thread.run_sync(func, *args)
  File "/home/ec2-user/stable-diffusion-backend/venv/lib64/python3.7/site-packages/anyio/to_thread.py", line 32, in run_sync
    func, *args, cancellable=cancellable, limiter=limiter
  File "/home/ec2-user/stable-diffusion-backend/venv/lib64/python3.7/site-packages/anyio/_backends/_asyncio.py", line 937, in run_sync_in_worker_thread
    return await future
  File "/home/ec2-user/stable-diffusion-backend/venv/lib64/python3.7/site-packages/anyio/_backends/_asyncio.py", line 867, in run
    result = context.run(func, *args)
  File "/home/ec2-user/stable-diffusion-backend/modules/api/api.py", line 425, in get_cmd_flags
    cause_error_with_local_variables
NameError: name 'cause_error_with_local_variables' is not defined

Any ideas how I can fix this?

danielmorell commented 1 year ago

Under the hood Rollbar supplies a class that extends APIRoute and replaces the default app.router.route_class with the Rollbar route class. If you are modifying the app.router.route_class instance later in your init() method, you would see this sort of problem.

danielmorell commented 1 year ago

Closing due to inactivity.