in pkg/profiling/task/network/analyze/base/traffic.go [103:165]
func (t *TrafficAnalyzer) CombineConnectionToTraffics(connections []*ConnectionContext) []*ProcessTraffic {
// build cache first
t.buildCache(connections)
// build traffics
pidMatchedTraffic := make(map[PidMatchTrafficKey]*ProcessTraffic)
pidToRemoteTraffic := make(map[PidToRemoteTrafficKey]*ProcessTraffic)
for _, con := range connections {
// find pid first
remotePid := t.findRemotePid(con)
if remotePid != 0 {
key := PidMatchTrafficKey{
LocalPid: con.LocalPid,
RemotePid: remotePid,
Role: con.Role,
}
traffic := pidMatchedTraffic[key]
pidMatchedTraffic[key] = t.generateOrCombineTraffic(traffic, con, remotePid)
traffic = pidMatchedTraffic[key]
log.Debugf("save pid match traffic[%d_%d_%d], %s:%d(%d)->%s:%d(%d), combine connection id: %d_%d",
con.LocalPid, remotePid, con.Role, traffic.LocalIP, traffic.LocalPort, traffic.LocalPid,
traffic.RemoteIP, traffic.RemotePort, traffic.RemotePid, con.ConnectionID, con.RandomID)
continue
}
// if the remote IP and Port is empty, then ignore it
if !t.ipNotEmpty(con.RemoteIP, con.RemotePort) {
continue
}
t.tryingToGenerateTheRoleWhenRemotePidCannotFound(con)
var pidToRemoteKey PidToRemoteTrafficKey
pidToRemoteKey.LocalPid = con.LocalPid
pidToRemoteKey.RemoteIP = con.RemoteIP
// if connection role is not server side, then add the remote port
if con.Role != enums.ConnectionRoleServer {
// uniformly identified as a client
pidToRemoteKey.Role = enums.ConnectionRoleClient
pidToRemoteKey.RemotePort = con.RemotePort
} else {
pidToRemoteKey.Role = enums.ConnectionRoleServer
}
traffic := pidToRemoteTraffic[pidToRemoteKey]
traffic = t.generateOrCombineTraffic(traffic, con, 0)
pidToRemoteTraffic[pidToRemoteKey] = traffic
log.Debugf("save remote address traffic[%d_%d_%s_%d], %s:%d(%d)->%s:%d(%d)",
con.LocalPid, con.Role, con.RemoteIP, con.RemotePort, traffic.LocalIP, traffic.LocalPort,
traffic.LocalPid, traffic.RemoteIP, traffic.RemotePort, traffic.RemotePid)
}
// combine all result
result := make([]*ProcessTraffic, 0)
for _, v := range pidMatchedTraffic {
result = append(result, v)
}
for _, v := range pidToRemoteTraffic {
result = append(result, v)
}
return result
}