32 #include "../observers/variant/TimestampVariant.h"
45 return "ProfilerObserver";
51 usingTopic(armarx::Profiler::PROFILER_TOPIC_NAME);
57 offerChannel(
"activeStateChanged",
58 "Channel reporting the currently active state of statecharts with EnableProfiling "
60 offerDataField(
"activeStateChanged",
63 "Name of the currently active state");
69 setDataField(
"activeStateChanged",
"activeState",
"");
74 const std::string& protocol,
81 if (!existsChannel(
id))
83 offerChannel(
id,
"Network traffic");
86 offerOrUpdateDataField(
87 id, protocol +
"_inBytes",
Variant(inBytes),
"Incoming network traffic");
88 offerOrUpdateDataField(
89 id, protocol +
"_outBytes",
Variant(outBytes),
"Outgoing network traffic");
101 std::string stateIdentifier =
event.parentName;
104 createStateChannelIfRequired(stateIdentifier);
106 int microsecondsModifier = 0;
107 if (event.timestampUnit ==
"ms")
109 microsecondsModifier = 1000;
111 else if (event.timestampUnit ==
"us")
113 microsecondsModifier = 1;
117 if (event.functionName ==
120 setDataField(stateIdentifier,
"lastEnterTimestamp", timestamp);
124 VariantPtr lastActiveState = VariantPtr::dynamicCast(getDataField(
126 setDataField(stateIdentifier,
"lastExitTimestamp", timestamp);
127 setDataField(stateIdentifier,
"activeSubstate",
Variant(
""));
130 setDataFieldFlatCopy(stateIdentifier,
"previousSubstate", lastActiveState);
133 updateChannel(stateIdentifier);
134 ARMARX_INFO <<
"Updating function info channel " << stateIdentifier;
146 std::string
id = process.processName +
std::to_string(process.processId);
150 createResourceChannelIfRequired(
id);
152 setDataField(
id,
"cpuUsage",
Variant(process.cpuUsage));
165 std::string
id = memoryUsage.processName +
std::to_string(memoryUsage.processId);
169 createResourceChannelIfRequired(
id);
171 setDataField(
id,
"memoryUsage",
Variant(memoryUsage.memoryUsage));
186 Variant activeSubstate(transition.targetStateIdentifier);
187 setDataField(
"activeStateChanged",
"activeState", activeSubstate);
188 updateChannel(
"activeStateChanged");
190 std::string stateIdentifier = transition.parentStateIdentifier;
191 createStateChannelIfRequired(stateIdentifier);
193 setDataField(stateIdentifier,
"activeSubstate", activeSubstate);
195 stateIdentifier,
"previousSubstate",
Variant(transition.sourceStateIdentifier));
196 setDataField(stateIdentifier,
"lastEventName",
Variant(transition.eventName));
197 updateChannel(stateIdentifier);
198 ARMARX_INFO <<
"Updating Transition info channel " << stateIdentifier;
210 for (
auto& entry : parameterMap)
212 variantMap.
addElement(entry.first, entry.second->value);
218 const ProfilerStatechartParameters& inputParameters,
223 createStateChannelIfRequired(inputParameters.stateIdentifier);
226 StateParameterToVariantMap(inputParameters.parameterMap, parameters);
227 setDataField(inputParameters.stateIdentifier,
"inputParameters", parameters);
229 updateChannel(inputParameters.stateIdentifier);
239 const ProfilerStatechartParameters& localParameters,
244 createStateChannelIfRequired(localParameters.stateIdentifier);
247 StateParameterToVariantMap(localParameters.parameterMap, parameters);
248 setDataField(localParameters.stateIdentifier,
"localParameters", parameters);
250 updateChannel(localParameters.stateIdentifier);
260 const ProfilerStatechartParameters& outputParameters,
265 createStateChannelIfRequired(outputParameters.stateIdentifier);
268 StateParameterToVariantMap(outputParameters.parameterMap, parameters);
269 setDataField(outputParameters.stateIdentifier,
"outputParameters", parameters);
270 updateChannel(outputParameters.stateIdentifier);
280 const armarx::ProfilerStatechartTransitionWithParameters& outputParameters,
287 armarx::ProfilerObserver::createStateChannelIfRequired(
const std::string& channelName)
289 std::unique_lock lock(channelCheckMutex);
290 if (existsChannel(channelName))
295 offerChannel(channelName,
"Statechart State Channel");
297 offerDataField(channelName,
"activeSubstate",
VariantType::String,
"Currently Active Substate");
298 offerDataField(channelName,
"previousSubstate",
VariantType::String,
"Last Active Substate");
299 offerDataField(channelName,
"lastEventName",
VariantType::String,
"Last Event/Transition Name");
306 offerDataField(channelName,
307 "lastEnterTimestamp",
309 "Timestamp of when onEnter() of the state was last called");
310 offerDataField(channelName,
313 "Timestamp of when onExit() or onBreak() of the state was last called");
317 armarx::ProfilerObserver::createResourceChannelIfRequired(
const std::string& channelName)
319 std::unique_lock lock(channelCheckMutex);
320 if (existsChannel(channelName))
325 offerChannel(channelName,
"Resource Information");
327 offerDataField(channelName,
330 "Cpu Usage of process specified by the channelname");
331 offerDataField(channelName,
334 "Memory Usage of process specified by the channelname");
346 const armarx::ProfilerStatechartTransitionList& transitions,
349 armarx::ProfilerStatechartTransition lastTransition = transitions.back();
351 "activeStateChanged",
"activeState",
Variant(lastTransition.targetStateIdentifier));
352 updateChannel(
"activeStateChanged");
357 const ProfilerStatechartParametersList& inputParametersList,
361 auto compareFunction =
362 [](
const ProfilerStatechartParameters& lhs,
const ProfilerStatechartParameters& rhs)
363 {
return lhs.stateIdentifier < rhs.stateIdentifier; };
364 std::set<ProfilerStatechartParameters, decltype(compareFunction)> latestElements(
365 inputParametersList.rbegin(), inputParametersList.rend(), compareFunction);
367 for (
const auto& element : latestElements)
369 reportStatechartInputParameters(element);
375 const ProfilerStatechartParametersList& localParametersList,
379 auto compareFunction =
380 [](
const ProfilerStatechartParameters& lhs,
const ProfilerStatechartParameters& rhs)
381 {
return lhs.stateIdentifier < rhs.stateIdentifier; };
382 std::set<ProfilerStatechartParameters, decltype(compareFunction)> latestElements(
383 localParametersList.rbegin(), localParametersList.rend(), compareFunction);
385 for (
const auto& element : latestElements)
387 reportStatechartLocalParameters(element);
393 const ProfilerStatechartParametersList& outputParametersList,
397 auto compareFunction =
398 [](
const ProfilerStatechartParameters& lhs,
const ProfilerStatechartParameters& rhs)
399 {
return lhs.stateIdentifier < rhs.stateIdentifier; };
400 std::set<ProfilerStatechartParameters, decltype(compareFunction)> latestElements(
401 outputParametersList.rbegin(), outputParametersList.rend(), compareFunction);
403 for (
const auto& element : latestElements)
405 reportStatechartOutputParameters(element);
411 const armarx::ProfilerStatechartTransitionWithParametersList& outputParameters,
422 auto compareFunction =
423 [](
const ProfilerProcessCpuUsage& lhs,
const ProfilerProcessCpuUsage& rhs)
424 {
return lhs.processId < rhs.processId; };
425 std::set<ProfilerProcessCpuUsage, decltype(compareFunction)> latestElements(
426 processes.rbegin(), processes.rend(), compareFunction);
428 for (
const auto& element : latestElements)
430 reportProcessCpuUsage(element);
436 const ProfilerProcessMemoryUsageList& memoryUsages,
440 auto compareFunction =
441 [](
const ProfilerProcessMemoryUsage& lhs,
const ProfilerProcessMemoryUsage& rhs)
442 {
return lhs.processId < rhs.processId; };
443 std::set<ProfilerProcessMemoryUsage, decltype(compareFunction)> latestElements(
444 memoryUsages.rbegin(), memoryUsages.rend(), compareFunction);
446 for (
const auto& element : latestElements)
448 reportProcessMemoryUsage(element);