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