Instrumentation update (#789)

* Add initial instrumentation
* Rename function registration method and elaborate on object copy issue
* Rely on get_symbol overload instead of using enable_if

Signed-off-by: Christophe Bedard <fixed-term.christophe.bourquebedard@de.bosch.com>
Signed-off-by: Christophe Bedard <christophe.bedard@apex.ai>
Signed-off-by: Ingo Luetkebohle <ingo.luetkebohle@de.bosch.com>
This commit is contained in:
Ingo Lütkebohle 2019-10-19 00:28:04 +02:00 committed by Michel Hidalgo
parent ed0bd16e31
commit 8fd9a0a00c
7 changed files with 76 additions and 1 deletions

View file

@ -14,6 +14,7 @@ find_package(rosgraph_msgs REQUIRED)
find_package(rosidl_generator_cpp REQUIRED) find_package(rosidl_generator_cpp REQUIRED)
find_package(rosidl_typesupport_c REQUIRED) find_package(rosidl_typesupport_c REQUIRED)
find_package(rosidl_typesupport_cpp REQUIRED) find_package(rosidl_typesupport_cpp REQUIRED)
find_package(tracetools REQUIRED)
# Default to C++14 # Default to C++14
if(NOT CMAKE_CXX_STANDARD) if(NOT CMAKE_CXX_STANDARD)
@ -114,7 +115,9 @@ ament_target_dependencies(${PROJECT_NAME}
"builtin_interfaces" "builtin_interfaces"
"rosgraph_msgs" "rosgraph_msgs"
"rosidl_typesupport_cpp" "rosidl_typesupport_cpp"
"rosidl_generator_cpp") "rosidl_generator_cpp"
"tracetools"
)
# Causes the visibility macros to use dllexport rather than dllimport, # Causes the visibility macros to use dllexport rather than dllimport,
# which is appropriate when building the dll but not consuming it. # which is appropriate when building the dll but not consuming it.
@ -141,6 +144,7 @@ ament_export_dependencies(rosidl_typesupport_cpp)
ament_export_dependencies(rosidl_typesupport_c) ament_export_dependencies(rosidl_typesupport_c)
ament_export_dependencies(rosidl_generator_cpp) ament_export_dependencies(rosidl_generator_cpp)
ament_export_dependencies(rcl_yaml_param_parser) ament_export_dependencies(rcl_yaml_param_parser)
ament_export_dependencies(tracetools)
if(BUILD_TESTING) if(BUILD_TESTING)
find_package(ament_cmake_gtest REQUIRED) find_package(ament_cmake_gtest REQUIRED)

View file

@ -23,6 +23,7 @@
#include "rclcpp/function_traits.hpp" #include "rclcpp/function_traits.hpp"
#include "rclcpp/visibility_control.hpp" #include "rclcpp/visibility_control.hpp"
#include "rmw/types.h" #include "rmw/types.h"
#include "tracetools/tracetools.h"
namespace rclcpp namespace rclcpp
{ {
@ -86,6 +87,7 @@ public:
std::shared_ptr<typename ServiceT::Request> request, std::shared_ptr<typename ServiceT::Request> request,
std::shared_ptr<typename ServiceT::Response> response) std::shared_ptr<typename ServiceT::Response> response)
{ {
TRACEPOINT(callback_start, (const void *)this, false);
if (shared_ptr_callback_ != nullptr) { if (shared_ptr_callback_ != nullptr) {
(void)request_header; (void)request_header;
shared_ptr_callback_(request, response); shared_ptr_callback_(request, response);
@ -94,6 +96,7 @@ public:
} else { } else {
throw std::runtime_error("unexpected request without any callback set"); throw std::runtime_error("unexpected request without any callback set");
} }
TRACEPOINT(callback_end, (const void *)this);
} }
}; };

View file

@ -26,6 +26,8 @@
#include "rclcpp/allocator/allocator_common.hpp" #include "rclcpp/allocator/allocator_common.hpp"
#include "rclcpp/function_traits.hpp" #include "rclcpp/function_traits.hpp"
#include "rclcpp/visibility_control.hpp" #include "rclcpp/visibility_control.hpp"
#include "tracetools/tracetools.h"
#include "tracetools/utils.hpp"
namespace rclcpp namespace rclcpp
{ {
@ -155,6 +157,7 @@ public:
void dispatch( void dispatch(
std::shared_ptr<MessageT> message, const rmw_message_info_t & message_info) std::shared_ptr<MessageT> message, const rmw_message_info_t & message_info)
{ {
TRACEPOINT(callback_start, (const void *)this, false);
if (shared_ptr_callback_) { if (shared_ptr_callback_) {
shared_ptr_callback_(message); shared_ptr_callback_(message);
} else if (shared_ptr_with_info_callback_) { } else if (shared_ptr_with_info_callback_) {
@ -174,11 +177,13 @@ public:
} else { } else {
throw std::runtime_error("unexpected message without any callback set"); throw std::runtime_error("unexpected message without any callback set");
} }
TRACEPOINT(callback_end, (const void *)this);
} }
void dispatch_intra_process( void dispatch_intra_process(
ConstMessageSharedPtr message, const rmw_message_info_t & message_info) ConstMessageSharedPtr message, const rmw_message_info_t & message_info)
{ {
TRACEPOINT(callback_start, (const void *)this, true);
if (const_shared_ptr_callback_) { if (const_shared_ptr_callback_) {
const_shared_ptr_callback_(message); const_shared_ptr_callback_(message);
} else if (const_shared_ptr_with_info_callback_) { } else if (const_shared_ptr_with_info_callback_) {
@ -195,11 +200,13 @@ public:
throw std::runtime_error("unexpected message without any callback set"); throw std::runtime_error("unexpected message without any callback set");
} }
} }
TRACEPOINT(callback_end, (const void *)this);
} }
void dispatch_intra_process( void dispatch_intra_process(
MessageUniquePtr message, const rmw_message_info_t & message_info) MessageUniquePtr message, const rmw_message_info_t & message_info)
{ {
TRACEPOINT(callback_start, (const void *)this, true);
if (shared_ptr_callback_) { if (shared_ptr_callback_) {
typename std::shared_ptr<MessageT> shared_message = std::move(message); typename std::shared_ptr<MessageT> shared_message = std::move(message);
shared_ptr_callback_(shared_message); shared_ptr_callback_(shared_message);
@ -217,6 +224,7 @@ public:
} else { } else {
throw std::runtime_error("unexpected message without any callback set"); throw std::runtime_error("unexpected message without any callback set");
} }
TRACEPOINT(callback_end, (const void *)this);
} }
bool use_take_shared_method() bool use_take_shared_method()
@ -224,6 +232,31 @@ public:
return const_shared_ptr_callback_ || const_shared_ptr_with_info_callback_; return const_shared_ptr_callback_ || const_shared_ptr_with_info_callback_;
} }
void register_callback_for_tracing()
{
if (shared_ptr_callback_) {
TRACEPOINT(
rclcpp_callback_register,
(const void *)this,
get_symbol(shared_ptr_callback_));
} else if (shared_ptr_with_info_callback_) {
TRACEPOINT(
rclcpp_callback_register,
(const void *)this,
get_symbol(shared_ptr_with_info_callback_));
} else if (unique_ptr_callback_) {
TRACEPOINT(
rclcpp_callback_register,
(const void *)this,
get_symbol(unique_ptr_callback_));
} else if (unique_ptr_with_info_callback_) {
TRACEPOINT(
rclcpp_callback_register,
(const void *)this,
get_symbol(unique_ptr_with_info_callback_));
}
}
private: private:
std::shared_ptr<MessageAlloc> message_allocator_; std::shared_ptr<MessageAlloc> message_allocator_;
MessageDeleter message_deleter_; MessageDeleter message_deleter_;

View file

@ -33,6 +33,7 @@
#include "rclcpp/logging.hpp" #include "rclcpp/logging.hpp"
#include "rmw/error_handling.h" #include "rmw/error_handling.h"
#include "rmw/rmw.h" #include "rmw/rmw.h"
#include "tracetools/tracetools.h"
namespace rclcpp namespace rclcpp
{ {
@ -154,6 +155,10 @@ public:
rclcpp::exceptions::throw_from_rcl_error(ret, "could not create service"); rclcpp::exceptions::throw_from_rcl_error(ret, "could not create service");
} }
TRACEPOINT(
rclcpp_service_callback_added,
(const void *)get_service_handle().get(),
(const void *)&any_callback_);
} }
Service( Service(
@ -172,6 +177,10 @@ public:
} }
service_handle_ = service_handle; service_handle_ = service_handle;
TRACEPOINT(
rclcpp_service_callback_added,
(const void *)get_service_handle().get(),
(const void *)&any_callback_);
} }
Service( Service(
@ -192,6 +201,10 @@ public:
// In this case, rcl owns the service handle memory // In this case, rcl owns the service handle memory
service_handle_ = std::shared_ptr<rcl_service_t>(new rcl_service_t); service_handle_ = std::shared_ptr<rcl_service_t>(new rcl_service_t);
service_handle_->impl = service_handle->impl; service_handle_->impl = service_handle->impl;
TRACEPOINT(
rclcpp_service_callback_added,
(const void *)get_service_handle().get(),
(const void *)&any_callback_);
} }
Service() = delete; Service() = delete;

View file

@ -46,6 +46,7 @@
#include "rclcpp/type_support_decl.hpp" #include "rclcpp/type_support_decl.hpp"
#include "rclcpp/visibility_control.hpp" #include "rclcpp/visibility_control.hpp"
#include "rclcpp/waitable.hpp" #include "rclcpp/waitable.hpp"
#include "tracetools/tracetools.h"
namespace rclcpp namespace rclcpp
{ {
@ -117,6 +118,14 @@ public:
options.event_callbacks.liveliness_callback, options.event_callbacks.liveliness_callback,
RCL_SUBSCRIPTION_LIVELINESS_CHANGED); RCL_SUBSCRIPTION_LIVELINESS_CHANGED);
} }
TRACEPOINT(
rclcpp_subscription_callback_added,
(const void *)get_subscription_handle().get(),
(const void *)&any_callback_);
// The callback object gets copied, so if registration is done too early/before this point
// (e.g. in `AnySubscriptionCallback::set()`), its address won't match any address used later
// in subsequent tracepoints.
any_callback_.register_callback_for_tracing();
} }
/// Called after construction to continue setup that requires shared_from_this(). /// Called after construction to continue setup that requires shared_from_this().

View file

@ -30,6 +30,8 @@
#include "rclcpp/rate.hpp" #include "rclcpp/rate.hpp"
#include "rclcpp/utilities.hpp" #include "rclcpp/utilities.hpp"
#include "rclcpp/visibility_control.hpp" #include "rclcpp/visibility_control.hpp"
#include "tracetools/tracetools.h"
#include "tracetools/utils.hpp"
#include "rcl/error_handling.h" #include "rcl/error_handling.h"
#include "rcl/timer.h" #include "rcl/timer.h"
@ -133,6 +135,14 @@ public:
) )
: TimerBase(clock, period, context), callback_(std::forward<FunctorT>(callback)) : TimerBase(clock, period, context), callback_(std::forward<FunctorT>(callback))
{ {
TRACEPOINT(
rclcpp_timer_callback_added,
(const void *)get_timer_handle().get(),
(const void *)&callback_);
TRACEPOINT(
rclcpp_callback_register,
(const void *)&callback_,
get_symbol(callback_));
} }
/// Default destructor. /// Default destructor.
@ -152,7 +162,9 @@ public:
if (ret != RCL_RET_OK) { if (ret != RCL_RET_OK) {
throw std::runtime_error("Failed to notify timer that callback occurred"); throw std::runtime_error("Failed to notify timer that callback occurred");
} }
TRACEPOINT(callback_start, (const void *)&callback_, false);
execute_callback_delegate<>(); execute_callback_delegate<>();
TRACEPOINT(callback_end, (const void *)&callback_);
} }
// void specialization // void specialization

View file

@ -28,6 +28,7 @@
<depend>rcl_yaml_param_parser</depend> <depend>rcl_yaml_param_parser</depend>
<depend>rcpputils</depend> <depend>rcpputils</depend>
<depend>rmw_implementation</depend> <depend>rmw_implementation</depend>
<depend>tracetools</depend>
<exec_depend>ament_cmake</exec_depend> <exec_depend>ament_cmake</exec_depend>