# Scope Plugins
## Protocol
All plugins should listen for HTTP connections on a unix socket in the
`/var/run/scope/plugins` directory. The scope probe will recursively scan that
directory every 5 seconds, to look for sockets being added (or removed). It is
also valid to put the plugin unix socket in a sub-directory, in case you want
to apply some permissions, or store other information with the socket.
When a new plugin is detected, the scope probe will conduct a basic
[Handshake](#handshake) by requesting `GET /`.
All plugin endpoints are expected to respond within 500ms, and respond in the JSON format.
### Handshake
When the scope probe discovers a new plugin unix socket it needs to know some
information about the plugin. To learn this it will make a GET request for the
`/` endpoint.
An example response is:
```json
{
"name": "iowait",
"description": "Adds a graph of CPU IO Wait to hosts",
"interfaces": []string{"reporter"},
"api_version": "1",
}
```
The fields are:
* `name` is used to check for duplicate plugins, and displayed in the UI
* `description` is displayed in the UI
* `interfaces` tells the scope probe which endpoints this plugin supports
* `api_version` is used to ensure both the plugin and the scope probe can speak to each other
### Interfaces
Currently the only interface a plugin can fulfill is `reporter`.
#### Reporter
The `reporter` interface allows a plugin to add information into the probe report. This could include more nodes, or new fields on existing nodes.
Endpoints:
* GET /report
This endpoint should return a scope probe-style report. For an example of the
datastructure see `/api/report` on any scope instance. At the moment the plugin
is limited to adding nodes or fields to existing topologies (Endpoint, Process,
Container, etc), along with `metadata_templates` and `metric_templates` to
display more information. For an example of adding a metric to the hosts, see
[the example iowait
plugin.](https://github.com/weaveworks/scope/tree/master/example/plugins/iowait)