I wanted to get some bandwith statistics from my Gigacube. After browsing around in the web interface I found an unauthenicated API that has most of what I need.
http://192.168.8.1/api/monitoring/traffic-statistics
That URL returns XML data in this format:
<?xml version="1.0" encoding="UTF-8"?> <response> <CurrentConnectTime>92016</CurrentConnectTime> <CurrentUpload>5832119940</CurrentUpload> <CurrentDownload>32772130236</CurrentDownload> <CurrentDownloadRate>895</CurrentDownloadRate> <CurrentUploadRate>1539</CurrentUploadRate> <TotalUpload>824477229102</TotalUpload> <TotalDownload>5553380109187</TotalDownload> <TotalConnectTime>15820842</TotalConnectTime> <showtraffic>1</showtraffic> <MaxUploadRate>8737338</MaxUploadRate> <MaxDownloadRate>41668223</MaxDownloadRate> </response>
Then I wrote a quick PHP script to extract that information and send it to my influx database:
$url = "http://192.168.8.1/api/monitoring/traffic-statistics"; $data = file_get_contents($url); $xml = new SimpleXmlElement($data); $variables = array( "CurrentConnectTime", "CurrentUpload", "CurrentDownload", "CurrentDownloadRate", "CurrentUploadRate", "TotalUpload", "TotalDownload", "TotalConnectTime", // "showtraffic", // this doesn't seem to change from '1' so I just ignore it "MaxUploadRate", "MaxDownloadRate"); // this outputs the current download rate (in bytes/second) as reported by the device: // echo $xml->CurrentDownloadRate; // I build a single line payload for my influx database $payload = "huawei "; foreach($variables as $var) { $payload .= "$var=".$xml->$var.","; } $payload = trim($payload,","); // That looks something like this (timestamp is automatically appended): // huawei CurrentConnectTime=92016,CurrentUpload=5832119940,CurrentDownload=32772130236,CurrentDownloadRate=895,CurrentUploadRate=1539,TotalUpload=824477229102,TotalDownload=5553380109187,TotalConnectTime=15820842,MaxUploadRate=8737338,MaxDownloadRate=41668223 // Then post it to my influx database: $url = "https://yourinfluxserver/write?db=huawei"; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $payload); $response = curl_exec($ch);
I run this every minute in a cron job (I could run it more often, but I'm happy with the accuracy I get - CurrentDownRate is very accurate and updated every second it seems, but using the CurrentDownload field (and working out a derivative) using:
SELECT derivative(mean("CurrentDownload"), 1s)*8 FROM "huawei" WHERE $timeFilter GROUP BY time($__interval) fill(null)
Gets me pretty accurate usage information (which I then plot in Grafana).