msharee9 commented on a change in pull request #734: MINIFICPP-1157 Implement 
lightweight C2 heartbeat.

 File path: libminifi/src/c2/C2Agent.cpp
 @@ -315,16 +317,35 @@ void C2Agent::performHeartBeat() {
-  if (!root_response_nodes_.empty()) {
-    for (auto metric : root_response_nodes_) {
-      C2Payload child_metric_payload(Operation::HEARTBEAT);
-      child_metric_payload.setLabel(metric.first);
-      if (metric.second->isArray()) {
-        child_metric_payload.setContainer(true);
-      }
-      serializeMetrics(child_metric_payload, metric.first, 
metric.second->serialize(), metric.second->isArray());
-      payload.addPayload(std::move(child_metric_payload));
+  for (auto metric : root_response_nodes_) {
+    C2Payload child_metric_payload(Operation::HEARTBEAT);
+    bool isArray{false};
+    std::string metricName;
+    std::vector<state::response::SerializedResponseNode> metrics;
+    std::shared_ptr<state::response::NodeReporter> reporter;
+    std::shared_ptr<state::response::ResponseNode> agentInfoManifest;
+    //Send agent manifest in first heartbeat
 Review comment:
   Replying to your first part of the comment, I agree with you that the 
registration of C2Agent and the code involving setting and getting response 
nodes is not very clean and difficult to understand. From my understanding, 
FlowController is NodeReporter (metrics source) and C2Agent is ResponseNodeSink 
(metrics sink). The TreeUpdateListener runs a loop in a thread I believe which 
constantly updates the sink cache with metrics and I think this is unnecessary 
   Up until now, the FlowController was responsible for instantiating classes 
that were defined in the nifi.c2.root.classes property, exposed via 
getResponseNodes and retrieved by the C2Agent when needed. The change I made 
also exposes the class via FlowController, this time without it being defined 
in the properties but that is out of necessity for optimization. (I am talking 
about first full heartbeat). I agree that the behavior wise this is a little 
hacky that we are now making a behavioral change in C2Agent rather than making 
that decision in the metrics classes themselves but this is because there is no 
way of knowing about the C2Agent state in those classes as you mentioned.
   We definitely need a cleaner design especially surrounding the structure of 
metrics classes and the source and sink concepts. I believe may be a visitor 
approach could make this design much simpler.
   Having said that, we can still remove the first heartbeat optimization in 
lieu of putting back the behavior in the metrics classes whichever is a better 
tradeoff. What do you think?

This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:

With regards,
Apache Git Services

Reply via email to