// sendStats is a helper for sending session stats to the server. func sendStats(tunnel *Tunnel) { // Tunnel does not have a session when DisableApi is set if tunnel.session == nil { return } payload := transferstats.GetForServer(tunnel.serverEntry.IpAddress) err := tunnel.session.DoStatusRequest(payload) if err != nil { NoticeAlert("DoStatusRequest failed for %s: %s", tunnel.serverEntry.IpAddress, err) transferstats.PutBack(tunnel.serverEntry.IpAddress, payload) } }
func makeStatusRequestPayload( serverId string) ([]byte, *statusRequestPayloadInfo, error) { transferStats := transferstats.GetForServer(serverId) tunnelStats, err := TakeOutUnreportedTunnelStats( PSIPHON_API_TUNNEL_STATS_MAX_COUNT) if err != nil { NoticeAlert( "TakeOutUnreportedTunnelStats failed: %s", ContextError(err)) tunnelStats = nil // Proceed with transferStats only } payloadInfo := &statusRequestPayloadInfo{ serverId, transferStats, tunnelStats} payload := make(map[string]interface{}) hostBytes, bytesTransferred := transferStats.GetStatsForReporting() payload["host_bytes"] = hostBytes payload["bytes_transferred"] = bytesTransferred // We're not recording these fields, but the server requires them. payload["page_views"] = make([]string, 0) payload["https_requests"] = make([]string, 0) // Tunnel stats records are already in JSON format jsonTunnelStats := make([]json.RawMessage, len(tunnelStats)) for i, tunnelStatsRecord := range tunnelStats { jsonTunnelStats[i] = json.RawMessage(tunnelStatsRecord) } payload["tunnel_stats"] = jsonTunnelStats jsonPayload, err := json.Marshal(payload) if err != nil { // Send the transfer stats and tunnel stats later putBackStatusRequestPayload(payloadInfo) return nil, nil, ContextError(err) } return jsonPayload, payloadInfo, nil }