API
REST API
The full specification is available using Swagger here.
Topology/Flow request
POST /api/topology HTTP/1.1
Content-Type: application/json
{
"GremlinQuery":"G.V()"
}
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
[
{
"Host": "localhost.localdomain",
"ID": "d6759df3-d4e0-408b-64d3-c82ea6c9aeda",
"Metadata": {
"Name": "vm2",
"Path": "/var/run/netns/vm2",
"TID": "7daa39fe-92f7-5f9b-51b1-1dddcd41785c",
"Type": "netns"
}
}
]
POST /api/topology HTTP/1.1
Content-Type: application/json
{
"GremlinQuery":"G.Flows().Limit(1)"
}
[
{
"ANodeTID": "d9d6f8cf-4aa6-4a06-6785-3dc56032ef82",
"BNodeTID": "488789f9-38be-4eba-704a-79996382de41",
"LastUpdateMetric": {
"ABBytes": 490,
"ABPackets": 5,
"BABytes": 490,
"BAPackets": 5,
"Last": 1477572621,
"Start": 1477572616
},
"LayersPath": "Ethernet/IPv4/ICMPv4",
"Link": {
"A": "02:48:4f:c4:40:99",
"B": "e2:d0:f0:61:e7:81",
"Protocol": "ETHERNET"
},
"Metric": {
"ABBytes": 1666,
"ABPackets": 17,
"BABytes": 1568,
"BAPackets": 16,
"Last": 1477572622,
"Start": 1477572606
},
"Network": {
"A": "192.168.0.1",
"B": "192.168.0.2",
"Protocol": "IPV4"
},
"NodeTID": "488789f9-38be-4eba-704a-79996382de41",
"TrackingID": "f745fb1f59298a1773e35827adfa42dab4f469f9",
"UUID": "ee29fc47f425d7a2e6de9379b0131f64a70fc991"
}
]
Capture
To create capture :
POST /api/capture HTTP/1.1
Content-Type: application/json
{
"GremlinQuery":"g.V().Has('TID', 'de0cba34-5d96-5ce6-698a-dffd2e674f95')"
}
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
{
"UUID":"e2d9f084-4543-4f7e-6c2c-673f56ae4610",
"GremlinQuery":"g.V().Has('TID', 'de0cba34-5d96-5ce6-698a-dffd2e674f95')"
}
To list captures :
GET /api/capture HTTP/1.1
Content-Type: application/json
{
"104fc114-e153-4f67-692a-60c636ee1597":
{
"UUID": "104fc114-e153-4f67-692a-60c636ee1597"
"GremlinQuery": "G.V().Has('TID', '2108e074-feac-5a3c-60ca-5963e89c4059')"
"Count": 1
},
"e2d9f084-4543-4f7e-6c2c-673f56ae4610":
{
"UUID": "e2d9f084-4543-4f7e-6c2c-673f56ae4610"
"GremlinQuery": "g.V().Has('TID', 'de0cba34-5d96-5ce6-698a-dffd2e674f95')"
"Count": 1
}
}
To delete a capture :
DELETE /api/capture/7ca73f92-0547-475e-472d-d6e28664a117 HTTP/1.1
Content-Type: application/json
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
WebSocket API
Flow stream
Since version 0.21
it is possible to subscribe to analyzers flow stream. This feature can be use
to react on new flow events or to store/send them to an external tool. The flow stream is provided as
a WebSocket endpoint. You can use the skydive-client
Python library or the Golang one. By default
flows will be sent in JSON, but can also be sent in Protobuf if requested.
The WebSocket endpoint is /ws/subscriber/flow
The following example shows how to subscribe with using the Python library, and write the received flows to a file.
First you need to install the skydive-client
library :
pip install skydive-client
And the script itself :
import json
from skydive.websocket.client import WSClient
from skydive.websocket.client import WSClientDefaultProtocol
class WSLoggerProtocol(WSClientDefaultProtocol):
def onMessage(self, payload, isBinary):
msg = json.loads(payload)
file = self.factory.kwargs["file"]
for flow in msg["Obj"]:
file.write(json.dumps(flow))
print "wrote %d flows" % len(msg["Obj"])
def main():
file = open("/tmp/flows", "w")
client = WSClient("MyHost", "ws://127.0.0.1:8082/ws/subscriber/flow",
protocol=WSLoggerProtocol,
file=file)
client.connect()
client.start()
if __name__ == '__main__':
main()