def create_app(config_name): connexion_options = {"swagger_ui": True} # This feels like a hack but it is needed. The logging configuration # needs to be setup before the flask app is initialized. configure_logging(config_name) app_config = Config(config_name) connexion_app = connexion.App("inventory", specification_dir="./swagger/", options=connexion_options) # Read the swagger.yml file to configure the endpoints with open("swagger/api.spec.yaml", "rb") as fp: spec = yaml.safe_load(fp) for api_url in app_config.api_urls: if api_url: connexion_app.add_api( spec, arguments={"title": "RestyResolver Example"}, resolver=RestyResolver("api"), validate_responses=True, strict_validation=True, base_path=api_url, ) app_config.logger.info("Listening on API: %s" % api_url) # Add an error handler that will convert our top level exceptions # into error responses connexion_app.add_error_handler(InventoryException, render_exception) flask_app = connexion_app.app flask_app.config["SQLALCHEMY_ECHO"] = False flask_app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False flask_app.config["SQLALCHEMY_DATABASE_URI"] = app_config.db_uri flask_app.config["SQLALCHEMY_POOL_SIZE"] = app_config.db_pool_size flask_app.config["SQLALCHEMY_POOL_TIMEOUT"] = app_config.db_pool_timeout db.init_app(flask_app) flask_app.register_blueprint(monitoring_blueprint, url_prefix=app_config.mgmt_url_path_prefix) @flask_app.before_request def set_request_id(): threadctx.request_id = request.headers.get(REQUEST_ID_HEADER, UNKNOWN_REQUEST_ID_VALUE) if all( map(os.environ.get, ["KAFKA_TOPIC", "KAFKA_GROUP", "KAFKA_BOOTSTRAP_SERVERS"])): start_consumer(flask_app) return flask_app
def create_app(config_name): connexion_options = {"swagger_ui": True} # This feels like a hack but it is needed. The logging configuration # needs to be setup before the flask app is initialized. configure_logging(config_name) app_config = Config(config_name) connexion_app = connexion.App("inventory", specification_dir="./swagger/", options=connexion_options) # Read the swagger.yml file to configure the endpoints with open("swagger/api.spec.yaml", "rb") as fp: spec = yaml.safe_load(fp) connexion_app.add_api( spec, arguments={"title": "RestyResolver Example"}, resolver=RestyResolver("api"), validate_responses=True, strict_validation=True, base_path=app_config.api_url_path_prefix, ) # Add an error handler that will convert our top level exceptions # into error responses connexion_app.add_error_handler(InventoryException, render_exception) flask_app = connexion_app.app flask_app.config["SQLALCHEMY_ECHO"] = False flask_app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False flask_app.config["SQLALCHEMY_DATABASE_URI"] = app_config.db_uri flask_app.config["SQLALCHEMY_POOL_SIZE"] = app_config.db_pool_size flask_app.config["SQLALCHEMY_POOL_TIMEOUT"] = app_config.db_pool_timeout db.init_app(flask_app) flask_app.register_blueprint(monitoring_blueprint, url_prefix=app_config.mgmt_url_path_prefix) return flask_app
test_results = validate_sp_schemas( consumer, { config.kafka_consumer_topic, config.additional_validation_topic }, schemas, VALIDATE_DAYS, config.sp_validator_max_messages, ) consumer.close() except ValueError as ve: logger.exception(ve) consumer.close() sys.exit(1) _post_git_results_comment(pr_number, test_results) logger.info("The validator has finished. Bye!") sys.exit(0) if __name__ == "__main__": configure_logging() logger = get_logger(LOGGER_NAME) sys.excepthook = partial(_excepthook, logger) threadctx.request_id = UNKNOWN_REQUEST_ID_VALUE main(logger)
def create_app(runtime_environment): connexion_options = {"swagger_ui": True} # This feels like a hack but it is needed. The logging configuration # needs to be setup before the flask app is initialized. configure_logging() app_config = Config(runtime_environment) app_config.log_configuration() connexion_app = connexion.App("inventory", specification_dir="./swagger/", options=connexion_options) # Read the swagger.yml file to configure the endpoints parser = ResolvingParser(SPECIFICATION_FILE, resolve_types=RESOLVE_FILES) parser.parse() for api_url in app_config.api_urls: if api_url: connexion_app.add_api( parser.specification, arguments={"title": "RestyResolver Example"}, resolver=RestyResolver("api"), validate_responses=True, strict_validation=True, base_path=api_url, ) logger.info("Listening on API: %s", api_url) # Add an error handler that will convert our top level exceptions # into error responses connexion_app.add_error_handler(InventoryException, render_exception) flask_app = connexion_app.app flask_app.config["SQLALCHEMY_ECHO"] = False flask_app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False flask_app.config["SQLALCHEMY_DATABASE_URI"] = app_config.db_uri flask_app.config["SQLALCHEMY_POOL_SIZE"] = app_config.db_pool_size flask_app.config["SQLALCHEMY_POOL_TIMEOUT"] = app_config.db_pool_timeout flask_app.config["INVENTORY_CONFIG"] = app_config db.init_app(flask_app) register_shutdown(db.get_engine(flask_app).dispose, "Closing database") flask_app.register_blueprint(monitoring_blueprint, url_prefix=app_config.mgmt_url_path_prefix) @flask_app.before_request def set_request_id(): threadctx.request_id = request.headers.get(REQUEST_ID_HEADER, UNKNOWN_REQUEST_ID_VALUE) if runtime_environment.event_producer_enabled: flask_app.event_producer = EventProducer(app_config) register_shutdown(flask_app.event_producer.close, "Closing EventProducer") else: logger.warning( "WARNING: The event producer has been disabled. " "The message queue based event notifications have been disabled.") payload_tracker_producer = None if not runtime_environment.payload_tracker_enabled: # If we are running in "testing" mode, then inject the NullProducer. payload_tracker_producer = payload_tracker.NullProducer() logger.warning( "WARNING: Using the NullProducer for the payload tracker producer. " "No payload tracker events will be sent to to payload tracker.") payload_tracker.init_payload_tracker(app_config, producer=payload_tracker_producer) # HTTP request metrics if runtime_environment.metrics_endpoint_enabled: PrometheusMetrics( flask_app, defaults_prefix="inventory", group_by="url_rule", path=None, excluded_paths=[ "^/metrics$", "^/health$", "^/version$", r"^/favicon\.ico$" ], ) # initialize metrics to zero initialize_metrics(app_config) return flask_app
def create_app(config_name, start_tasks=False, start_payload_tracker=False): connexion_options = {"swagger_ui": True} # This feels like a hack but it is needed. The logging configuration # needs to be setup before the flask app is initialized. configure_logging(config_name) app_config = Config(RuntimeEnvironment.server) app_config.log_configuration(config_name) connexion_app = connexion.App("inventory", specification_dir="./swagger/", options=connexion_options) # Read the swagger.yml file to configure the endpoints with open("swagger/api.spec.yaml", "rb") as fp: spec = yaml.safe_load(fp) for api_url in app_config.api_urls: if api_url: connexion_app.add_api( spec, arguments={"title": "RestyResolver Example"}, resolver=RestyResolver("api"), validate_responses=True, strict_validation=True, base_path=api_url, ) logger.info("Listening on API: %s", api_url) # Add an error handler that will convert our top level exceptions # into error responses connexion_app.add_error_handler(InventoryException, render_exception) flask_app = connexion_app.app flask_app.config["SQLALCHEMY_ECHO"] = False flask_app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False flask_app.config["SQLALCHEMY_DATABASE_URI"] = app_config.db_uri flask_app.config["SQLALCHEMY_POOL_SIZE"] = app_config.db_pool_size flask_app.config["SQLALCHEMY_POOL_TIMEOUT"] = app_config.db_pool_timeout flask_app.config["INVENTORY_CONFIG"] = app_config db.init_app(flask_app) flask_app.register_blueprint(monitoring_blueprint, url_prefix=app_config.mgmt_url_path_prefix) @flask_app.before_request def set_request_id(): threadctx.request_id = request.headers.get(REQUEST_ID_HEADER, UNKNOWN_REQUEST_ID_VALUE) if start_tasks: init_tasks(app_config, flask_app) else: logger.warning( 'WARNING: The "tasks" subsystem has been disabled. ' "The message queue based system_profile consumer " "and message queue based event notifications have been disabled." ) payload_tracker_producer = None if start_payload_tracker is False: # If we are running in "testing" mode, then inject the NullProducer. payload_tracker_producer = payload_tracker.NullProducer() logger.warning( "WARNING: Using the NullProducer for the payload tracker producer. " "No payload tracker events will be sent to to payload tracker." ) payload_tracker.init_payload_tracker(app_config, producer=payload_tracker_producer) # HTTP request metrics if config_name != "testing": PrometheusMetrics( flask_app, defaults_prefix="inventory", group_by="url_rule", path=None, excluded_paths=["^/metrics$", "^/health$", "^/version$", r"^/favicon\.ico$"], ) return flask_app
def main(logger): config = _init_config() init_tasks(config) registry = CollectorRegistry() for metric in COLLECTED_METRICS: registry.register(metric) Session = _init_db(config) session = Session() try: with session_guard(session): run(config, logger, session) finally: flush() job = _prometheus_job(config.kubernetes_namespace) push_to_gateway(config.prometheus_pushgateway, job, registry) if __name__ == "__main__": configure_logging(RUNTIME_ENVIRONMENT) logger = get_logger(LOGGER_NAME) sys.excepthook = partial(_excepthook, logger) threadctx.request_id = UNKNOWN_REQUEST_ID_VALUE main(logger)
def main(config_name): config = _init_config(config_name) init_tasks(config) registry = CollectorRegistry() for metric in COLLECTED_METRICS: registry.register(metric) Session = _init_db(config) session = Session() try: with session_guard(session): run(config, session) except Exception as exception: logger = get_logger(LOGGER_NAME) logger.exception(exception) finally: flush() job = _prometheus_job(config.kubernetes_namespace) push_to_gateway(config.prometheus_pushgateway, job, registry) if __name__ == "__main__": config_name = getenv("APP_SETTINGS", "development") configure_logging(config_name) threadctx.request_id = UNKNOWN_REQUEST_ID_VALUE main(config_name)