func()

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
}