|
12 | 12 | # Flask |
13 | 13 | from flask import Flask |
14 | 14 |
|
15 | | -# OpenAI library |
16 | | -import openai |
| 15 | +# Honeybadger support |
| 16 | +from honeybadger.contrib import FlaskHoneybadger |
| 17 | +from honeybadger.contrib.logger import HoneybadgerHandler |
17 | 18 |
|
18 | 19 | def create_app(test_config=None): |
19 | 20 | # create and configure the app |
@@ -42,6 +43,35 @@ def create_app(test_config=None): |
42 | 43 | logging.log(100, f"Setting up application. Logging level={log_level}") |
43 | 44 | logging.basicConfig(format='%(asctime)s: %(levelname)s:%(name)s:%(message)s', level=log_level) |
44 | 45 |
|
| 46 | + # Add Honeybadger support |
| 47 | + if os.getenv('HONEYBADGER_API_KEY'): |
| 48 | + logging.info('Setting up Honeybadger configuration') |
| 49 | + |
| 50 | + # I need to patch Flask in order for Honeybadger to load |
| 51 | + # The honeybadger library uses this deprecated attribute |
| 52 | + # It was deprecated because it is now always 'True'. |
| 53 | + # See: https://github.com/pallets/flask/commit/04994df59f2f642e52ba46ca656088bcdb931262 |
| 54 | + from flask import signals |
| 55 | + setattr(signals, 'signals_available', True) |
| 56 | + |
| 57 | + # Log exceptions to Honeybadger |
| 58 | + app.config['HONEYBADGER_API_KEY'] = os.getenv('HONEYBADGER_API_KEY') |
| 59 | + app.config['HONEYBADGER_PARAMS_FILTERS'] = 'password, secret, openai_api_key, api_key' |
| 60 | + app.config['HONEYBADGER_ENVIRONMENT'] = os.getenv('FLASK_ENV') |
| 61 | + FlaskHoneybadger(app, report_exceptions=True) |
| 62 | + |
| 63 | + # Also log ERROR/CRITICAL logs to Honeybadger |
| 64 | + class NoExceptionErrorFilter(logging.Filter): |
| 65 | + def filter(self, record): |
| 66 | + # But ignore Python logging exceptions on 'ERROR' |
| 67 | + return not record.getMessage().startswith('Exception on ') |
| 68 | + |
| 69 | + hb_handler = HoneybadgerHandler(api_key=os.getenv('HONEYBADGER_API_KEY')) |
| 70 | + hb_handler.setLevel(logging.ERROR) |
| 71 | + hb_handler.addFilter(NoExceptionErrorFilter()) |
| 72 | + logger = logging.getLogger() |
| 73 | + logger.addHandler(hb_handler) |
| 74 | + |
45 | 75 | # Index (a simple HTML response that will always succeed) |
46 | 76 | @app.route('/') |
47 | 77 | def root(): |
|
0 commit comments