summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp')
-rw-r--r--cpp/src/qpid/agent/ManagementAgentImpl.cpp62
-rw-r--r--cpp/src/qpid/agent/ManagementAgentImpl.h3
-rw-r--r--cpp/src/qpid/management/ManagementAgent.cpp29
-rw-r--r--cpp/src/qpid/management/ManagementAgent.h1
4 files changed, 73 insertions, 22 deletions
diff --git a/cpp/src/qpid/agent/ManagementAgentImpl.cpp b/cpp/src/qpid/agent/ManagementAgentImpl.cpp
index d431e4ca16..b7d5ad7d7b 100644
--- a/cpp/src/qpid/agent/ManagementAgentImpl.cpp
+++ b/cpp/src/qpid/agent/ManagementAgentImpl.cpp
@@ -53,6 +53,20 @@ namespace {
const string defaultVendorName("vendor");
const string defaultProductName("product");
+
+ // Create a valid binding key substring by
+ // replacing all '.' chars with '_'
+ const string keyifyNameStr(const string& name)
+ {
+ string n2 = name;
+
+ size_t pos = n2.find('.');
+ while (pos != n2.npos) {
+ n2.replace(pos, 1, "_");
+ pos = n2.find('.', pos);
+ }
+ return n2;
+ }
}
ManagementAgent::Singleton::Singleton(bool disableManagement)
@@ -142,6 +156,9 @@ void ManagementAgentImpl::setName(const string& vendor, const string& product, c
inst = instance;
name_address = vendor + ":" + product + ":" + inst;
+ vendorNameKey = keyifyNameStr(vendor);
+ productNameKey = keyifyNameStr(product);
+ instanceNameKey = keyifyNameStr(inst);
attrMap["_instance"] = inst;
attrMap["_name"] = name_address;
}
@@ -282,13 +299,23 @@ ObjectId ManagementAgentImpl::addObject(ManagementObject* object,
void ManagementAgentImpl::raiseEvent(const ManagementEvent& event, severity_t severity)
{
+ static const std::string severityStr[] = {
+ "emerg", "alert", "crit", "error", "warn",
+ "note", "info", "debug"
+ };
sys::Mutex::ScopedLock lock(agentLock);
Buffer outBuffer(eventBuffer, MA_BUFFER_SIZE);
uint8_t sev = (severity == SEV_DEFAULT) ? event.getSeverity() : (uint8_t) severity;
stringstream key;
- key << "console.event." << assignedBrokerBank << "." << assignedAgentBank << "." <<
- event.getPackageName() << "." << event.getEventName();
+ // key << "console.event." << assignedBrokerBank << "." << assignedAgentBank << "." <<
+ // event.getPackageName() << "." << event.getEventName();
+ key << "agent.ind.event." << keyifyNameStr(event.getPackageName())
+ << "." << keyifyNameStr(event.getEventName())
+ << "." << severityStr[sev]
+ << "." << vendorNameKey
+ << "." << productNameKey
+ << "." << instanceNameKey;
Variant::Map map_;
Variant::Map schemaId;
@@ -407,25 +434,16 @@ void ManagementAgentImpl::retrieveData()
void ManagementAgentImpl::sendHeartbeat()
{
- static const string addr_key_base("agent.ind.heartbeat");
+ static const string addr_key_base("agent.ind.heartbeat.");
Variant::Map map;
Variant::Map headers;
string content;
std::stringstream addr_key;
- addr_key << addr_key_base;
-
- // append .<vendor>.<product> to address key if present.
- Variant::Map::const_iterator v;
- if ((v = attrMap.find("_vendor")) != attrMap.end() &&
- v->second.getString() != defaultVendorName) {
- addr_key << "." << v->second.getString();
- if ((v = attrMap.find("_product")) != attrMap.end() &&
- v->second.getString() != defaultProductName) {
- addr_key << "." << v->second.getString();
- }
- }
+ addr_key << addr_key_base << vendorNameKey
+ << "." << productNameKey
+ << "." << instanceNameKey;
headers["method"] = "indication";
headers["qmf.opcode"] = "_agent_heartbeat_indication";
@@ -946,6 +964,7 @@ void ManagementAgentImpl::encodeClassIndication(Buffer& buf,
void ManagementAgentImpl::periodicProcessing()
{
+ string addr_key_base = "agent.ind.data.";
sys::Mutex::ScopedLock lock(agentLock);
list<pair<ObjectId, ManagementObject*> > deleteList;
@@ -987,6 +1006,9 @@ void ManagementAgentImpl::periodicProcessing()
!baseObject->isDeleted()))
continue;
+ std::string packageName = baseObject->getPackageName();
+ std::string className = baseObject->getClassName();
+
Variant::List list_;
for (ManagementObjectMap::iterator iter = baseIter;
@@ -1033,7 +1055,15 @@ void ManagementAgentImpl::periodicProcessing()
headers["qmf.content"] = "_data";
headers["qmf.agent"] = name_address;
- connThreadBody.sendBuffer(content, "", headers, topicExchange, "agent.ind.data", "amqp/list");
+ std::stringstream addr_key;
+ addr_key << addr_key_base;
+ addr_key << keyifyNameStr(packageName)
+ << "." << keyifyNameStr(className)
+ << "." << vendorNameKey
+ << "." << productNameKey
+ << "." << instanceNameKey;
+
+ connThreadBody.sendBuffer(content, "", headers, topicExchange, addr_key.str(), "amqp/list");
QPID_LOG(trace, "SENT DataIndication");
}
}
diff --git a/cpp/src/qpid/agent/ManagementAgentImpl.h b/cpp/src/qpid/agent/ManagementAgentImpl.h
index 32cbbd7e08..7086e67459 100644
--- a/cpp/src/qpid/agent/ManagementAgentImpl.h
+++ b/cpp/src/qpid/agent/ManagementAgentImpl.h
@@ -150,6 +150,9 @@ class ManagementAgentImpl : public ManagementAgent, public client::MessageListen
qpid::types::Variant::Map attrMap;
std::string name_address;
+ std::string vendorNameKey; // vendor name with "." --> "_"
+ std::string productNameKey; // product name with "." --> "_"
+ std::string instanceNameKey; // agent instance with "." --> "_"
uint16_t interval;
bool extThread;
sys::PipeHandle* pipeHandle;
diff --git a/cpp/src/qpid/management/ManagementAgent.cpp b/cpp/src/qpid/management/ManagementAgent.cpp
index e98de9602e..5602dda2c6 100644
--- a/cpp/src/qpid/management/ManagementAgent.cpp
+++ b/cpp/src/qpid/management/ManagementAgent.cpp
@@ -221,6 +221,7 @@ void ManagementAgent::setName(const string& vendor, const string& product, const
vendorNameKey = keyifyNameStr(vendor);
productNameKey = keyifyNameStr(product);
+ instanceNameKey = keyifyNameStr(inst);
}
@@ -393,11 +394,14 @@ void ManagementAgent::raiseEvent(const ManagementEvent& event, severity_t severi
headers["qmf.agent"] = name_address;
stringstream key;
- key << "agent.ind.event." << vendorNameKey
- << "." << productNameKey
+ key << "agent.ind.event." << keyifyNameStr(event.getPackageName())
+ << "." << keyifyNameStr(event.getEventName())
<< "." << severityStr[sev]
- << "." << keyifyNameStr(event.getPackageName())
- << "." << keyifyNameStr(event.getEventName());
+ << "." << vendorNameKey
+ << "." << productNameKey;
+ if (!instanceNameKey.empty())
+ key << "." << instanceNameKey;
+
string content;
MapCodec::encode(map_, content);
@@ -753,7 +757,13 @@ void ManagementAgent::periodicProcessing (void)
if (content.length()) {
stringstream key;
Variant::Map headers;
- key << "agent.ind.data." << packageName << "." << className;
+ key << "agent.ind.data." << keyifyNameStr(packageName)
+ << "." << keyifyNameStr(className)
+ << "." << vendorNameKey
+ << "." << productNameKey;
+ if (!instanceNameKey.empty())
+ key << "." << instanceNameKey;
+
headers["method"] = "indication";
headers["qmf.opcode"] = "_data_indication";
headers["qmf.content"] = "_data";
@@ -800,6 +810,8 @@ void ManagementAgent::periodicProcessing (void)
std::stringstream addr_key;
addr_key << "agent.ind.heartbeat." << vendorNameKey << "." << productNameKey;
+ if (!instanceNameKey.empty())
+ addr_key << "." << instanceNameKey;
Variant::Map map;
Variant::Map headers;
@@ -860,7 +872,12 @@ void ManagementAgent::deleteObjectNowLH(const ObjectId& oid)
object->mapEncodeValues(values, true, false);
map_["_values"] = values;
list_.push_back(map_);
- v2key << "agent.ind.data." << object->getPackageName() << "." << object->getClassName();
+ v2key << "agent.ind.data." << keyifyNameStr(object->getPackageName())
+ << "." << keyifyNameStr(object->getClassName())
+ << "." << vendorNameKey
+ << "." << productNameKey;
+ if (!instanceNameKey.empty())
+ v2key << "." << instanceNameKey;
}
object = 0;
diff --git a/cpp/src/qpid/management/ManagementAgent.h b/cpp/src/qpid/management/ManagementAgent.h
index 7c8ef994b0..d12b417820 100644
--- a/cpp/src/qpid/management/ManagementAgent.h
+++ b/cpp/src/qpid/management/ManagementAgent.h
@@ -283,6 +283,7 @@ private:
std::string name_address;
std::string vendorNameKey; // "." --> "_"
std::string productNameKey; // "." --> "_"
+ std::string instanceNameKey; // "." --> "_"
// supported management protocol
bool qmf1Support;