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()