Line data Source code
1 : /* 2 : * Copyright (c) 2017 Juniper Networks, Inc. All rights reserved. 3 : * Copyright Contributors to the OpenSDN project 4 : */ 5 : 6 : #include <sandesh/common/flow_types.h> 7 : 8 3 : bool SessionIpPortProtocol::operator < (const SessionIpPortProtocol &rhs) const { 9 3 : if (service_port < rhs.service_port) { 10 1 : return true; 11 2 : } else if (service_port == rhs.service_port && protocol < rhs.protocol) { 12 0 : return true; 13 2 : } else if (service_port == rhs.service_port && protocol == rhs.protocol && local_ip < rhs.local_ip) { 14 0 : return true; 15 : } else { 16 2 : return false; 17 : } 18 : } 19 : 20 3 : bool SessionIpPort::operator < (const SessionIpPort &rhs) const { 21 3 : if (port < rhs.port) { 22 1 : return true; 23 2 : } else if (port == rhs.port && ip < rhs.ip) { 24 0 : return true; 25 : } else { 26 2 : return false; 27 : } 28 : } 29 : 30 : /* 31 : * print everything in SessionEndpoint structure other than the map 32 : */ 33 0 : std::string SessionEndpointLog(const SessionEndpoint &sep) { 34 0 : std::stringstream Xbuf; 35 : //construct per session messages 36 0 : Xbuf << "vmi" << " = " << sep.vmi; 37 0 : Xbuf << " " << "vn" << " = " << sep.vn; 38 0 : if (sep.__isset.deployment) { 39 0 : Xbuf << " " << "deployment" << " = " << sep.deployment; 40 : } 41 0 : if (sep.__isset.tier) { 42 0 : Xbuf << " " << "tier" << " = " << sep.tier; 43 : } 44 0 : if (sep.__isset.application) { 45 0 : Xbuf << " " << "application" << " = " << sep.application; 46 : } 47 0 : if (sep.__isset.site) { 48 0 : Xbuf << " " << "site" << " = " << sep.site; 49 : } 50 0 : if (sep.__isset.labels) { 51 0 : Xbuf << " " << "labels" << "= [ "; 52 : { 53 0 : Xbuf << " " << "["; 54 0 : std::set<std::string> ::const_iterator label_iter; 55 0 : for (label_iter = sep.labels.begin(); 56 0 : label_iter != sep.labels.end(); ++label_iter) { 57 0 : Xbuf << " " << "label val" << " = " << (*label_iter); 58 0 : Xbuf << ", "; 59 : } 60 0 : Xbuf << " " << "]"; 61 : } 62 : } 63 0 : Xbuf << " ]"; 64 0 : if (sep.__isset.remote_deployment) { 65 0 : Xbuf << " " << "remote_deployment" << " = " << sep.remote_deployment; 66 : } 67 0 : if (sep.__isset.remote_tier) { 68 0 : Xbuf << " " << "remote_tier" << " = " << sep.remote_tier; 69 : } 70 0 : if (sep.__isset.remote_application) { 71 0 : Xbuf << " " << "remote_application" << " = " << sep.remote_application; 72 : } 73 0 : if (sep.__isset.remote_site) { 74 0 : Xbuf << " " << "remote_site" << " = " << sep.remote_site; 75 : } 76 0 : if (sep.__isset.remote_labels) { 77 0 : Xbuf << " " << "remote_labels" << "= [ "; 78 : { 79 0 : Xbuf << " " << "["; 80 0 : std::set<std::string> ::const_iterator label_iter; 81 0 : for (label_iter = sep.remote_labels.begin(); 82 0 : label_iter != sep.remote_labels.end(); ++label_iter) { 83 0 : Xbuf << " " << "(label val)" << " = " << (*label_iter); 84 0 : Xbuf << ", "; 85 : } 86 0 : Xbuf << " " << "]"; 87 : } 88 0 : Xbuf << " ]"; 89 : } 90 0 : if (sep.__isset.security_policy_rule) { 91 : Xbuf << " " << "security_policy_rule" << " = " << 92 0 : sep.security_policy_rule; 93 : } 94 0 : Xbuf << " " << "remote_vn" << " = " << sep.remote_vn; 95 : Xbuf << " " << "is_client_session" << " = " << 96 0 : integerToString(sep.is_client_session); 97 0 : Xbuf << " " << "is_si" << " = " << integerToString(sep.is_si); 98 0 : if (sep.__isset.remote_prefix) { 99 0 : Xbuf << " " << "remote_prefix" << " = " << sep.remote_prefix; 100 : } 101 0 : Xbuf << " " << "vrouter_ip" << " = " << sep.vrouter_ip; 102 0 : return Xbuf.str(); 103 0 : } 104 : 105 : /* 106 : * Print everything in SessionAggInfo struct otherthan the map 107 : */ 108 0 : std::string SessionAggInfoLog( 109 : const SessionAggInfo &sess_agg) { 110 0 : std::stringstream Xbuf; 111 0 : if (sess_agg.__isset.sampled_forward_bytes) { 112 0 : Xbuf << "sampled_forward_bytes" << " = " << integerToString(sess_agg.sampled_forward_bytes); 113 : } 114 0 : if (sess_agg.__isset.sampled_forward_pkts) { 115 0 : Xbuf << " " << "sampled_forward_pkts" << " = " << integerToString(sess_agg.sampled_forward_pkts); 116 : } 117 0 : if (sess_agg.__isset.sampled_reverse_bytes) { 118 0 : Xbuf << " " << "sampled_reverse_bytes" << " = " << integerToString(sess_agg.sampled_reverse_bytes); 119 : } 120 0 : if (sess_agg.__isset.sampled_reverse_pkts) { 121 0 : Xbuf << " " << "sampled_reverse_pkts" << " = " << integerToString(sess_agg.sampled_reverse_pkts); 122 : } 123 0 : if (sess_agg.__isset.logged_forward_bytes) { 124 0 : Xbuf << " " << "logged_forward_bytes" << " = " << integerToString(sess_agg.logged_forward_bytes); 125 : } 126 0 : if (sess_agg.__isset.logged_forward_pkts) { 127 0 : Xbuf << " " << "logged_forward_pkts" << " = " << integerToString(sess_agg.logged_forward_pkts); 128 : } 129 0 : if (sess_agg.__isset.logged_reverse_bytes) { 130 0 : Xbuf << " " << "logged_reverse_bytes" << " = " << integerToString(sess_agg.logged_reverse_bytes); 131 : } 132 0 : return Xbuf.str(); 133 0 : } 134 : 135 0 : void SessionEndpointObject::LogUnrolled(std::string category, 136 : SandeshLevel::type level, 137 : const std::vector<SessionEndpoint> & session_data) { 138 0 : log4cplus::LogLevel Xlog4level(SandeshLevelTolog4Level(level)); 139 0 : log4cplus::Logger Xlogger = Sandesh::sampled_logger(); 140 0 : log4cplus::Logger SLO_logger = Sandesh::slo_logger(); 141 0 : bool is_send_sample_to_logger_enabled = Sandesh::is_send_sampled_to_logger_enabled(); 142 0 : bool is_send_slo_to_logger_enabled = Sandesh::is_send_slo_to_logger_enabled(); 143 0 : log4cplus::tostringstream Xbuf; 144 0 : std::vector<SessionEndpoint> ::const_iterator sep_iter; 145 0 : for (sep_iter = session_data.begin(); sep_iter != session_data.end(); 146 0 : ++sep_iter) { 147 0 : std::string sep_info = SessionEndpointLog(*sep_iter); 148 : std::map<SessionIpPortProtocol, SessionAggInfo>::const_iterator 149 0 : local_ep_iter; 150 0 : for (local_ep_iter = sep_iter->sess_agg_info.begin(); 151 0 : local_ep_iter != sep_iter->sess_agg_info.end(); ++local_ep_iter++) { 152 0 : std::map<SessionIpPort, SessionInfo>::const_iterator sessions_iter; 153 0 : std::string local_ep_info = local_ep_iter->first.log(); 154 0 : std::string sess_agg_data = SessionAggInfoLog(local_ep_iter->second); 155 : // for each of the individual session 156 0 : for (sessions_iter = local_ep_iter->second.sessionMap.begin(); 157 0 : sessions_iter != local_ep_iter->second.sessionMap.end(); 158 0 : ++sessions_iter) { 159 0 : Xbuf.clear(); 160 0 : Xbuf.str(std::string()); 161 0 : Xbuf << category << " [" << LevelToString(level) << "]: SessionData: "; 162 0 : Xbuf << "[ "; 163 0 : Xbuf << sep_info << " "; 164 : // print sess_agg_info keys [ip, port, protocol of local] 165 0 : Xbuf << local_ep_info << " "; 166 : // print sess_agg_info values [aggregate logged and sampled data 167 : // for one session endpoint] 168 0 : Xbuf << sess_agg_data << " "; 169 : // print SessionInfo keys [ip, port of the remote end] 170 0 : Xbuf << sessions_iter->first.log() << " " ; 171 : // print SessionInfo values [aggregate data for individual session] 172 0 : Xbuf << sessions_iter->second.log() << " "; 173 0 : Xbuf << " ]"; 174 : // If SLO session log to SLO_logger 175 0 : const SessionInfo & sess_info = sessions_iter->second; 176 0 : if (sess_info.forward_flow_info.__isset.logged_bytes || 177 0 : sess_info.reverse_flow_info.__isset.logged_bytes) { 178 0 : if (is_send_slo_to_logger_enabled) { 179 0 : SLO_logger.forcedLog(Xlog4level, Xbuf.str()); 180 : } 181 : } 182 : // If sampled session log to Xlogger 183 0 : if (sess_info.forward_flow_info.__isset.sampled_bytes || 184 0 : sess_info.reverse_flow_info.__isset.sampled_bytes) { 185 0 : if (is_send_sample_to_logger_enabled) { 186 0 : Xlogger.forcedLog(Xlog4level, Xbuf.str()); 187 : } 188 : } 189 : } 190 0 : } 191 0 : } 192 0 : } 193 : 194 : /* 195 : * Remove the sessions from the SessionEndPoint struct 196 : * if the session need not go to the collector 197 : */ 198 0 : void SessionEndpointObject::adjust_session_end_point_objects( 199 : std::vector<SessionEndpoint> &session_data) { 200 0 : bool is_send_sampled_to_collector = Sandesh::is_send_sampled_to_collector_enabled(); 201 0 : bool is_send_slo_to_collector = Sandesh::is_send_slo_to_collector_enabled(); 202 0 : std::vector<SessionEndpoint> ::iterator sep_iter; 203 0 : for (sep_iter = session_data.begin(); 204 0 : sep_iter != session_data.end(); ++sep_iter) { 205 : std::map<SessionIpPortProtocol, SessionAggInfo>::iterator 206 0 : local_ep_iter; 207 0 : for (local_ep_iter = sep_iter->sess_agg_info.begin(); 208 0 : local_ep_iter != sep_iter->sess_agg_info.end(); 209 0 : local_ep_iter++) { 210 : // Adjust the aggregate logged and sampled info 211 0 : if (!is_send_slo_to_collector) { 212 0 : local_ep_iter->second.__isset.logged_forward_bytes = false; 213 0 : local_ep_iter->second.__isset.logged_forward_pkts = false; 214 0 : local_ep_iter->second.__isset.logged_reverse_bytes = false; 215 0 : local_ep_iter->second.__isset.logged_reverse_pkts = false; 216 : } 217 0 : if (!is_send_sampled_to_collector) { 218 0 : local_ep_iter->second.__isset.sampled_forward_bytes = false; 219 0 : local_ep_iter->second.__isset.sampled_forward_pkts = false; 220 0 : local_ep_iter->second.__isset.sampled_reverse_bytes = false; 221 0 : local_ep_iter->second.__isset.sampled_reverse_pkts = false; 222 : } 223 : // Iterate the individual sessions 224 0 : std::map<SessionIpPort, SessionInfo>::iterator sessions_iter; 225 0 : sessions_iter = local_ep_iter->second.sessionMap.begin(); 226 0 : while (sessions_iter != local_ep_iter->second.sessionMap.end()) { 227 0 : bool erase_session = false; 228 0 : SessionInfo & sess_info = sessions_iter->second; 229 : // Handle if its a logged session 230 0 : if (sess_info.forward_flow_info.__isset.logged_bytes || 231 0 : sess_info.reverse_flow_info.__isset.logged_bytes) { 232 0 : if (!is_send_slo_to_collector) { 233 : // dont erase if session is both sampled and logged 234 0 : if (!sess_info.forward_flow_info.__isset. 235 0 : sampled_bytes && 236 0 : !sess_info.reverse_flow_info.__isset. 237 0 : sampled_bytes) { 238 0 : erase_session = true; 239 : } else { 240 0 : sess_info.forward_flow_info.__isset.logged_bytes = false; 241 0 : sess_info.forward_flow_info.__isset.logged_pkts = false; 242 0 : sess_info.reverse_flow_info.__isset.logged_bytes = false; 243 0 : sess_info.reverse_flow_info.__isset.logged_pkts = false; 244 : } 245 : } 246 : } 247 : // Handle if its a sampled session 248 0 : if (sess_info.forward_flow_info.__isset.sampled_bytes || 249 0 : sess_info.reverse_flow_info.__isset.sampled_bytes) { 250 0 : if (!is_send_sampled_to_collector) { 251 : // dont erase if session is both sampled and logged 252 0 : if (!sess_info.forward_flow_info.__isset. 253 0 : logged_bytes && 254 0 : !sess_info.reverse_flow_info.__isset. 255 0 : logged_bytes) { 256 0 : erase_session = true; 257 : } else { 258 0 : sess_info.forward_flow_info.__isset.sampled_bytes = false; 259 0 : sess_info.forward_flow_info.__isset.sampled_pkts = false; 260 0 : sess_info.reverse_flow_info.__isset.sampled_bytes = false; 261 0 : sess_info.reverse_flow_info.__isset.sampled_pkts = false; 262 : } 263 : } 264 : } 265 0 : std::map<SessionIpPort, SessionInfo>::iterator sessions_temp_iter = sessions_iter; 266 0 : sessions_temp_iter++; 267 0 : if (erase_session) { 268 0 : local_ep_iter->second.sessionMap. 269 0 : erase(sessions_iter); 270 : } 271 0 : sessions_iter = sessions_temp_iter; 272 : 273 : } 274 : } 275 : } 276 0 : }