#!/usr/bin/env python3 from flask import Flask from flask_restful import Api import sentry_sdk from sentry_sdk.integrations.flask import FlaskIntegration from healthcheck import HealthCheck from redis_client import redis_client from config import Config from marshm import ma from influxus import influx_db from resources import SampleResource from healthchecks import amqp_connection_status import atexit from apscheduler.schedulers.background import BackgroundScheduler from magic_amqp import magic_amqp from error_handlers import register_all_error_handlers import jaeger_client import opentracing from flask_opentracing import FlaskTracing """ Main Flask RESTful API """ __author__ = "@tormakris" __copyright__ = "Copyright 2020, Birbnetes Team" __module_name__ = "app" __version__text__ = "1" if Config.SENTRY_DSN: sentry_sdk.init( dsn=Config.SENTRY_DSN, integrations=[FlaskIntegration()], traces_sample_rate=0.0, send_default_pii=True, release=Config.RELEASE_ID, environment=Config.RELEASEMODE, _experiments={"auto_enabling_integrations": True} ) app = Flask(__name__) app.config.from_object(Config) api = Api(app) health = HealthCheck() ma.init_app(app) redis_client.init_app(app) # ampq magic stuff magic_amqp.init_app(app) ampq_loop_scheduler = BackgroundScheduler() ampq_loop_scheduler.add_job(func=lambda: magic_amqp.loop(), trigger="interval", seconds=5) atexit.register(lambda: ampq_loop_scheduler.shutdown()) ampq_loop_scheduler.start() if Config.ENABLE_INFLUXDB: influx_db.init_app(app) @app.before_first_request def init_db(): if Config.ENABLE_INFLUXDB: influx_db.database.create(Config.INFLUXDB_DATABASE) # Setup tracing def initialize_tracer(): app.logger.info("Initializing jaeger...") jaeger_cfg = jaeger_client.Config(config={}, service_name='input-service', validate=True) tracer = jaeger_cfg.initialize_tracer() return tracer tracing = FlaskTracing(initialize_tracer, True, app) api.add_resource(SampleResource, "/input") health.add_check(amqp_connection_status) register_all_error_handlers(app) app.add_url_rule("/healthz", "healthcheck", view_func=lambda: health.run()) if __name__ != '__main__': import logging gunicorn_logger = logging.getLogger('gunicorn.error') app.logger.handlers = gunicorn_logger.handlers app.logger.setLevel(gunicorn_logger.level)