def setup_listeners(config): # Register basic subscriber predicates, to filter events. config.add_subscriber_predicate('for_actions', EventActionFilter) config.add_subscriber_predicate('for_resources', EventResourceFilter) write_actions = (ACTIONS.CREATE, ACTIONS.UPDATE, ACTIONS.DELETE) settings = config.get_settings() project_name = settings.get('project_name', '') listeners = aslist(settings['event_listeners']) for name in listeners: logger.info('Setting up %r listener' % name) prefix = 'event_listeners.%s.' % name try: listener_mod = config.maybe_dotted(name) prefix = 'event_listeners.%s.' % name.split('.')[-1] listener = listener_mod.load_from_config(config, prefix) except (ImportError, AttributeError): module_setting = prefix + "use" # Read from ENV or settings. module_value = utils.read_env(project_name + "." + module_setting, settings.get(module_setting)) listener_mod = config.maybe_dotted(module_value) listener = listener_mod.load_from_config(config, prefix) # If StatsD is enabled, monitor execution time of listeners. if getattr(config.registry, "statsd", None): statsd_client = config.registry.statsd key = 'listeners.%s' % name listener = statsd_client.timer(key)(listener.__call__) # Optional filter by event action. actions_setting = prefix + "actions" # Read from ENV or settings. actions_value = utils.read_env(project_name + "." + actions_setting, settings.get(actions_setting, "")) actions = aslist(actions_value) if len(actions) > 0: actions = ACTIONS.from_string_list(actions) else: actions = write_actions # Optional filter by event resource name. resource_setting = prefix + "resources" # Read from ENV or settings. resource_value = utils.read_env(project_name + "." + resource_setting, settings.get(resource_setting, "")) resource_names = aslist(resource_value) # Pyramid event predicates. options = dict(for_actions=actions, for_resources=resource_names) if ACTIONS.READ in actions: config.add_subscriber(listener, ResourceRead, **options) if len(actions) == 1: return config.add_subscriber(listener, ResourceChanged, **options)
def on_new_response(event): response = event.response request = event.request # Compute the request processing time in msec (-1 if unknown) current = utils.msec_time() duration = current - getattr(request, '_received_at', current - 1) isotimestamp = datetime.fromtimestamp(current / 1000).isoformat() # Bind infos for request summary logger. logger.bind(time=isotimestamp, code=response.status_code, t=duration) # Ouput application request summary. if not hasattr(request, 'parent'): logger.info('request.summary')
def on_new_response(event): response = event.response request = event.request # Compute the request processing time in msec (-1 if unknown) current = utils.msec_time() duration = current - getattr(request, '_received_at', current - 1) isotimestamp = datetime.fromtimestamp(current/1000).isoformat() # Bind infos for request summary logger. logger.bind(time=isotimestamp, code=response.status_code, t=duration) # Ouput application request summary. if not hasattr(request, 'parent'): logger.info('request.summary')
def setup_listeners(config): # Register basic subscriber predicates, to filter events. config.add_subscriber_predicate('for_actions', EventActionFilter) config.add_subscriber_predicate('for_resources', EventResourceFilter) write_actions = (ACTIONS.CREATE, ACTIONS.UPDATE, ACTIONS.DELETE) settings = config.get_settings() listeners = aslist(settings['event_listeners']) for name in listeners: logger.info('Setting up %r listener' % name) prefix = 'event_listeners.%s.' % name try: listener_mod = config.maybe_dotted(name) prefix = 'event_listeners.%s.' % name.split('.')[-1] listener = listener_mod.load_from_config(config, prefix) except (ImportError, AttributeError): listener_mod = config.maybe_dotted(settings[prefix + 'use']) listener = listener_mod.load_from_config(config, prefix) # If StatsD is enabled, monitor execution time of listeners. if getattr(config.registry, "statsd", None): statsd_client = config.registry.statsd key = 'listeners.%s' % name listener = statsd_client.timer(key)(listener.__call__) actions = aslist(settings.get(prefix + 'actions', '')) if len(actions) > 0: actions = ACTIONS.from_string_list(actions) else: actions = write_actions resource_names = aslist(settings.get(prefix + 'resources', '')) options = dict(for_actions=actions, for_resources=resource_names) if ACTIONS.READ in actions: config.add_subscriber(listener, ResourceRead, **options) if len(actions) == 1: return config.add_subscriber(listener, ResourceChanged, **options)
def includeme(config): settings = config.get_settings() # Heartbeat registry. config.registry.heartbeats = {} # Public settings registry. config.registry.public_settings = {'batch_max_requests', 'readonly'} # Directive to declare arbitrary API capabilities. def add_api_capability(config, identifier, description="", url="", **kw): existing = config.registry.api_capabilities.get(identifier) if existing: error_msg = "The '{}' API capability was already registered ({})." raise ValueError(error_msg.format(identifier, existing)) capability = dict(description=description, url=url, **kw) config.registry.api_capabilities[identifier] = capability config.add_directive('add_api_capability', add_api_capability) config.registry.api_capabilities = {} # Resource events helpers. config.add_request_method(events.get_resource_events, name='get_resource_events') config.add_request_method(events.notify_resource_event, name='notify_resource_event') # Setup cornice. config.include("cornice") # Setup cornice api documentation config.include("cornice_swagger") # Per-request transaction. config.include("pyramid_tm") # Add CORS settings to the base kinto.core Service class. Service.init_from_settings(settings) # Setup components. for step in aslist(settings['initialization_sequence']): step_func = config.maybe_dotted(step) step_func(config) # Custom helpers. config.add_request_method(follow_subrequest) config.add_request_method(prefixed_userid, property=True) config.add_request_method(prefixed_principals, reify=True) config.add_request_method(lambda r: { 'id': r.prefixed_userid, 'principals': r.prefixed_principals }, name='get_user_info') config.add_request_method(current_resource_name, reify=True) config.add_request_method(current_service, reify=True) config.commit() # Include plugins after init, unlike pyramid includes. includes = aslist(settings['includes']) for app in includes: config.include(app) # # Show settings to output. # for key, value in settings.items(): # logger.info('Using {} = {}'.format(key, value)) # Scan views. config.scan("kinto.core.views") # Give sign of life. msg = "Running {project_name} {project_version}." logger.info(msg.format_map(settings))
def includeme(config): settings = config.get_settings() # Heartbeat registry. config.registry.heartbeats = {} # Public settings registry. config.registry.public_settings = {'batch_max_requests', 'readonly'} # Directive to declare arbitrary API capabilities. def add_api_capability(config, identifier, description="", url="", **kw): existing = config.registry.api_capabilities.get(identifier) if existing: error_msg = "The '%s' API capability was already registered (%s)." raise ValueError(error_msg % (identifier, existing)) capability = dict(description=description, url=url, **kw) config.registry.api_capabilities[identifier] = capability config.add_directive('add_api_capability', add_api_capability) config.registry.api_capabilities = {} # Resource events helpers. config.add_request_method(events.get_resource_events, name='get_resource_events') config.add_request_method(events.notify_resource_event, name='notify_resource_event') # Setup cornice. config.include("cornice") # Per-request transaction. config.include("pyramid_tm") # Add CORS settings to the base kinto.core Service class. Service.init_from_settings(settings) # Setup components. for step in aslist(settings['initialization_sequence']): step_func = config.maybe_dotted(step) step_func(config) # Custom helpers. config.add_request_method(follow_subrequest) config.add_request_method(authentication.prefixed_userid, property=True) config.add_request_method(lambda r: {'id': r.prefixed_userid}, name='get_user_info') config.add_request_method(current_resource_name, reify=True) config.add_request_method(current_service, reify=True) config.commit() # Include plugins after init, unlike pyramid includes. includes = aslist(settings['includes']) for app in includes: config.include(app) # # Show settings to output. # for key, value in settings.items(): # logger.info('Using %s = %s' % (key, value)) # Scan views. config.scan("kinto.core.views") # Give sign of life. msg = "%(project_name)s %(project_version)s starting." logger.info(msg % settings)