// interpolateCounts compensates for sampling by artificially inflating counts // throughout the report. It should be run once for each report, within the // probe, before it gets emitted into the rest of the system. func interpolateCounts(r report.Report) { rate := r.Sampling.Rate() if rate >= 1.0 { return } factor := 1.0 / rate for _, topology := range r.Topologies() { for _, nmd := range topology.Nodes { nmd.Edges.ForEach(func(_ string, emd report.EdgeMetadata) { if emd.EgressPacketCount != nil { *emd.EgressPacketCount = uint64(float64(*emd.EgressPacketCount) * factor) } if emd.IngressPacketCount != nil { *emd.IngressPacketCount = uint64(float64(*emd.IngressPacketCount) * factor) } if emd.EgressByteCount != nil { *emd.EgressByteCount = uint64(float64(*emd.EgressByteCount) * factor) } if emd.IngressByteCount != nil { *emd.IngressByteCount = uint64(float64(*emd.IngressByteCount) * factor) } }) } } }