Plugins
=======

The service supports the system of plugins. Plugins must be written in the Python programming language.

Plugin types
------------

There are two sorts of plugins:

    * On event plugin. The plugin is triggered when an event occurs. The plugin should implement a callback function.
      This function is called on each event of the corresponding type. The set of event types is defined by the service
      developers.

      Supported event types:

        +---------------------+------------------------------------------------------------------------------+
        |   event type        | description                                                                  |
        +=====================+==============================================================================+
        | monitoring_event    | Event contains monitoring points for sending to a custom monitoring system   |
        +---------------------+------------------------------------------------------------------------------+

      Plugin example:

        .. literalinclude:: ../../../luna_streams/crutches_on_wheels/cow/plugins/plugin_examples/request_monitoring_plugin_example.py

      This plugin demonstrates the sending of a request monitoring data to another service. All monitoring plugins must implement
      the *BaseRequestMonitoringPlugin* abstract class.

    * Background plugin. This sort of plugin is intended for background work.

      The background plugin can implement:

      * custom route
      * background monitoring of service resources
      * collaboration of an event plugin and a background plugin (batching monitoring points)
      * connection to other data sources (Redis, RabbitMQ) and their data processing


      Plugin example:

        .. literalinclude:: ../../../luna_streams/crutches_on_wheels/cow/plugins/plugin_examples/background_plugin_example.py

      This plugin demonstrates background work and implements a route. All background plugins must implement
      the *BaseRequestMonitoringPlugin* abstract class.


Enable plugin
-------------

If the user implements a plugin, the file with the plugin should be added to the *luna_streams/plugins* directory of the service.
The plugin filename should be added to the *LUNA_STREAMS_ACTIVE_PLUGINS* configuration setting.
