@@ -22,20 +22,24 @@ import (
2222// FdName - file descriptor name
2323// Delimiter - delimiter for socket reads/writes
2424// azureHostReportURL - host net agent url of type payload
25- // DefaultDncReportsSize - default DNC report slice size
26- // DefaultCniReportsSize - default CNI report slice size
27- // DefaultNpmReportsSize - default NPM report slice size
2825// DefaultInterval - default interval for sending payload to host
26+ // logName - telemetry log name
27+ // MaxPayloadSize - max payload size in bytes
2928const (
30- FdName = "azure-vnet-telemetry"
31- Delimiter = '\n'
32- azureHostReportURL = "http://168.63.129.16/machine/plugins?comp=netagent&type=payload"
33- DefaultInterval = 60 * time .Second
34- logName = "azure-vnet-telemetry"
35- MaxPayloadSize = 2097
29+ FdName = "azure-vnet-telemetry"
30+ Delimiter = '\n'
31+ azureHostReportURL = "http://168.63.129.16/machine/plugins?comp=netagent&type=payload"
32+ DefaultInterval = 10 * time .Second
33+ logName = "azure-vnet-telemetry"
34+ MaxPayloadSize uint16 = 65535
35+ dnc = "DNC"
36+ cns = "CNS"
37+ npm = "NPM"
38+ cni = "CNI"
3639)
3740
3841var telemetryLogger = log .NewLogger (logName , log .LevelInfo , log .TargetStderr )
42+ var payloadSize uint16 = 0
3943
4044// TelemetryBuffer object
4145type TelemetryBuffer struct {
@@ -108,7 +112,6 @@ func (tb *TelemetryBuffer) StartServer() error {
108112 json .Unmarshal ([]byte (reportStr ), & npmReport )
109113 tb .data <- npmReport
110114 } else if _ , ok := tmp ["CniSucceeded" ]; ok {
111- telemetryLogger .Printf ("[Telemetry] Got cni report" )
112115 var cniReport CNIReport
113116 json .Unmarshal ([]byte (reportStr ), & cniReport )
114117 tb .data <- cniReport
@@ -157,14 +160,12 @@ func (tb *TelemetryBuffer) BufferAndPushData(intervalms time.Duration) {
157160 case <- interval :
158161 // Send payload to host and clear cache when sent successfully
159162 // To-do : if we hit max slice size in payload, write to disk and process the logs on disk on future sends
160- telemetryLogger .Printf ("[Telemetry] send data to host" )
161163 if err := tb .sendToHost (); err == nil {
162164 tb .payload .reset ()
163165 } else {
164166 telemetryLogger .Printf ("[Telemetry] sending to host failed with error %+v" , err )
165167 }
166168 case report := <- tb .data :
167- telemetryLogger .Printf ("[Telemetry] Got data..Append it to buffer" )
168169 tb .payload .push (report )
169170 case <- tb .cancel :
170171 goto EXIT
@@ -253,29 +254,29 @@ func (pl *Payload) push(x interface{}) {
253254 }
254255 }
255256
256- if pl .len () < MaxPayloadSize {
257- switch x .( type ) {
258- case DNCReport :
257+ if notExceeded , reportType := pl .payloadCapNotExceeded ( x ); notExceeded {
258+ switch reportType {
259+ case dnc :
259260 dncReport := x .(DNCReport )
260261 dncReport .Metadata = metadata
261262 pl .DNCReports = append (pl .DNCReports , dncReport )
262- case CNIReport :
263+ case cni :
263264 cniReport := x .(CNIReport )
264265 cniReport .Metadata = metadata
265266 pl .CNIReports = append (pl .CNIReports , cniReport )
266- case NPMReport :
267+ case npm :
267268 npmReport := x .(NPMReport )
268269 npmReport .Metadata = metadata
269270 pl .NPMReports = append (pl .NPMReports , npmReport )
270- case CNSReport :
271+ case cns :
271272 cnsReport := x .(CNSReport )
272273 cnsReport .Metadata = metadata
273274 pl .CNSReports = append (pl .CNSReports , cnsReport )
274275 }
275276 }
276277}
277278
278- // reset - reset payload slices
279+ // reset - reset payload slices and sets payloadSize to 0
279280func (pl * Payload ) reset () {
280281 pl .DNCReports = nil
281282 pl .DNCReports = make ([]DNCReport , 0 )
@@ -285,11 +286,34 @@ func (pl *Payload) reset() {
285286 pl .NPMReports = make ([]NPMReport , 0 )
286287 pl .CNSReports = nil
287288 pl .CNSReports = make ([]CNSReport , 0 )
289+ payloadSize = 0
288290}
289291
290- // len - get number of payload items
291- func (pl * Payload ) len () int {
292- return len (pl .CNIReports ) + len (pl .CNSReports ) + len (pl .DNCReports ) + len (pl .NPMReports )
292+ // payloadCapNotExceeded - Returns whether payload cap will be exceeded as a result of adding the new report; and the report type
293+ // If the cap is not exceeded, we update the payload size here.
294+ func (pl * Payload ) payloadCapNotExceeded (x interface {}) (notExceeded bool , reportType string ) {
295+ var body bytes.Buffer
296+ switch x .(type ) {
297+ case DNCReport :
298+ reportType = dnc
299+ json .NewEncoder (& body ).Encode (x .(DNCReport ))
300+ case CNIReport :
301+ reportType = cni
302+ json .NewEncoder (& body ).Encode (x .(CNIReport ))
303+ case NPMReport :
304+ reportType = npm
305+ json .NewEncoder (& body ).Encode (x .(NPMReport ))
306+ case CNSReport :
307+ reportType = cns
308+ json .NewEncoder (& body ).Encode (x .(CNSReport ))
309+ }
310+
311+ updatedPayloadSize := uint16 (body .Len ()) + payloadSize
312+ if notExceeded = updatedPayloadSize < MaxPayloadSize && payloadSize < updatedPayloadSize ; notExceeded {
313+ payloadSize = updatedPayloadSize
314+ }
315+
316+ return
293317}
294318
295319// saveHostMetadata - save metadata got from wireserver to json file
0 commit comments