Skip to content

Commit

Permalink
1. Add a static function DropLog() to each generated sandesh class
Browse files Browse the repository at this point in the history
   (except flow) and call it in Send() when dropping the sandesh
   due to queue level throttling.
2. Add drop reasons in the sandesh client RX and TX paths.
3. Move sandesh statistics implementation to sandesh_statistics.cc.
   Rename SandeshStatistics to SandeshMessageStatistics.
4. Add sandesh statistics unit tests.
Closes-Bug: #1472107

Change-Id: I0ba38e115e18af6a13067d0fd89ef3b079db245c
(cherry picked from commit baa9129)
  • Loading branch information
Megh Bhatt authored and arvindvis committed Apr 5, 2016
1 parent 6522dca commit 323abb8
Show file tree
Hide file tree
Showing 16 changed files with 647 additions and 205 deletions.
114 changes: 87 additions & 27 deletions compiler/generate/t_cpp_generator.cc
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,6 @@ class t_cpp_generator : public t_oop_generator {
void generate_sandesh_request (std::ofstream& out, t_sandesh* tsandesh);
void generate_sandesh_default_ctor (std::ofstream& out, t_sandesh* tsandesh, bool is_request);
void generate_sandesh_loggers (std::ofstream& out, t_sandesh* tsandesh);
void generate_sandesh_logger (std::ofstream& out, t_sandesh* tsandesh, bool buffer, bool forced_log);
void generate_logger_field (std::ofstream& out, t_field *tfield, string prefix, bool log_value_only, bool no_name_log);
void generate_logger_struct (std::ofstream& out, t_struct *tstruct, string prefix, string name);
void generate_logger_container (std::ofstream& out, t_type* ttype, string name, bool log_value_only);
Expand Down Expand Up @@ -351,6 +350,16 @@ class t_cpp_generator : public t_oop_generator {
#ifdef SANDESH
std::ofstream f_request_impl_;
std::ofstream f_html_template_;
struct sandesh_logger {
enum type {
BUFFER,
LOG,
FORCED_LOG,
DROP_LOG,
};
};
void generate_sandesh_logger(std::ofstream& out, t_sandesh* tsandesh,
sandesh_logger::type ltype);
#endif

/**
Expand Down Expand Up @@ -1199,16 +1208,21 @@ std::string t_cpp_generator::generate_sandesh_async_creator(t_sandesh* tsandesh,
void t_cpp_generator::generate_sandesh_async_creators(ofstream &out, t_sandesh *tsandesh) {
std::string creator_func_name = "Send";
std::string macro_func_name = "Log";

bool is_flow = ((t_base_type *)tsandesh->get_type())->is_sandesh_flow();
// Generate creator
out << indent() << "static void " << creator_func_name <<
generate_sandesh_async_creator(tsandesh, true, false, false, "", "", true, false) <<
" {" << endl;
indent_up();
out << indent() << "if (level >= SendingLevel()) {" << endl;
indent_up();
out << indent() << "UpdateSandeshStats(\"" << tsandesh->get_name() << "\", 0, true, true);" <<
endl;
out << indent() << "UpdateTxMsgFailStats(\"" << tsandesh->get_name() <<
"\", 0, Sandesh::DropReason::Send::QueueLevel);" << endl;
if (!is_flow) {
out << indent() << "DropLog" <<
generate_sandesh_async_creator(tsandesh, false, false, false, "", "", false, false) <<
"; " << endl;
}
out << indent() << "return;" << endl;
scope_down(out);
out << indent() << tsandesh->get_name() <<
Expand Down Expand Up @@ -1248,6 +1262,17 @@ void t_cpp_generator::generate_sandesh_async_creators(ofstream &out, t_sandesh *
endl;
indent_down();
indent(out) << endl << endl;

// Generate DropLog
if (!is_flow) {
out << indent() << "static void DropLog" <<
generate_sandesh_async_creator(tsandesh, true, false, false, "", "", false, false) <<
" {" << endl;
indent_up();
generate_sandesh_logger(out, tsandesh, sandesh_logger::DROP_LOG);
indent_down();
indent(out) << "}" << endl << endl;
}
}

std::string t_cpp_generator::generate_sandesh_trace_creator(t_sandesh *tsandesh,
Expand Down Expand Up @@ -3286,20 +3311,29 @@ void t_cpp_generator::generate_logger_struct(ofstream& out,
*/
void t_cpp_generator::generate_sandesh_logger(ofstream& out,
t_sandesh* tsandesh,
bool buffer, bool forced_log) {
if (buffer) {
sandesh_logger::type ltype) {
switch (ltype) {
case sandesh_logger::BUFFER:
indent(out) << "std::string " << tsandesh->get_name() <<
"::ToString() const {" << endl;
} else {
if (forced_log) {
indent(out) << "void " << tsandesh->get_name() <<
"::ForcedLog() const {" << endl;
} else {
indent(out) << "void " << tsandesh->get_name() <<
indent_up();
break;
case sandesh_logger::LOG:
indent(out) << "void " << tsandesh->get_name() <<
"::Log() const {" << endl;
}
indent_up();
break;
case sandesh_logger::FORCED_LOG:
indent(out) << "void " << tsandesh->get_name() <<
"::ForcedLog() const {" << endl;
indent_up();
break;
case sandesh_logger::DROP_LOG:
break;
default:
assert(0);
break;
}
indent_up();
const vector<t_field*>& fields = tsandesh->get_members();
vector<t_field*>::const_iterator f_iter;
bool init = false;
Expand All @@ -3311,20 +3345,34 @@ void t_cpp_generator::generate_sandesh_logger(ofstream& out,
// Handle init
if (!init) {
init = true;
if (!buffer) {
std::string category_str, level_str, logger_level_str, drop_str;
if (ltype == sandesh_logger::DROP_LOG) {
drop_str = "\"SANDESH: Queue Drop: \" << ";
category_str = "category";
level_str = "level";
logger_level_str = "SandeshLevel::SYS_ERR";
} else {
drop_str = "";
category_str = "category()";
level_str = "level()";
logger_level_str = level_str;
}
if (ltype == sandesh_logger::LOG ||
ltype == sandesh_logger::FORCED_LOG ||
ltype == sandesh_logger::DROP_LOG) {
out << indent() <<
"log4cplus::Logger Xlogger = Sandesh::logger();" << endl;
out << indent() << "log4cplus::LogLevel Xlog4level(" <<
"SandeshLevelTolog4Level(Sandesh::level()));" << endl;
if (!forced_log) {
"SandeshLevelTolog4Level(" << logger_level_str << "));" << endl;
if (ltype != sandesh_logger::FORCED_LOG) {
out << indent() <<
"if (!Xlogger.isEnabledFor(Xlog4level)) {" << endl;
indent_up();
out << indent() << "return;" << endl;
scope_down(out);
}
out << indent() << "log4cplus::tostringstream Xbuf;" << endl;
} else {
} else if (ltype == sandesh_logger::BUFFER) {
out << indent() << "std::stringstream Xbuf;" << endl;
// Timestamp
out << indent() <<
Expand All @@ -3336,28 +3384,40 @@ void t_cpp_generator::generate_sandesh_logger(ofstream& out,
if (((t_base_type *)tsandesh->get_type())->is_sandesh_system() ||
((t_base_type *)tsandesh->get_type())->is_sandesh_object() ||
((t_base_type *)tsandesh->get_type())->is_sandesh_flow()) {
out << indent() << "Xbuf << category() << \" [\" << LevelToString(level()) << \"]: " <<
tsandesh->get_name() << ": \";" << endl;
out << indent() << "Xbuf << " << drop_str << category_str <<
" << \" [\" << LevelToString(" << level_str << ") << \"]: " <<
tsandesh->get_name() << ": \";" << endl;
} else {
out << indent() << "Xbuf << \"" << tsandesh->get_name() << ": \";" << endl;
}
}
generate_logger_field(out, *f_iter, prefix, log_value_only, false);
}
if (init) {
if (buffer) {
if (ltype == sandesh_logger::BUFFER) {
out << indent() << "return Xbuf.str();" << endl;
} else {
out << indent() << "Xlogger.forcedLog(Xlog4level, Xbuf.str());" <<
endl;
}
} else {
if (buffer) {
if (ltype == sandesh_logger::BUFFER) {
out << indent() << "return std::string();" << endl;
}
}
indent_down();
indent(out) << "}" << endl << endl;
switch (ltype) {
case sandesh_logger::BUFFER:
case sandesh_logger::LOG:
case sandesh_logger::FORCED_LOG:
indent_down();
indent(out) << "}" << endl << endl;
break;
case sandesh_logger::DROP_LOG:
break;
default:
assert(0);
break;
}
}

/**
Expand All @@ -3369,11 +3429,11 @@ void t_cpp_generator::generate_sandesh_logger(ofstream& out,
void t_cpp_generator::generate_sandesh_loggers(ofstream& out,
t_sandesh* tsandesh) {
// Generate Log printing to log4cplus
generate_sandesh_logger(out, tsandesh, false, false);
generate_sandesh_logger(out, tsandesh, sandesh_logger::LOG);
// Generate forcedLog printing to log4cplus
generate_sandesh_logger(out, tsandesh, false, true);
generate_sandesh_logger(out, tsandesh, sandesh_logger::FORCED_LOG);
// Generate Log printing to buffer
generate_sandesh_logger(out, tsandesh, true, false);
generate_sandesh_logger(out, tsandesh, sandesh_logger::BUFFER);
}

/**
Expand Down
56 changes: 46 additions & 10 deletions library/common/sandesh_uve.sandesh
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*
* Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
*/

/*
* sandesh_uve.sandesh
*
Expand All @@ -11,12 +11,48 @@
include "io/io.sandesh"

struct SandeshMessageStats {
1: i64 messages_sent;
2: i64 bytes_sent;
3: i64 messages_received;
4: i64 bytes_received;
5: i64 messages_sent_dropped;
6: i64 messages_received_dropped;
1: u64 messages_sent;
2: u64 bytes_sent;
3: u64 messages_received;
4: u64 bytes_received;
5: u64 messages_sent_dropped;
6: u64 bytes_sent_dropped;
7: u64 messages_received_dropped;
8: u64 bytes_received_dropped;
// Send
// Messages
51: u64 messages_sent_dropped_no_queue;
52: u64 messages_sent_dropped_no_client;
53: u64 messages_sent_dropped_no_session;
54: u64 messages_sent_dropped_queue_level;
55: u64 messages_sent_dropped_client_send_failed;
56: u64 messages_sent_dropped_session_not_connected;
57: u64 messages_sent_dropped_header_write_failed;
58: u64 messages_sent_dropped_write_failed;
59: u64 messages_sent_dropped_wrong_client_sm_state;
// Bytes
81: u64 bytes_sent_dropped_no_queue;
82: u64 bytes_sent_dropped_no_client;
83: u64 bytes_sent_dropped_no_session;
84: u64 bytes_sent_dropped_queue_level;
85: u64 bytes_sent_dropped_client_send_failed;
86: u64 bytes_sent_dropped_session_not_connected;
87: u64 bytes_sent_dropped_header_write_failed;
88: u64 bytes_sent_dropped_write_failed;
89: u64 bytes_sent_dropped_wrong_client_sm_state;
// Receive
// Messages
101: u64 messages_received_dropped_no_queue;
102: u64 messages_received_dropped_queue_level;
103: u64 messages_received_dropped_create_failed;
104: u64 messages_received_dropped_control_msg_failed;
105: u64 messages_received_dropped_decoding_failed;
// Bytes
131: u64 bytes_received_dropped_no_queue;
132: u64 bytes_received_dropped_queue_level;
133: u64 bytes_received_dropped_create_failed;
134: u64 bytes_received_dropped_control_msg_failed;
135: u64 bytes_received_dropped_decoding_failed;
}

struct SandeshMessageTypeStats {
Expand Down Expand Up @@ -57,7 +93,7 @@ request sandesh SandeshSendingParamsSet {
1: optional bool high;
2: optional u32 queue_count;
3: optional string sending_level;
}
}

request sandesh SandeshSendingParamsReset {
}
Expand Down Expand Up @@ -121,7 +157,7 @@ struct SandeshUVETypeInfo {
}

response sandesh SandeshUVETypesResp {
1: list<SandeshUVETypeInfo> type_info;
1: list<SandeshUVETypeInfo> type_info;
}

struct SandeshStateMachineEvStats {
Expand Down Expand Up @@ -171,7 +207,7 @@ struct ModuleClientState {
2: optional bool deleted
3: optional SandeshClientInfo client_info
4: optional SandeshGeneratorStats msg_stats
5: optional u64 sm_queue_count (aggtype="stats", hbin="50")
5: optional u64 sm_queue_count (tags="")
6: optional SandeshStateMachineStats sm_stats
7: optional SandeshSessionStats session_stats
8: optional io.SocketIOStats session_rx_socket_stats
Expand Down
1 change: 1 addition & 0 deletions library/cpp/SConscript
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ libsandesh = env.Library(target = 'sandesh',
'sandesh_server.cc',
'sandesh_uve.cc',
'sandesh_message_builder.cc',
'sandesh_statistics.cc',
'protocol/TXMLProtocol.cpp',
'transport/TFDTransport.cpp',
'transport/TSimpleFileTransport.cpp',
Expand Down

0 comments on commit 323abb8

Please sign in to comment.