Package Summary
| Version | 0.6.0 |
| License | Apache-2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/selfpatch/ros2_medkit.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- bburda
Authors
ros2_medkit_graph_provider
Gateway plugin that builds a live ROS 2 topic dataflow graph per SOVD Function,
enriched with frequency, latency, and drop-rate metrics sourced from /diagnostics.
This is the default IntrospectionProvider - extracted from ros2_medkit_gateway
into a standalone plugin package in v0.4.0.
What It Does
- Serves
GET /api/v1/functions/{function_id}/x-medkit-graph, plus a cyclic-subscription sampler under the same resource name and a capability href on every Function’s detail response. - Subscribes to
/diagnosticsand resolves the publishing node for each metrics sample (never a fabricated or hardcoded name). - Builds a per-Function graph of Apps (nodes) and topic connections (edges) with
per-edge frequency (Hz), latency (ms), and drop-rate (%) metrics. Drop-rate
degradation only fires if your producer actually emits
drop_rate_percent/drop_rate- the referencegreenwave_monitorproducer does not, so that rule is inert against it out of the box. - Reports
pipeline_status(healthy/degraded/broken) and, when degraded, thebottleneck_edge. - Flags each edge’s live publisher count (
publisher_count) and arate_ambiguouswarning when more than one publisher shares a topic, since the measured rate is then summed across publishers and can mask a slow pipeline as healthy.
The metrics require a real /diagnostics producer running elsewhere in your system -
see the Graph Provider tutorial
for the producer contract before doing anything else. Without one, every edge stays
pending forever.
Configuration
Loaded as a gateway plugin. gateway.launch.py auto-detects and loads this plugin
when the package is installed, with no configuration required. To load it manually:
plugins: ["graph_provider"]
plugins.graph_provider.path: "/path/to/lib/ros2_medkit_graph_provider/libros2_medkit_graph_provider_plugin.so"
plugins.graph_provider.expected_frequency_hz_default: 30.0
See the configuration reference for the full set of thresholds and per-function overrides.
Architecture
The plugin implements GatewayPlugin + IntrospectionProvider:
-
GraphProviderPlugin- Main plugin class with ROS 2 subscriptions -
GraphBuildState- Per-request snapshot of topic metrics and app last-seen timestamps -
GraphBuildConfig- Resolved thresholds (expected frequency, degradation, freshness)
Entity cache is populated from the ROS 2 graph during each discovery cycle
via the merge pipeline’s PluginLayer. The graph document itself is always rebuilt
fresh from the live entity cache on every request - there is no cross-request cache
to go stale.
Documentation
License
Apache License 2.0
Changelog for package ros2_medkit_graph_provider
Forthcoming
-
x-medkit-graphpipeline health rework:pipeline_statusno longer misreports"broken"for edges with no/diagnosticscoverage at all (the previous status model conflated "never observed" with "actively broken").error_reasonis now freshness-based and its only reachable value ismetrics_stale;node_offline,topic_stale, andno_data_sourceare gone.metrics.sourceis now the actual resolved/diagnosticspublisher node name (resolved per message via publisher GID matching against/diagnostics), omitted rather than hardcoded to"greenwave_monitor"when it cannot be resolved. Per-function threshold overrides (plugins.graph_provider.function_overrides.<function_id>.*) now take effect.schema_versionbumped to"2.0.0"(#545) - Robustness hardening for
x-medkit-graphhealth signals: freshness and staleness are now computed against a monotonic clock, so a backward wall-clock step (e.g. an NTP correction) can no longer make a dead topic read as fresh; a newstale_grace_secsetting (default2.0, per-function overridable) debounces a single late/diagnosticssample sopipeline_statusdoes not flap to"broken"and back; a newmulti_publisher_ratesetting (default"annotate", per-function overridable) defends against a duplicate or leftover publisher inflating a topic's summed arrival rate and masking a slow pipeline as healthy, backed by new per-edgemetrics.publisher_countandmetrics.rate_ambiguousfields;metrics.sourceis now cleared - not retained - whenever the most recent sample's publisher cannot be resolved, matching its documented latest-wins contract; and invalidplugins.graph_provider.*configuration, including per-function override field-name typos and wrong-typed values, now logs a warning and falls back to the previous valid value instead of failing silently (#545)
0.6.0 (2026-06-22)
- No functional changes; version bump for the coordinated 0.6.0 release.
- Contributors: \@bburda
0.5.0 (2026-06-08)
- Migrated
GraphProviderPluginto theget_routes()plugin API and fixed a route-separator bug - Added shutdown guards and
noexceptdestructors that reset rclcpp resources before member destruction, preventing teardown SIGSEGV - Added post-shutdown guard unit tests; dropped the cpp-httplib source
install from the Dockerfile (now vendored via
ros2_medkit_cmake) - Build: adopt the centralized
ROS2MedkitWarningscmake module - Contributors: \@bburda
0.4.0 (2026-03-20)
- Initial release - extracted from
ros2_medkit_gatewaypackage -
GraphProviderPluginfor ROS 2 graph-based entity introspection - Standalone external plugin package with independent build and test
- Locking support via
PluginContextAPI - Contributors: \@bburda
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| ros2_medkit_cmake | |
| ament_lint_auto | |
| ament_lint_common | |
| ament_cmake_clang_format | |
| ament_cmake_gtest | |
| rclcpp | |
| diagnostic_msgs | |
| ros2_medkit_gateway |
System Dependencies
| Name |
|---|
| nlohmann-json-dev |
Dependant Packages
| Name | Deps |
|---|---|
| ros2_medkit_integration_tests |
Launch files
Messages
Services
Plugins
Recent questions tagged ros2_medkit_graph_provider at Robotics Stack Exchange
Package Summary
| Version | 0.6.0 |
| License | Apache-2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/selfpatch/ros2_medkit.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- bburda
Authors
ros2_medkit_graph_provider
Gateway plugin that builds a live ROS 2 topic dataflow graph per SOVD Function,
enriched with frequency, latency, and drop-rate metrics sourced from /diagnostics.
This is the default IntrospectionProvider - extracted from ros2_medkit_gateway
into a standalone plugin package in v0.4.0.
What It Does
- Serves
GET /api/v1/functions/{function_id}/x-medkit-graph, plus a cyclic-subscription sampler under the same resource name and a capability href on every Function’s detail response. - Subscribes to
/diagnosticsand resolves the publishing node for each metrics sample (never a fabricated or hardcoded name). - Builds a per-Function graph of Apps (nodes) and topic connections (edges) with
per-edge frequency (Hz), latency (ms), and drop-rate (%) metrics. Drop-rate
degradation only fires if your producer actually emits
drop_rate_percent/drop_rate- the referencegreenwave_monitorproducer does not, so that rule is inert against it out of the box. - Reports
pipeline_status(healthy/degraded/broken) and, when degraded, thebottleneck_edge. - Flags each edge’s live publisher count (
publisher_count) and arate_ambiguouswarning when more than one publisher shares a topic, since the measured rate is then summed across publishers and can mask a slow pipeline as healthy.
The metrics require a real /diagnostics producer running elsewhere in your system -
see the Graph Provider tutorial
for the producer contract before doing anything else. Without one, every edge stays
pending forever.
Configuration
Loaded as a gateway plugin. gateway.launch.py auto-detects and loads this plugin
when the package is installed, with no configuration required. To load it manually:
plugins: ["graph_provider"]
plugins.graph_provider.path: "/path/to/lib/ros2_medkit_graph_provider/libros2_medkit_graph_provider_plugin.so"
plugins.graph_provider.expected_frequency_hz_default: 30.0
See the configuration reference for the full set of thresholds and per-function overrides.
Architecture
The plugin implements GatewayPlugin + IntrospectionProvider:
-
GraphProviderPlugin- Main plugin class with ROS 2 subscriptions -
GraphBuildState- Per-request snapshot of topic metrics and app last-seen timestamps -
GraphBuildConfig- Resolved thresholds (expected frequency, degradation, freshness)
Entity cache is populated from the ROS 2 graph during each discovery cycle
via the merge pipeline’s PluginLayer. The graph document itself is always rebuilt
fresh from the live entity cache on every request - there is no cross-request cache
to go stale.
Documentation
License
Apache License 2.0
Changelog for package ros2_medkit_graph_provider
Forthcoming
-
x-medkit-graphpipeline health rework:pipeline_statusno longer misreports"broken"for edges with no/diagnosticscoverage at all (the previous status model conflated "never observed" with "actively broken").error_reasonis now freshness-based and its only reachable value ismetrics_stale;node_offline,topic_stale, andno_data_sourceare gone.metrics.sourceis now the actual resolved/diagnosticspublisher node name (resolved per message via publisher GID matching against/diagnostics), omitted rather than hardcoded to"greenwave_monitor"when it cannot be resolved. Per-function threshold overrides (plugins.graph_provider.function_overrides.<function_id>.*) now take effect.schema_versionbumped to"2.0.0"(#545) - Robustness hardening for
x-medkit-graphhealth signals: freshness and staleness are now computed against a monotonic clock, so a backward wall-clock step (e.g. an NTP correction) can no longer make a dead topic read as fresh; a newstale_grace_secsetting (default2.0, per-function overridable) debounces a single late/diagnosticssample sopipeline_statusdoes not flap to"broken"and back; a newmulti_publisher_ratesetting (default"annotate", per-function overridable) defends against a duplicate or leftover publisher inflating a topic's summed arrival rate and masking a slow pipeline as healthy, backed by new per-edgemetrics.publisher_countandmetrics.rate_ambiguousfields;metrics.sourceis now cleared - not retained - whenever the most recent sample's publisher cannot be resolved, matching its documented latest-wins contract; and invalidplugins.graph_provider.*configuration, including per-function override field-name typos and wrong-typed values, now logs a warning and falls back to the previous valid value instead of failing silently (#545)
0.6.0 (2026-06-22)
- No functional changes; version bump for the coordinated 0.6.0 release.
- Contributors: \@bburda
0.5.0 (2026-06-08)
- Migrated
GraphProviderPluginto theget_routes()plugin API and fixed a route-separator bug - Added shutdown guards and
noexceptdestructors that reset rclcpp resources before member destruction, preventing teardown SIGSEGV - Added post-shutdown guard unit tests; dropped the cpp-httplib source
install from the Dockerfile (now vendored via
ros2_medkit_cmake) - Build: adopt the centralized
ROS2MedkitWarningscmake module - Contributors: \@bburda
0.4.0 (2026-03-20)
- Initial release - extracted from
ros2_medkit_gatewaypackage -
GraphProviderPluginfor ROS 2 graph-based entity introspection - Standalone external plugin package with independent build and test
- Locking support via
PluginContextAPI - Contributors: \@bburda
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| ros2_medkit_cmake | |
| ament_lint_auto | |
| ament_lint_common | |
| ament_cmake_clang_format | |
| ament_cmake_gtest | |
| rclcpp | |
| diagnostic_msgs | |
| ros2_medkit_gateway |
System Dependencies
| Name |
|---|
| nlohmann-json-dev |
Dependant Packages
| Name | Deps |
|---|---|
| ros2_medkit_integration_tests |
Launch files
Messages
Services
Plugins
Recent questions tagged ros2_medkit_graph_provider at Robotics Stack Exchange
Package Summary
| Version | 0.6.0 |
| License | Apache-2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/selfpatch/ros2_medkit.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- bburda
Authors
ros2_medkit_graph_provider
Gateway plugin that builds a live ROS 2 topic dataflow graph per SOVD Function,
enriched with frequency, latency, and drop-rate metrics sourced from /diagnostics.
This is the default IntrospectionProvider - extracted from ros2_medkit_gateway
into a standalone plugin package in v0.4.0.
What It Does
- Serves
GET /api/v1/functions/{function_id}/x-medkit-graph, plus a cyclic-subscription sampler under the same resource name and a capability href on every Function’s detail response. - Subscribes to
/diagnosticsand resolves the publishing node for each metrics sample (never a fabricated or hardcoded name). - Builds a per-Function graph of Apps (nodes) and topic connections (edges) with
per-edge frequency (Hz), latency (ms), and drop-rate (%) metrics. Drop-rate
degradation only fires if your producer actually emits
drop_rate_percent/drop_rate- the referencegreenwave_monitorproducer does not, so that rule is inert against it out of the box. - Reports
pipeline_status(healthy/degraded/broken) and, when degraded, thebottleneck_edge. - Flags each edge’s live publisher count (
publisher_count) and arate_ambiguouswarning when more than one publisher shares a topic, since the measured rate is then summed across publishers and can mask a slow pipeline as healthy.
The metrics require a real /diagnostics producer running elsewhere in your system -
see the Graph Provider tutorial
for the producer contract before doing anything else. Without one, every edge stays
pending forever.
Configuration
Loaded as a gateway plugin. gateway.launch.py auto-detects and loads this plugin
when the package is installed, with no configuration required. To load it manually:
plugins: ["graph_provider"]
plugins.graph_provider.path: "/path/to/lib/ros2_medkit_graph_provider/libros2_medkit_graph_provider_plugin.so"
plugins.graph_provider.expected_frequency_hz_default: 30.0
See the configuration reference for the full set of thresholds and per-function overrides.
Architecture
The plugin implements GatewayPlugin + IntrospectionProvider:
-
GraphProviderPlugin- Main plugin class with ROS 2 subscriptions -
GraphBuildState- Per-request snapshot of topic metrics and app last-seen timestamps -
GraphBuildConfig- Resolved thresholds (expected frequency, degradation, freshness)
Entity cache is populated from the ROS 2 graph during each discovery cycle
via the merge pipeline’s PluginLayer. The graph document itself is always rebuilt
fresh from the live entity cache on every request - there is no cross-request cache
to go stale.
Documentation
License
Apache License 2.0
Changelog for package ros2_medkit_graph_provider
Forthcoming
-
x-medkit-graphpipeline health rework:pipeline_statusno longer misreports"broken"for edges with no/diagnosticscoverage at all (the previous status model conflated "never observed" with "actively broken").error_reasonis now freshness-based and its only reachable value ismetrics_stale;node_offline,topic_stale, andno_data_sourceare gone.metrics.sourceis now the actual resolved/diagnosticspublisher node name (resolved per message via publisher GID matching against/diagnostics), omitted rather than hardcoded to"greenwave_monitor"when it cannot be resolved. Per-function threshold overrides (plugins.graph_provider.function_overrides.<function_id>.*) now take effect.schema_versionbumped to"2.0.0"(#545) - Robustness hardening for
x-medkit-graphhealth signals: freshness and staleness are now computed against a monotonic clock, so a backward wall-clock step (e.g. an NTP correction) can no longer make a dead topic read as fresh; a newstale_grace_secsetting (default2.0, per-function overridable) debounces a single late/diagnosticssample sopipeline_statusdoes not flap to"broken"and back; a newmulti_publisher_ratesetting (default"annotate", per-function overridable) defends against a duplicate or leftover publisher inflating a topic's summed arrival rate and masking a slow pipeline as healthy, backed by new per-edgemetrics.publisher_countandmetrics.rate_ambiguousfields;metrics.sourceis now cleared - not retained - whenever the most recent sample's publisher cannot be resolved, matching its documented latest-wins contract; and invalidplugins.graph_provider.*configuration, including per-function override field-name typos and wrong-typed values, now logs a warning and falls back to the previous valid value instead of failing silently (#545)
0.6.0 (2026-06-22)
- No functional changes; version bump for the coordinated 0.6.0 release.
- Contributors: \@bburda
0.5.0 (2026-06-08)
- Migrated
GraphProviderPluginto theget_routes()plugin API and fixed a route-separator bug - Added shutdown guards and
noexceptdestructors that reset rclcpp resources before member destruction, preventing teardown SIGSEGV - Added post-shutdown guard unit tests; dropped the cpp-httplib source
install from the Dockerfile (now vendored via
ros2_medkit_cmake) - Build: adopt the centralized
ROS2MedkitWarningscmake module - Contributors: \@bburda
0.4.0 (2026-03-20)
- Initial release - extracted from
ros2_medkit_gatewaypackage -
GraphProviderPluginfor ROS 2 graph-based entity introspection - Standalone external plugin package with independent build and test
- Locking support via
PluginContextAPI - Contributors: \@bburda
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| ros2_medkit_cmake | |
| ament_lint_auto | |
| ament_lint_common | |
| ament_cmake_clang_format | |
| ament_cmake_gtest | |
| rclcpp | |
| diagnostic_msgs | |
| ros2_medkit_gateway |
System Dependencies
| Name |
|---|
| nlohmann-json-dev |
Dependant Packages
| Name | Deps |
|---|---|
| ros2_medkit_integration_tests |
Launch files
Messages
Services
Plugins
Recent questions tagged ros2_medkit_graph_provider at Robotics Stack Exchange
Package Summary
| Version | 0.6.0 |
| License | Apache-2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/selfpatch/ros2_medkit.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- bburda
Authors
ros2_medkit_graph_provider
Gateway plugin that builds a live ROS 2 topic dataflow graph per SOVD Function,
enriched with frequency, latency, and drop-rate metrics sourced from /diagnostics.
This is the default IntrospectionProvider - extracted from ros2_medkit_gateway
into a standalone plugin package in v0.4.0.
What It Does
- Serves
GET /api/v1/functions/{function_id}/x-medkit-graph, plus a cyclic-subscription sampler under the same resource name and a capability href on every Function’s detail response. - Subscribes to
/diagnosticsand resolves the publishing node for each metrics sample (never a fabricated or hardcoded name). - Builds a per-Function graph of Apps (nodes) and topic connections (edges) with
per-edge frequency (Hz), latency (ms), and drop-rate (%) metrics. Drop-rate
degradation only fires if your producer actually emits
drop_rate_percent/drop_rate- the referencegreenwave_monitorproducer does not, so that rule is inert against it out of the box. - Reports
pipeline_status(healthy/degraded/broken) and, when degraded, thebottleneck_edge. - Flags each edge’s live publisher count (
publisher_count) and arate_ambiguouswarning when more than one publisher shares a topic, since the measured rate is then summed across publishers and can mask a slow pipeline as healthy.
The metrics require a real /diagnostics producer running elsewhere in your system -
see the Graph Provider tutorial
for the producer contract before doing anything else. Without one, every edge stays
pending forever.
Configuration
Loaded as a gateway plugin. gateway.launch.py auto-detects and loads this plugin
when the package is installed, with no configuration required. To load it manually:
plugins: ["graph_provider"]
plugins.graph_provider.path: "/path/to/lib/ros2_medkit_graph_provider/libros2_medkit_graph_provider_plugin.so"
plugins.graph_provider.expected_frequency_hz_default: 30.0
See the configuration reference for the full set of thresholds and per-function overrides.
Architecture
The plugin implements GatewayPlugin + IntrospectionProvider:
-
GraphProviderPlugin- Main plugin class with ROS 2 subscriptions -
GraphBuildState- Per-request snapshot of topic metrics and app last-seen timestamps -
GraphBuildConfig- Resolved thresholds (expected frequency, degradation, freshness)
Entity cache is populated from the ROS 2 graph during each discovery cycle
via the merge pipeline’s PluginLayer. The graph document itself is always rebuilt
fresh from the live entity cache on every request - there is no cross-request cache
to go stale.
Documentation
License
Apache License 2.0
Changelog for package ros2_medkit_graph_provider
Forthcoming
-
x-medkit-graphpipeline health rework:pipeline_statusno longer misreports"broken"for edges with no/diagnosticscoverage at all (the previous status model conflated "never observed" with "actively broken").error_reasonis now freshness-based and its only reachable value ismetrics_stale;node_offline,topic_stale, andno_data_sourceare gone.metrics.sourceis now the actual resolved/diagnosticspublisher node name (resolved per message via publisher GID matching against/diagnostics), omitted rather than hardcoded to"greenwave_monitor"when it cannot be resolved. Per-function threshold overrides (plugins.graph_provider.function_overrides.<function_id>.*) now take effect.schema_versionbumped to"2.0.0"(#545) - Robustness hardening for
x-medkit-graphhealth signals: freshness and staleness are now computed against a monotonic clock, so a backward wall-clock step (e.g. an NTP correction) can no longer make a dead topic read as fresh; a newstale_grace_secsetting (default2.0, per-function overridable) debounces a single late/diagnosticssample sopipeline_statusdoes not flap to"broken"and back; a newmulti_publisher_ratesetting (default"annotate", per-function overridable) defends against a duplicate or leftover publisher inflating a topic's summed arrival rate and masking a slow pipeline as healthy, backed by new per-edgemetrics.publisher_countandmetrics.rate_ambiguousfields;metrics.sourceis now cleared - not retained - whenever the most recent sample's publisher cannot be resolved, matching its documented latest-wins contract; and invalidplugins.graph_provider.*configuration, including per-function override field-name typos and wrong-typed values, now logs a warning and falls back to the previous valid value instead of failing silently (#545)
0.6.0 (2026-06-22)
- No functional changes; version bump for the coordinated 0.6.0 release.
- Contributors: \@bburda
0.5.0 (2026-06-08)
- Migrated
GraphProviderPluginto theget_routes()plugin API and fixed a route-separator bug - Added shutdown guards and
noexceptdestructors that reset rclcpp resources before member destruction, preventing teardown SIGSEGV - Added post-shutdown guard unit tests; dropped the cpp-httplib source
install from the Dockerfile (now vendored via
ros2_medkit_cmake) - Build: adopt the centralized
ROS2MedkitWarningscmake module - Contributors: \@bburda
0.4.0 (2026-03-20)
- Initial release - extracted from
ros2_medkit_gatewaypackage -
GraphProviderPluginfor ROS 2 graph-based entity introspection - Standalone external plugin package with independent build and test
- Locking support via
PluginContextAPI - Contributors: \@bburda
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| ros2_medkit_cmake | |
| ament_lint_auto | |
| ament_lint_common | |
| ament_cmake_clang_format | |
| ament_cmake_gtest | |
| rclcpp | |
| diagnostic_msgs | |
| ros2_medkit_gateway |
System Dependencies
| Name |
|---|
| nlohmann-json-dev |
Dependant Packages
| Name | Deps |
|---|---|
| ros2_medkit_integration_tests |
Launch files
Messages
Services
Plugins
Recent questions tagged ros2_medkit_graph_provider at Robotics Stack Exchange
Package Summary
| Version | 0.6.0 |
| License | Apache-2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/selfpatch/ros2_medkit.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- bburda
Authors
ros2_medkit_graph_provider
Gateway plugin that builds a live ROS 2 topic dataflow graph per SOVD Function,
enriched with frequency, latency, and drop-rate metrics sourced from /diagnostics.
This is the default IntrospectionProvider - extracted from ros2_medkit_gateway
into a standalone plugin package in v0.4.0.
What It Does
- Serves
GET /api/v1/functions/{function_id}/x-medkit-graph, plus a cyclic-subscription sampler under the same resource name and a capability href on every Function’s detail response. - Subscribes to
/diagnosticsand resolves the publishing node for each metrics sample (never a fabricated or hardcoded name). - Builds a per-Function graph of Apps (nodes) and topic connections (edges) with
per-edge frequency (Hz), latency (ms), and drop-rate (%) metrics. Drop-rate
degradation only fires if your producer actually emits
drop_rate_percent/drop_rate- the referencegreenwave_monitorproducer does not, so that rule is inert against it out of the box. - Reports
pipeline_status(healthy/degraded/broken) and, when degraded, thebottleneck_edge. - Flags each edge’s live publisher count (
publisher_count) and arate_ambiguouswarning when more than one publisher shares a topic, since the measured rate is then summed across publishers and can mask a slow pipeline as healthy.
The metrics require a real /diagnostics producer running elsewhere in your system -
see the Graph Provider tutorial
for the producer contract before doing anything else. Without one, every edge stays
pending forever.
Configuration
Loaded as a gateway plugin. gateway.launch.py auto-detects and loads this plugin
when the package is installed, with no configuration required. To load it manually:
plugins: ["graph_provider"]
plugins.graph_provider.path: "/path/to/lib/ros2_medkit_graph_provider/libros2_medkit_graph_provider_plugin.so"
plugins.graph_provider.expected_frequency_hz_default: 30.0
See the configuration reference for the full set of thresholds and per-function overrides.
Architecture
The plugin implements GatewayPlugin + IntrospectionProvider:
-
GraphProviderPlugin- Main plugin class with ROS 2 subscriptions -
GraphBuildState- Per-request snapshot of topic metrics and app last-seen timestamps -
GraphBuildConfig- Resolved thresholds (expected frequency, degradation, freshness)
Entity cache is populated from the ROS 2 graph during each discovery cycle
via the merge pipeline’s PluginLayer. The graph document itself is always rebuilt
fresh from the live entity cache on every request - there is no cross-request cache
to go stale.
Documentation
License
Apache License 2.0
Changelog for package ros2_medkit_graph_provider
Forthcoming
-
x-medkit-graphpipeline health rework:pipeline_statusno longer misreports"broken"for edges with no/diagnosticscoverage at all (the previous status model conflated "never observed" with "actively broken").error_reasonis now freshness-based and its only reachable value ismetrics_stale;node_offline,topic_stale, andno_data_sourceare gone.metrics.sourceis now the actual resolved/diagnosticspublisher node name (resolved per message via publisher GID matching against/diagnostics), omitted rather than hardcoded to"greenwave_monitor"when it cannot be resolved. Per-function threshold overrides (plugins.graph_provider.function_overrides.<function_id>.*) now take effect.schema_versionbumped to"2.0.0"(#545) - Robustness hardening for
x-medkit-graphhealth signals: freshness and staleness are now computed against a monotonic clock, so a backward wall-clock step (e.g. an NTP correction) can no longer make a dead topic read as fresh; a newstale_grace_secsetting (default2.0, per-function overridable) debounces a single late/diagnosticssample sopipeline_statusdoes not flap to"broken"and back; a newmulti_publisher_ratesetting (default"annotate", per-function overridable) defends against a duplicate or leftover publisher inflating a topic's summed arrival rate and masking a slow pipeline as healthy, backed by new per-edgemetrics.publisher_countandmetrics.rate_ambiguousfields;metrics.sourceis now cleared - not retained - whenever the most recent sample's publisher cannot be resolved, matching its documented latest-wins contract; and invalidplugins.graph_provider.*configuration, including per-function override field-name typos and wrong-typed values, now logs a warning and falls back to the previous valid value instead of failing silently (#545)
0.6.0 (2026-06-22)
- No functional changes; version bump for the coordinated 0.6.0 release.
- Contributors: \@bburda
0.5.0 (2026-06-08)
- Migrated
GraphProviderPluginto theget_routes()plugin API and fixed a route-separator bug - Added shutdown guards and
noexceptdestructors that reset rclcpp resources before member destruction, preventing teardown SIGSEGV - Added post-shutdown guard unit tests; dropped the cpp-httplib source
install from the Dockerfile (now vendored via
ros2_medkit_cmake) - Build: adopt the centralized
ROS2MedkitWarningscmake module - Contributors: \@bburda
0.4.0 (2026-03-20)
- Initial release - extracted from
ros2_medkit_gatewaypackage -
GraphProviderPluginfor ROS 2 graph-based entity introspection - Standalone external plugin package with independent build and test
- Locking support via
PluginContextAPI - Contributors: \@bburda
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| ros2_medkit_cmake | |
| ament_lint_auto | |
| ament_lint_common | |
| ament_cmake_clang_format | |
| ament_cmake_gtest | |
| rclcpp | |
| diagnostic_msgs | |
| ros2_medkit_gateway |
System Dependencies
| Name |
|---|
| nlohmann-json-dev |
Dependant Packages
| Name | Deps |
|---|---|
| ros2_medkit_integration_tests |
Launch files
Messages
Services
Plugins
Recent questions tagged ros2_medkit_graph_provider at Robotics Stack Exchange
Package Summary
| Version | 0.6.0 |
| License | Apache-2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/selfpatch/ros2_medkit.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- bburda
Authors
ros2_medkit_graph_provider
Gateway plugin that builds a live ROS 2 topic dataflow graph per SOVD Function,
enriched with frequency, latency, and drop-rate metrics sourced from /diagnostics.
This is the default IntrospectionProvider - extracted from ros2_medkit_gateway
into a standalone plugin package in v0.4.0.
What It Does
- Serves
GET /api/v1/functions/{function_id}/x-medkit-graph, plus a cyclic-subscription sampler under the same resource name and a capability href on every Function’s detail response. - Subscribes to
/diagnosticsand resolves the publishing node for each metrics sample (never a fabricated or hardcoded name). - Builds a per-Function graph of Apps (nodes) and topic connections (edges) with
per-edge frequency (Hz), latency (ms), and drop-rate (%) metrics. Drop-rate
degradation only fires if your producer actually emits
drop_rate_percent/drop_rate- the referencegreenwave_monitorproducer does not, so that rule is inert against it out of the box. - Reports
pipeline_status(healthy/degraded/broken) and, when degraded, thebottleneck_edge. - Flags each edge’s live publisher count (
publisher_count) and arate_ambiguouswarning when more than one publisher shares a topic, since the measured rate is then summed across publishers and can mask a slow pipeline as healthy.
The metrics require a real /diagnostics producer running elsewhere in your system -
see the Graph Provider tutorial
for the producer contract before doing anything else. Without one, every edge stays
pending forever.
Configuration
Loaded as a gateway plugin. gateway.launch.py auto-detects and loads this plugin
when the package is installed, with no configuration required. To load it manually:
plugins: ["graph_provider"]
plugins.graph_provider.path: "/path/to/lib/ros2_medkit_graph_provider/libros2_medkit_graph_provider_plugin.so"
plugins.graph_provider.expected_frequency_hz_default: 30.0
See the configuration reference for the full set of thresholds and per-function overrides.
Architecture
The plugin implements GatewayPlugin + IntrospectionProvider:
-
GraphProviderPlugin- Main plugin class with ROS 2 subscriptions -
GraphBuildState- Per-request snapshot of topic metrics and app last-seen timestamps -
GraphBuildConfig- Resolved thresholds (expected frequency, degradation, freshness)
Entity cache is populated from the ROS 2 graph during each discovery cycle
via the merge pipeline’s PluginLayer. The graph document itself is always rebuilt
fresh from the live entity cache on every request - there is no cross-request cache
to go stale.
Documentation
License
Apache License 2.0
Changelog for package ros2_medkit_graph_provider
Forthcoming
-
x-medkit-graphpipeline health rework:pipeline_statusno longer misreports"broken"for edges with no/diagnosticscoverage at all (the previous status model conflated "never observed" with "actively broken").error_reasonis now freshness-based and its only reachable value ismetrics_stale;node_offline,topic_stale, andno_data_sourceare gone.metrics.sourceis now the actual resolved/diagnosticspublisher node name (resolved per message via publisher GID matching against/diagnostics), omitted rather than hardcoded to"greenwave_monitor"when it cannot be resolved. Per-function threshold overrides (plugins.graph_provider.function_overrides.<function_id>.*) now take effect.schema_versionbumped to"2.0.0"(#545) - Robustness hardening for
x-medkit-graphhealth signals: freshness and staleness are now computed against a monotonic clock, so a backward wall-clock step (e.g. an NTP correction) can no longer make a dead topic read as fresh; a newstale_grace_secsetting (default2.0, per-function overridable) debounces a single late/diagnosticssample sopipeline_statusdoes not flap to"broken"and back; a newmulti_publisher_ratesetting (default"annotate", per-function overridable) defends against a duplicate or leftover publisher inflating a topic's summed arrival rate and masking a slow pipeline as healthy, backed by new per-edgemetrics.publisher_countandmetrics.rate_ambiguousfields;metrics.sourceis now cleared - not retained - whenever the most recent sample's publisher cannot be resolved, matching its documented latest-wins contract; and invalidplugins.graph_provider.*configuration, including per-function override field-name typos and wrong-typed values, now logs a warning and falls back to the previous valid value instead of failing silently (#545)
0.6.0 (2026-06-22)
- No functional changes; version bump for the coordinated 0.6.0 release.
- Contributors: \@bburda
0.5.0 (2026-06-08)
- Migrated
GraphProviderPluginto theget_routes()plugin API and fixed a route-separator bug - Added shutdown guards and
noexceptdestructors that reset rclcpp resources before member destruction, preventing teardown SIGSEGV - Added post-shutdown guard unit tests; dropped the cpp-httplib source
install from the Dockerfile (now vendored via
ros2_medkit_cmake) - Build: adopt the centralized
ROS2MedkitWarningscmake module - Contributors: \@bburda
0.4.0 (2026-03-20)
- Initial release - extracted from
ros2_medkit_gatewaypackage -
GraphProviderPluginfor ROS 2 graph-based entity introspection - Standalone external plugin package with independent build and test
- Locking support via
PluginContextAPI - Contributors: \@bburda
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| ros2_medkit_cmake | |
| ament_lint_auto | |
| ament_lint_common | |
| ament_cmake_clang_format | |
| ament_cmake_gtest | |
| rclcpp | |
| diagnostic_msgs | |
| ros2_medkit_gateway |
System Dependencies
| Name |
|---|
| nlohmann-json-dev |
Dependant Packages
| Name | Deps |
|---|---|
| ros2_medkit_integration_tests |
Launch files
Messages
Services
Plugins
Recent questions tagged ros2_medkit_graph_provider at Robotics Stack Exchange
Package Summary
| Version | 0.6.0 |
| License | Apache-2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/selfpatch/ros2_medkit.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- bburda
Authors
ros2_medkit_graph_provider
Gateway plugin that builds a live ROS 2 topic dataflow graph per SOVD Function,
enriched with frequency, latency, and drop-rate metrics sourced from /diagnostics.
This is the default IntrospectionProvider - extracted from ros2_medkit_gateway
into a standalone plugin package in v0.4.0.
What It Does
- Serves
GET /api/v1/functions/{function_id}/x-medkit-graph, plus a cyclic-subscription sampler under the same resource name and a capability href on every Function’s detail response. - Subscribes to
/diagnosticsand resolves the publishing node for each metrics sample (never a fabricated or hardcoded name). - Builds a per-Function graph of Apps (nodes) and topic connections (edges) with
per-edge frequency (Hz), latency (ms), and drop-rate (%) metrics. Drop-rate
degradation only fires if your producer actually emits
drop_rate_percent/drop_rate- the referencegreenwave_monitorproducer does not, so that rule is inert against it out of the box. - Reports
pipeline_status(healthy/degraded/broken) and, when degraded, thebottleneck_edge. - Flags each edge’s live publisher count (
publisher_count) and arate_ambiguouswarning when more than one publisher shares a topic, since the measured rate is then summed across publishers and can mask a slow pipeline as healthy.
The metrics require a real /diagnostics producer running elsewhere in your system -
see the Graph Provider tutorial
for the producer contract before doing anything else. Without one, every edge stays
pending forever.
Configuration
Loaded as a gateway plugin. gateway.launch.py auto-detects and loads this plugin
when the package is installed, with no configuration required. To load it manually:
plugins: ["graph_provider"]
plugins.graph_provider.path: "/path/to/lib/ros2_medkit_graph_provider/libros2_medkit_graph_provider_plugin.so"
plugins.graph_provider.expected_frequency_hz_default: 30.0
See the configuration reference for the full set of thresholds and per-function overrides.
Architecture
The plugin implements GatewayPlugin + IntrospectionProvider:
-
GraphProviderPlugin- Main plugin class with ROS 2 subscriptions -
GraphBuildState- Per-request snapshot of topic metrics and app last-seen timestamps -
GraphBuildConfig- Resolved thresholds (expected frequency, degradation, freshness)
Entity cache is populated from the ROS 2 graph during each discovery cycle
via the merge pipeline’s PluginLayer. The graph document itself is always rebuilt
fresh from the live entity cache on every request - there is no cross-request cache
to go stale.
Documentation
License
Apache License 2.0
Changelog for package ros2_medkit_graph_provider
Forthcoming
-
x-medkit-graphpipeline health rework:pipeline_statusno longer misreports"broken"for edges with no/diagnosticscoverage at all (the previous status model conflated "never observed" with "actively broken").error_reasonis now freshness-based and its only reachable value ismetrics_stale;node_offline,topic_stale, andno_data_sourceare gone.metrics.sourceis now the actual resolved/diagnosticspublisher node name (resolved per message via publisher GID matching against/diagnostics), omitted rather than hardcoded to"greenwave_monitor"when it cannot be resolved. Per-function threshold overrides (plugins.graph_provider.function_overrides.<function_id>.*) now take effect.schema_versionbumped to"2.0.0"(#545) - Robustness hardening for
x-medkit-graphhealth signals: freshness and staleness are now computed against a monotonic clock, so a backward wall-clock step (e.g. an NTP correction) can no longer make a dead topic read as fresh; a newstale_grace_secsetting (default2.0, per-function overridable) debounces a single late/diagnosticssample sopipeline_statusdoes not flap to"broken"and back; a newmulti_publisher_ratesetting (default"annotate", per-function overridable) defends against a duplicate or leftover publisher inflating a topic's summed arrival rate and masking a slow pipeline as healthy, backed by new per-edgemetrics.publisher_countandmetrics.rate_ambiguousfields;metrics.sourceis now cleared - not retained - whenever the most recent sample's publisher cannot be resolved, matching its documented latest-wins contract; and invalidplugins.graph_provider.*configuration, including per-function override field-name typos and wrong-typed values, now logs a warning and falls back to the previous valid value instead of failing silently (#545)
0.6.0 (2026-06-22)
- No functional changes; version bump for the coordinated 0.6.0 release.
- Contributors: \@bburda
0.5.0 (2026-06-08)
- Migrated
GraphProviderPluginto theget_routes()plugin API and fixed a route-separator bug - Added shutdown guards and
noexceptdestructors that reset rclcpp resources before member destruction, preventing teardown SIGSEGV - Added post-shutdown guard unit tests; dropped the cpp-httplib source
install from the Dockerfile (now vendored via
ros2_medkit_cmake) - Build: adopt the centralized
ROS2MedkitWarningscmake module - Contributors: \@bburda
0.4.0 (2026-03-20)
- Initial release - extracted from
ros2_medkit_gatewaypackage -
GraphProviderPluginfor ROS 2 graph-based entity introspection - Standalone external plugin package with independent build and test
- Locking support via
PluginContextAPI - Contributors: \@bburda
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| ros2_medkit_cmake | |
| ament_lint_auto | |
| ament_lint_common | |
| ament_cmake_clang_format | |
| ament_cmake_gtest | |
| rclcpp | |
| diagnostic_msgs | |
| ros2_medkit_gateway |
System Dependencies
| Name |
|---|
| nlohmann-json-dev |
Dependant Packages
| Name | Deps |
|---|---|
| ros2_medkit_integration_tests |
Launch files
Messages
Services
Plugins
Recent questions tagged ros2_medkit_graph_provider at Robotics Stack Exchange
Package Summary
| Version | 0.6.0 |
| License | Apache-2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/selfpatch/ros2_medkit.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- bburda
Authors
ros2_medkit_graph_provider
Gateway plugin that builds a live ROS 2 topic dataflow graph per SOVD Function,
enriched with frequency, latency, and drop-rate metrics sourced from /diagnostics.
This is the default IntrospectionProvider - extracted from ros2_medkit_gateway
into a standalone plugin package in v0.4.0.
What It Does
- Serves
GET /api/v1/functions/{function_id}/x-medkit-graph, plus a cyclic-subscription sampler under the same resource name and a capability href on every Function’s detail response. - Subscribes to
/diagnosticsand resolves the publishing node for each metrics sample (never a fabricated or hardcoded name). - Builds a per-Function graph of Apps (nodes) and topic connections (edges) with
per-edge frequency (Hz), latency (ms), and drop-rate (%) metrics. Drop-rate
degradation only fires if your producer actually emits
drop_rate_percent/drop_rate- the referencegreenwave_monitorproducer does not, so that rule is inert against it out of the box. - Reports
pipeline_status(healthy/degraded/broken) and, when degraded, thebottleneck_edge. - Flags each edge’s live publisher count (
publisher_count) and arate_ambiguouswarning when more than one publisher shares a topic, since the measured rate is then summed across publishers and can mask a slow pipeline as healthy.
The metrics require a real /diagnostics producer running elsewhere in your system -
see the Graph Provider tutorial
for the producer contract before doing anything else. Without one, every edge stays
pending forever.
Configuration
Loaded as a gateway plugin. gateway.launch.py auto-detects and loads this plugin
when the package is installed, with no configuration required. To load it manually:
plugins: ["graph_provider"]
plugins.graph_provider.path: "/path/to/lib/ros2_medkit_graph_provider/libros2_medkit_graph_provider_plugin.so"
plugins.graph_provider.expected_frequency_hz_default: 30.0
See the configuration reference for the full set of thresholds and per-function overrides.
Architecture
The plugin implements GatewayPlugin + IntrospectionProvider:
-
GraphProviderPlugin- Main plugin class with ROS 2 subscriptions -
GraphBuildState- Per-request snapshot of topic metrics and app last-seen timestamps -
GraphBuildConfig- Resolved thresholds (expected frequency, degradation, freshness)
Entity cache is populated from the ROS 2 graph during each discovery cycle
via the merge pipeline’s PluginLayer. The graph document itself is always rebuilt
fresh from the live entity cache on every request - there is no cross-request cache
to go stale.
Documentation
License
Apache License 2.0
Changelog for package ros2_medkit_graph_provider
Forthcoming
-
x-medkit-graphpipeline health rework:pipeline_statusno longer misreports"broken"for edges with no/diagnosticscoverage at all (the previous status model conflated "never observed" with "actively broken").error_reasonis now freshness-based and its only reachable value ismetrics_stale;node_offline,topic_stale, andno_data_sourceare gone.metrics.sourceis now the actual resolved/diagnosticspublisher node name (resolved per message via publisher GID matching against/diagnostics), omitted rather than hardcoded to"greenwave_monitor"when it cannot be resolved. Per-function threshold overrides (plugins.graph_provider.function_overrides.<function_id>.*) now take effect.schema_versionbumped to"2.0.0"(#545) - Robustness hardening for
x-medkit-graphhealth signals: freshness and staleness are now computed against a monotonic clock, so a backward wall-clock step (e.g. an NTP correction) can no longer make a dead topic read as fresh; a newstale_grace_secsetting (default2.0, per-function overridable) debounces a single late/diagnosticssample sopipeline_statusdoes not flap to"broken"and back; a newmulti_publisher_ratesetting (default"annotate", per-function overridable) defends against a duplicate or leftover publisher inflating a topic's summed arrival rate and masking a slow pipeline as healthy, backed by new per-edgemetrics.publisher_countandmetrics.rate_ambiguousfields;metrics.sourceis now cleared - not retained - whenever the most recent sample's publisher cannot be resolved, matching its documented latest-wins contract; and invalidplugins.graph_provider.*configuration, including per-function override field-name typos and wrong-typed values, now logs a warning and falls back to the previous valid value instead of failing silently (#545)
0.6.0 (2026-06-22)
- No functional changes; version bump for the coordinated 0.6.0 release.
- Contributors: \@bburda
0.5.0 (2026-06-08)
- Migrated
GraphProviderPluginto theget_routes()plugin API and fixed a route-separator bug - Added shutdown guards and
noexceptdestructors that reset rclcpp resources before member destruction, preventing teardown SIGSEGV - Added post-shutdown guard unit tests; dropped the cpp-httplib source
install from the Dockerfile (now vendored via
ros2_medkit_cmake) - Build: adopt the centralized
ROS2MedkitWarningscmake module - Contributors: \@bburda
0.4.0 (2026-03-20)
- Initial release - extracted from
ros2_medkit_gatewaypackage -
GraphProviderPluginfor ROS 2 graph-based entity introspection - Standalone external plugin package with independent build and test
- Locking support via
PluginContextAPI - Contributors: \@bburda
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| ros2_medkit_cmake | |
| ament_lint_auto | |
| ament_lint_common | |
| ament_cmake_clang_format | |
| ament_cmake_gtest | |
| rclcpp | |
| diagnostic_msgs | |
| ros2_medkit_gateway |
System Dependencies
| Name |
|---|
| nlohmann-json-dev |
Dependant Packages
| Name | Deps |
|---|---|
| ros2_medkit_integration_tests |
Launch files
Messages
Services
Plugins
Recent questions tagged ros2_medkit_graph_provider at Robotics Stack Exchange
Package Summary
| Version | 0.6.0 |
| License | Apache-2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/selfpatch/ros2_medkit.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- bburda
Authors
ros2_medkit_graph_provider
Gateway plugin that builds a live ROS 2 topic dataflow graph per SOVD Function,
enriched with frequency, latency, and drop-rate metrics sourced from /diagnostics.
This is the default IntrospectionProvider - extracted from ros2_medkit_gateway
into a standalone plugin package in v0.4.0.
What It Does
- Serves
GET /api/v1/functions/{function_id}/x-medkit-graph, plus a cyclic-subscription sampler under the same resource name and a capability href on every Function’s detail response. - Subscribes to
/diagnosticsand resolves the publishing node for each metrics sample (never a fabricated or hardcoded name). - Builds a per-Function graph of Apps (nodes) and topic connections (edges) with
per-edge frequency (Hz), latency (ms), and drop-rate (%) metrics. Drop-rate
degradation only fires if your producer actually emits
drop_rate_percent/drop_rate- the referencegreenwave_monitorproducer does not, so that rule is inert against it out of the box. - Reports
pipeline_status(healthy/degraded/broken) and, when degraded, thebottleneck_edge. - Flags each edge’s live publisher count (
publisher_count) and arate_ambiguouswarning when more than one publisher shares a topic, since the measured rate is then summed across publishers and can mask a slow pipeline as healthy.
The metrics require a real /diagnostics producer running elsewhere in your system -
see the Graph Provider tutorial
for the producer contract before doing anything else. Without one, every edge stays
pending forever.
Configuration
Loaded as a gateway plugin. gateway.launch.py auto-detects and loads this plugin
when the package is installed, with no configuration required. To load it manually:
plugins: ["graph_provider"]
plugins.graph_provider.path: "/path/to/lib/ros2_medkit_graph_provider/libros2_medkit_graph_provider_plugin.so"
plugins.graph_provider.expected_frequency_hz_default: 30.0
See the configuration reference for the full set of thresholds and per-function overrides.
Architecture
The plugin implements GatewayPlugin + IntrospectionProvider:
-
GraphProviderPlugin- Main plugin class with ROS 2 subscriptions -
GraphBuildState- Per-request snapshot of topic metrics and app last-seen timestamps -
GraphBuildConfig- Resolved thresholds (expected frequency, degradation, freshness)
Entity cache is populated from the ROS 2 graph during each discovery cycle
via the merge pipeline’s PluginLayer. The graph document itself is always rebuilt
fresh from the live entity cache on every request - there is no cross-request cache
to go stale.
Documentation
License
Apache License 2.0
Changelog for package ros2_medkit_graph_provider
Forthcoming
-
x-medkit-graphpipeline health rework:pipeline_statusno longer misreports"broken"for edges with no/diagnosticscoverage at all (the previous status model conflated "never observed" with "actively broken").error_reasonis now freshness-based and its only reachable value ismetrics_stale;node_offline,topic_stale, andno_data_sourceare gone.metrics.sourceis now the actual resolved/diagnosticspublisher node name (resolved per message via publisher GID matching against/diagnostics), omitted rather than hardcoded to"greenwave_monitor"when it cannot be resolved. Per-function threshold overrides (plugins.graph_provider.function_overrides.<function_id>.*) now take effect.schema_versionbumped to"2.0.0"(#545) - Robustness hardening for
x-medkit-graphhealth signals: freshness and staleness are now computed against a monotonic clock, so a backward wall-clock step (e.g. an NTP correction) can no longer make a dead topic read as fresh; a newstale_grace_secsetting (default2.0, per-function overridable) debounces a single late/diagnosticssample sopipeline_statusdoes not flap to"broken"and back; a newmulti_publisher_ratesetting (default"annotate", per-function overridable) defends against a duplicate or leftover publisher inflating a topic's summed arrival rate and masking a slow pipeline as healthy, backed by new per-edgemetrics.publisher_countandmetrics.rate_ambiguousfields;metrics.sourceis now cleared - not retained - whenever the most recent sample's publisher cannot be resolved, matching its documented latest-wins contract; and invalidplugins.graph_provider.*configuration, including per-function override field-name typos and wrong-typed values, now logs a warning and falls back to the previous valid value instead of failing silently (#545)
0.6.0 (2026-06-22)
- No functional changes; version bump for the coordinated 0.6.0 release.
- Contributors: \@bburda
0.5.0 (2026-06-08)
- Migrated
GraphProviderPluginto theget_routes()plugin API and fixed a route-separator bug - Added shutdown guards and
noexceptdestructors that reset rclcpp resources before member destruction, preventing teardown SIGSEGV - Added post-shutdown guard unit tests; dropped the cpp-httplib source
install from the Dockerfile (now vendored via
ros2_medkit_cmake) - Build: adopt the centralized
ROS2MedkitWarningscmake module - Contributors: \@bburda
0.4.0 (2026-03-20)
- Initial release - extracted from
ros2_medkit_gatewaypackage -
GraphProviderPluginfor ROS 2 graph-based entity introspection - Standalone external plugin package with independent build and test
- Locking support via
PluginContextAPI - Contributors: \@bburda
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| ros2_medkit_cmake | |
| ament_lint_auto | |
| ament_lint_common | |
| ament_cmake_clang_format | |
| ament_cmake_gtest | |
| rclcpp | |
| diagnostic_msgs | |
| ros2_medkit_gateway |
System Dependencies
| Name |
|---|
| nlohmann-json-dev |
Dependant Packages
| Name | Deps |
|---|---|
| ros2_medkit_integration_tests |
Launch files
Messages
Services
Plugins
Recent questions tagged ros2_medkit_graph_provider at Robotics Stack Exchange
Package Summary
| Version | 0.6.0 |
| License | Apache-2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/selfpatch/ros2_medkit.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- bburda
Authors
ros2_medkit_graph_provider
Gateway plugin that builds a live ROS 2 topic dataflow graph per SOVD Function,
enriched with frequency, latency, and drop-rate metrics sourced from /diagnostics.
This is the default IntrospectionProvider - extracted from ros2_medkit_gateway
into a standalone plugin package in v0.4.0.
What It Does
- Serves
GET /api/v1/functions/{function_id}/x-medkit-graph, plus a cyclic-subscription sampler under the same resource name and a capability href on every Function’s detail response. - Subscribes to
/diagnosticsand resolves the publishing node for each metrics sample (never a fabricated or hardcoded name). - Builds a per-Function graph of Apps (nodes) and topic connections (edges) with
per-edge frequency (Hz), latency (ms), and drop-rate (%) metrics. Drop-rate
degradation only fires if your producer actually emits
drop_rate_percent/drop_rate- the referencegreenwave_monitorproducer does not, so that rule is inert against it out of the box. - Reports
pipeline_status(healthy/degraded/broken) and, when degraded, thebottleneck_edge. - Flags each edge’s live publisher count (
publisher_count) and arate_ambiguouswarning when more than one publisher shares a topic, since the measured rate is then summed across publishers and can mask a slow pipeline as healthy.
The metrics require a real /diagnostics producer running elsewhere in your system -
see the Graph Provider tutorial
for the producer contract before doing anything else. Without one, every edge stays
pending forever.
Configuration
Loaded as a gateway plugin. gateway.launch.py auto-detects and loads this plugin
when the package is installed, with no configuration required. To load it manually:
plugins: ["graph_provider"]
plugins.graph_provider.path: "/path/to/lib/ros2_medkit_graph_provider/libros2_medkit_graph_provider_plugin.so"
plugins.graph_provider.expected_frequency_hz_default: 30.0
See the configuration reference for the full set of thresholds and per-function overrides.
Architecture
The plugin implements GatewayPlugin + IntrospectionProvider:
-
GraphProviderPlugin- Main plugin class with ROS 2 subscriptions -
GraphBuildState- Per-request snapshot of topic metrics and app last-seen timestamps -
GraphBuildConfig- Resolved thresholds (expected frequency, degradation, freshness)
Entity cache is populated from the ROS 2 graph during each discovery cycle
via the merge pipeline’s PluginLayer. The graph document itself is always rebuilt
fresh from the live entity cache on every request - there is no cross-request cache
to go stale.
Documentation
License
Apache License 2.0
Changelog for package ros2_medkit_graph_provider
Forthcoming
-
x-medkit-graphpipeline health rework:pipeline_statusno longer misreports"broken"for edges with no/diagnosticscoverage at all (the previous status model conflated "never observed" with "actively broken").error_reasonis now freshness-based and its only reachable value ismetrics_stale;node_offline,topic_stale, andno_data_sourceare gone.metrics.sourceis now the actual resolved/diagnosticspublisher node name (resolved per message via publisher GID matching against/diagnostics), omitted rather than hardcoded to"greenwave_monitor"when it cannot be resolved. Per-function threshold overrides (plugins.graph_provider.function_overrides.<function_id>.*) now take effect.schema_versionbumped to"2.0.0"(#545) - Robustness hardening for
x-medkit-graphhealth signals: freshness and staleness are now computed against a monotonic clock, so a backward wall-clock step (e.g. an NTP correction) can no longer make a dead topic read as fresh; a newstale_grace_secsetting (default2.0, per-function overridable) debounces a single late/diagnosticssample sopipeline_statusdoes not flap to"broken"and back; a newmulti_publisher_ratesetting (default"annotate", per-function overridable) defends against a duplicate or leftover publisher inflating a topic's summed arrival rate and masking a slow pipeline as healthy, backed by new per-edgemetrics.publisher_countandmetrics.rate_ambiguousfields;metrics.sourceis now cleared - not retained - whenever the most recent sample's publisher cannot be resolved, matching its documented latest-wins contract; and invalidplugins.graph_provider.*configuration, including per-function override field-name typos and wrong-typed values, now logs a warning and falls back to the previous valid value instead of failing silently (#545)
0.6.0 (2026-06-22)
- No functional changes; version bump for the coordinated 0.6.0 release.
- Contributors: \@bburda
0.5.0 (2026-06-08)
- Migrated
GraphProviderPluginto theget_routes()plugin API and fixed a route-separator bug - Added shutdown guards and
noexceptdestructors that reset rclcpp resources before member destruction, preventing teardown SIGSEGV - Added post-shutdown guard unit tests; dropped the cpp-httplib source
install from the Dockerfile (now vendored via
ros2_medkit_cmake) - Build: adopt the centralized
ROS2MedkitWarningscmake module - Contributors: \@bburda
0.4.0 (2026-03-20)
- Initial release - extracted from
ros2_medkit_gatewaypackage -
GraphProviderPluginfor ROS 2 graph-based entity introspection - Standalone external plugin package with independent build and test
- Locking support via
PluginContextAPI - Contributors: \@bburda
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| ros2_medkit_cmake | |
| ament_lint_auto | |
| ament_lint_common | |
| ament_cmake_clang_format | |
| ament_cmake_gtest | |
| rclcpp | |
| diagnostic_msgs | |
| ros2_medkit_gateway |
System Dependencies
| Name |
|---|
| nlohmann-json-dev |
Dependant Packages
| Name | Deps |
|---|---|
| ros2_medkit_integration_tests |
Launch files
Messages
Services
Plugins
Recent questions tagged ros2_medkit_graph_provider at Robotics Stack Exchange
Package Summary
| Version | 0.6.0 |
| License | Apache-2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/selfpatch/ros2_medkit.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- bburda
Authors
ros2_medkit_graph_provider
Gateway plugin that builds a live ROS 2 topic dataflow graph per SOVD Function,
enriched with frequency, latency, and drop-rate metrics sourced from /diagnostics.
This is the default IntrospectionProvider - extracted from ros2_medkit_gateway
into a standalone plugin package in v0.4.0.
What It Does
- Serves
GET /api/v1/functions/{function_id}/x-medkit-graph, plus a cyclic-subscription sampler under the same resource name and a capability href on every Function’s detail response. - Subscribes to
/diagnosticsand resolves the publishing node for each metrics sample (never a fabricated or hardcoded name). - Builds a per-Function graph of Apps (nodes) and topic connections (edges) with
per-edge frequency (Hz), latency (ms), and drop-rate (%) metrics. Drop-rate
degradation only fires if your producer actually emits
drop_rate_percent/drop_rate- the referencegreenwave_monitorproducer does not, so that rule is inert against it out of the box. - Reports
pipeline_status(healthy/degraded/broken) and, when degraded, thebottleneck_edge. - Flags each edge’s live publisher count (
publisher_count) and arate_ambiguouswarning when more than one publisher shares a topic, since the measured rate is then summed across publishers and can mask a slow pipeline as healthy.
The metrics require a real /diagnostics producer running elsewhere in your system -
see the Graph Provider tutorial
for the producer contract before doing anything else. Without one, every edge stays
pending forever.
Configuration
Loaded as a gateway plugin. gateway.launch.py auto-detects and loads this plugin
when the package is installed, with no configuration required. To load it manually:
plugins: ["graph_provider"]
plugins.graph_provider.path: "/path/to/lib/ros2_medkit_graph_provider/libros2_medkit_graph_provider_plugin.so"
plugins.graph_provider.expected_frequency_hz_default: 30.0
See the configuration reference for the full set of thresholds and per-function overrides.
Architecture
The plugin implements GatewayPlugin + IntrospectionProvider:
-
GraphProviderPlugin- Main plugin class with ROS 2 subscriptions -
GraphBuildState- Per-request snapshot of topic metrics and app last-seen timestamps -
GraphBuildConfig- Resolved thresholds (expected frequency, degradation, freshness)
Entity cache is populated from the ROS 2 graph during each discovery cycle
via the merge pipeline’s PluginLayer. The graph document itself is always rebuilt
fresh from the live entity cache on every request - there is no cross-request cache
to go stale.
Documentation
License
Apache License 2.0
Changelog for package ros2_medkit_graph_provider
Forthcoming
-
x-medkit-graphpipeline health rework:pipeline_statusno longer misreports"broken"for edges with no/diagnosticscoverage at all (the previous status model conflated "never observed" with "actively broken").error_reasonis now freshness-based and its only reachable value ismetrics_stale;node_offline,topic_stale, andno_data_sourceare gone.metrics.sourceis now the actual resolved/diagnosticspublisher node name (resolved per message via publisher GID matching against/diagnostics), omitted rather than hardcoded to"greenwave_monitor"when it cannot be resolved. Per-function threshold overrides (plugins.graph_provider.function_overrides.<function_id>.*) now take effect.schema_versionbumped to"2.0.0"(#545) - Robustness hardening for
x-medkit-graphhealth signals: freshness and staleness are now computed against a monotonic clock, so a backward wall-clock step (e.g. an NTP correction) can no longer make a dead topic read as fresh; a newstale_grace_secsetting (default2.0, per-function overridable) debounces a single late/diagnosticssample sopipeline_statusdoes not flap to"broken"and back; a newmulti_publisher_ratesetting (default"annotate", per-function overridable) defends against a duplicate or leftover publisher inflating a topic's summed arrival rate and masking a slow pipeline as healthy, backed by new per-edgemetrics.publisher_countandmetrics.rate_ambiguousfields;metrics.sourceis now cleared - not retained - whenever the most recent sample's publisher cannot be resolved, matching its documented latest-wins contract; and invalidplugins.graph_provider.*configuration, including per-function override field-name typos and wrong-typed values, now logs a warning and falls back to the previous valid value instead of failing silently (#545)
0.6.0 (2026-06-22)
- No functional changes; version bump for the coordinated 0.6.0 release.
- Contributors: \@bburda
0.5.0 (2026-06-08)
- Migrated
GraphProviderPluginto theget_routes()plugin API and fixed a route-separator bug - Added shutdown guards and
noexceptdestructors that reset rclcpp resources before member destruction, preventing teardown SIGSEGV - Added post-shutdown guard unit tests; dropped the cpp-httplib source
install from the Dockerfile (now vendored via
ros2_medkit_cmake) - Build: adopt the centralized
ROS2MedkitWarningscmake module - Contributors: \@bburda
0.4.0 (2026-03-20)
- Initial release - extracted from
ros2_medkit_gatewaypackage -
GraphProviderPluginfor ROS 2 graph-based entity introspection - Standalone external plugin package with independent build and test
- Locking support via
PluginContextAPI - Contributors: \@bburda
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| ros2_medkit_cmake | |
| ament_lint_auto | |
| ament_lint_common | |
| ament_cmake_clang_format | |
| ament_cmake_gtest | |
| rclcpp | |
| diagnostic_msgs | |
| ros2_medkit_gateway |
System Dependencies
| Name |
|---|
| nlohmann-json-dev |
Dependant Packages
| Name | Deps |
|---|---|
| ros2_medkit_integration_tests |
Launch files
Messages
Services
Plugins
Recent questions tagged ros2_medkit_graph_provider at Robotics Stack Exchange
Package Summary
| Version | 0.6.0 |
| License | Apache-2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/selfpatch/ros2_medkit.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- bburda
Authors
ros2_medkit_graph_provider
Gateway plugin that builds a live ROS 2 topic dataflow graph per SOVD Function,
enriched with frequency, latency, and drop-rate metrics sourced from /diagnostics.
This is the default IntrospectionProvider - extracted from ros2_medkit_gateway
into a standalone plugin package in v0.4.0.
What It Does
- Serves
GET /api/v1/functions/{function_id}/x-medkit-graph, plus a cyclic-subscription sampler under the same resource name and a capability href on every Function’s detail response. - Subscribes to
/diagnosticsand resolves the publishing node for each metrics sample (never a fabricated or hardcoded name). - Builds a per-Function graph of Apps (nodes) and topic connections (edges) with
per-edge frequency (Hz), latency (ms), and drop-rate (%) metrics. Drop-rate
degradation only fires if your producer actually emits
drop_rate_percent/drop_rate- the referencegreenwave_monitorproducer does not, so that rule is inert against it out of the box. - Reports
pipeline_status(healthy/degraded/broken) and, when degraded, thebottleneck_edge. - Flags each edge’s live publisher count (
publisher_count) and arate_ambiguouswarning when more than one publisher shares a topic, since the measured rate is then summed across publishers and can mask a slow pipeline as healthy.
The metrics require a real /diagnostics producer running elsewhere in your system -
see the Graph Provider tutorial
for the producer contract before doing anything else. Without one, every edge stays
pending forever.
Configuration
Loaded as a gateway plugin. gateway.launch.py auto-detects and loads this plugin
when the package is installed, with no configuration required. To load it manually:
plugins: ["graph_provider"]
plugins.graph_provider.path: "/path/to/lib/ros2_medkit_graph_provider/libros2_medkit_graph_provider_plugin.so"
plugins.graph_provider.expected_frequency_hz_default: 30.0
See the configuration reference for the full set of thresholds and per-function overrides.
Architecture
The plugin implements GatewayPlugin + IntrospectionProvider:
-
GraphProviderPlugin- Main plugin class with ROS 2 subscriptions -
GraphBuildState- Per-request snapshot of topic metrics and app last-seen timestamps -
GraphBuildConfig- Resolved thresholds (expected frequency, degradation, freshness)
Entity cache is populated from the ROS 2 graph during each discovery cycle
via the merge pipeline’s PluginLayer. The graph document itself is always rebuilt
fresh from the live entity cache on every request - there is no cross-request cache
to go stale.
Documentation
License
Apache License 2.0
Changelog for package ros2_medkit_graph_provider
Forthcoming
-
x-medkit-graphpipeline health rework:pipeline_statusno longer misreports"broken"for edges with no/diagnosticscoverage at all (the previous status model conflated "never observed" with "actively broken").error_reasonis now freshness-based and its only reachable value ismetrics_stale;node_offline,topic_stale, andno_data_sourceare gone.metrics.sourceis now the actual resolved/diagnosticspublisher node name (resolved per message via publisher GID matching against/diagnostics), omitted rather than hardcoded to"greenwave_monitor"when it cannot be resolved. Per-function threshold overrides (plugins.graph_provider.function_overrides.<function_id>.*) now take effect.schema_versionbumped to"2.0.0"(#545) - Robustness hardening for
x-medkit-graphhealth signals: freshness and staleness are now computed against a monotonic clock, so a backward wall-clock step (e.g. an NTP correction) can no longer make a dead topic read as fresh; a newstale_grace_secsetting (default2.0, per-function overridable) debounces a single late/diagnosticssample sopipeline_statusdoes not flap to"broken"and back; a newmulti_publisher_ratesetting (default"annotate", per-function overridable) defends against a duplicate or leftover publisher inflating a topic's summed arrival rate and masking a slow pipeline as healthy, backed by new per-edgemetrics.publisher_countandmetrics.rate_ambiguousfields;metrics.sourceis now cleared - not retained - whenever the most recent sample's publisher cannot be resolved, matching its documented latest-wins contract; and invalidplugins.graph_provider.*configuration, including per-function override field-name typos and wrong-typed values, now logs a warning and falls back to the previous valid value instead of failing silently (#545)
0.6.0 (2026-06-22)
- No functional changes; version bump for the coordinated 0.6.0 release.
- Contributors: \@bburda
0.5.0 (2026-06-08)
- Migrated
GraphProviderPluginto theget_routes()plugin API and fixed a route-separator bug - Added shutdown guards and
noexceptdestructors that reset rclcpp resources before member destruction, preventing teardown SIGSEGV - Added post-shutdown guard unit tests; dropped the cpp-httplib source
install from the Dockerfile (now vendored via
ros2_medkit_cmake) - Build: adopt the centralized
ROS2MedkitWarningscmake module - Contributors: \@bburda
0.4.0 (2026-03-20)
- Initial release - extracted from
ros2_medkit_gatewaypackage -
GraphProviderPluginfor ROS 2 graph-based entity introspection - Standalone external plugin package with independent build and test
- Locking support via
PluginContextAPI - Contributors: \@bburda
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| ros2_medkit_cmake | |
| ament_lint_auto | |
| ament_lint_common | |
| ament_cmake_clang_format | |
| ament_cmake_gtest | |
| rclcpp | |
| diagnostic_msgs | |
| ros2_medkit_gateway |
System Dependencies
| Name |
|---|
| nlohmann-json-dev |
Dependant Packages
| Name | Deps |
|---|---|
| ros2_medkit_integration_tests |
Launch files
Messages
Services
Plugins
Recent questions tagged ros2_medkit_graph_provider at Robotics Stack Exchange
Package Summary
| Version | 0.6.0 |
| License | Apache-2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/selfpatch/ros2_medkit.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- bburda
Authors
ros2_medkit_graph_provider
Gateway plugin that builds a live ROS 2 topic dataflow graph per SOVD Function,
enriched with frequency, latency, and drop-rate metrics sourced from /diagnostics.
This is the default IntrospectionProvider - extracted from ros2_medkit_gateway
into a standalone plugin package in v0.4.0.
What It Does
- Serves
GET /api/v1/functions/{function_id}/x-medkit-graph, plus a cyclic-subscription sampler under the same resource name and a capability href on every Function’s detail response. - Subscribes to
/diagnosticsand resolves the publishing node for each metrics sample (never a fabricated or hardcoded name). - Builds a per-Function graph of Apps (nodes) and topic connections (edges) with
per-edge frequency (Hz), latency (ms), and drop-rate (%) metrics. Drop-rate
degradation only fires if your producer actually emits
drop_rate_percent/drop_rate- the referencegreenwave_monitorproducer does not, so that rule is inert against it out of the box. - Reports
pipeline_status(healthy/degraded/broken) and, when degraded, thebottleneck_edge. - Flags each edge’s live publisher count (
publisher_count) and arate_ambiguouswarning when more than one publisher shares a topic, since the measured rate is then summed across publishers and can mask a slow pipeline as healthy.
The metrics require a real /diagnostics producer running elsewhere in your system -
see the Graph Provider tutorial
for the producer contract before doing anything else. Without one, every edge stays
pending forever.
Configuration
Loaded as a gateway plugin. gateway.launch.py auto-detects and loads this plugin
when the package is installed, with no configuration required. To load it manually:
plugins: ["graph_provider"]
plugins.graph_provider.path: "/path/to/lib/ros2_medkit_graph_provider/libros2_medkit_graph_provider_plugin.so"
plugins.graph_provider.expected_frequency_hz_default: 30.0
See the configuration reference for the full set of thresholds and per-function overrides.
Architecture
The plugin implements GatewayPlugin + IntrospectionProvider:
-
GraphProviderPlugin- Main plugin class with ROS 2 subscriptions -
GraphBuildState- Per-request snapshot of topic metrics and app last-seen timestamps -
GraphBuildConfig- Resolved thresholds (expected frequency, degradation, freshness)
Entity cache is populated from the ROS 2 graph during each discovery cycle
via the merge pipeline’s PluginLayer. The graph document itself is always rebuilt
fresh from the live entity cache on every request - there is no cross-request cache
to go stale.
Documentation
License
Apache License 2.0
Changelog for package ros2_medkit_graph_provider
Forthcoming
-
x-medkit-graphpipeline health rework:pipeline_statusno longer misreports"broken"for edges with no/diagnosticscoverage at all (the previous status model conflated "never observed" with "actively broken").error_reasonis now freshness-based and its only reachable value ismetrics_stale;node_offline,topic_stale, andno_data_sourceare gone.metrics.sourceis now the actual resolved/diagnosticspublisher node name (resolved per message via publisher GID matching against/diagnostics), omitted rather than hardcoded to"greenwave_monitor"when it cannot be resolved. Per-function threshold overrides (plugins.graph_provider.function_overrides.<function_id>.*) now take effect.schema_versionbumped to"2.0.0"(#545) - Robustness hardening for
x-medkit-graphhealth signals: freshness and staleness are now computed against a monotonic clock, so a backward wall-clock step (e.g. an NTP correction) can no longer make a dead topic read as fresh; a newstale_grace_secsetting (default2.0, per-function overridable) debounces a single late/diagnosticssample sopipeline_statusdoes not flap to"broken"and back; a newmulti_publisher_ratesetting (default"annotate", per-function overridable) defends against a duplicate or leftover publisher inflating a topic's summed arrival rate and masking a slow pipeline as healthy, backed by new per-edgemetrics.publisher_countandmetrics.rate_ambiguousfields;metrics.sourceis now cleared - not retained - whenever the most recent sample's publisher cannot be resolved, matching its documented latest-wins contract; and invalidplugins.graph_provider.*configuration, including per-function override field-name typos and wrong-typed values, now logs a warning and falls back to the previous valid value instead of failing silently (#545)
0.6.0 (2026-06-22)
- No functional changes; version bump for the coordinated 0.6.0 release.
- Contributors: \@bburda
0.5.0 (2026-06-08)
- Migrated
GraphProviderPluginto theget_routes()plugin API and fixed a route-separator bug - Added shutdown guards and
noexceptdestructors that reset rclcpp resources before member destruction, preventing teardown SIGSEGV - Added post-shutdown guard unit tests; dropped the cpp-httplib source
install from the Dockerfile (now vendored via
ros2_medkit_cmake) - Build: adopt the centralized
ROS2MedkitWarningscmake module - Contributors: \@bburda
0.4.0 (2026-03-20)
- Initial release - extracted from
ros2_medkit_gatewaypackage -
GraphProviderPluginfor ROS 2 graph-based entity introspection - Standalone external plugin package with independent build and test
- Locking support via
PluginContextAPI - Contributors: \@bburda
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| ros2_medkit_cmake | |
| ament_lint_auto | |
| ament_lint_common | |
| ament_cmake_clang_format | |
| ament_cmake_gtest | |
| rclcpp | |
| diagnostic_msgs | |
| ros2_medkit_gateway |
System Dependencies
| Name |
|---|
| nlohmann-json-dev |
Dependant Packages
| Name | Deps |
|---|---|
| ros2_medkit_integration_tests |
Launch files
Messages
Services
Plugins
Recent questions tagged ros2_medkit_graph_provider at Robotics Stack Exchange
Package Summary
| Version | 0.6.0 |
| License | Apache-2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/selfpatch/ros2_medkit.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- bburda
Authors
ros2_medkit_graph_provider
Gateway plugin that builds a live ROS 2 topic dataflow graph per SOVD Function,
enriched with frequency, latency, and drop-rate metrics sourced from /diagnostics.
This is the default IntrospectionProvider - extracted from ros2_medkit_gateway
into a standalone plugin package in v0.4.0.
What It Does
- Serves
GET /api/v1/functions/{function_id}/x-medkit-graph, plus a cyclic-subscription sampler under the same resource name and a capability href on every Function’s detail response. - Subscribes to
/diagnosticsand resolves the publishing node for each metrics sample (never a fabricated or hardcoded name). - Builds a per-Function graph of Apps (nodes) and topic connections (edges) with
per-edge frequency (Hz), latency (ms), and drop-rate (%) metrics. Drop-rate
degradation only fires if your producer actually emits
drop_rate_percent/drop_rate- the referencegreenwave_monitorproducer does not, so that rule is inert against it out of the box. - Reports
pipeline_status(healthy/degraded/broken) and, when degraded, thebottleneck_edge. - Flags each edge’s live publisher count (
publisher_count) and arate_ambiguouswarning when more than one publisher shares a topic, since the measured rate is then summed across publishers and can mask a slow pipeline as healthy.
The metrics require a real /diagnostics producer running elsewhere in your system -
see the Graph Provider tutorial
for the producer contract before doing anything else. Without one, every edge stays
pending forever.
Configuration
Loaded as a gateway plugin. gateway.launch.py auto-detects and loads this plugin
when the package is installed, with no configuration required. To load it manually:
plugins: ["graph_provider"]
plugins.graph_provider.path: "/path/to/lib/ros2_medkit_graph_provider/libros2_medkit_graph_provider_plugin.so"
plugins.graph_provider.expected_frequency_hz_default: 30.0
See the configuration reference for the full set of thresholds and per-function overrides.
Architecture
The plugin implements GatewayPlugin + IntrospectionProvider:
-
GraphProviderPlugin- Main plugin class with ROS 2 subscriptions -
GraphBuildState- Per-request snapshot of topic metrics and app last-seen timestamps -
GraphBuildConfig- Resolved thresholds (expected frequency, degradation, freshness)
Entity cache is populated from the ROS 2 graph during each discovery cycle
via the merge pipeline’s PluginLayer. The graph document itself is always rebuilt
fresh from the live entity cache on every request - there is no cross-request cache
to go stale.
Documentation
License
Apache License 2.0
Changelog for package ros2_medkit_graph_provider
Forthcoming
-
x-medkit-graphpipeline health rework:pipeline_statusno longer misreports"broken"for edges with no/diagnosticscoverage at all (the previous status model conflated "never observed" with "actively broken").error_reasonis now freshness-based and its only reachable value ismetrics_stale;node_offline,topic_stale, andno_data_sourceare gone.metrics.sourceis now the actual resolved/diagnosticspublisher node name (resolved per message via publisher GID matching against/diagnostics), omitted rather than hardcoded to"greenwave_monitor"when it cannot be resolved. Per-function threshold overrides (plugins.graph_provider.function_overrides.<function_id>.*) now take effect.schema_versionbumped to"2.0.0"(#545) - Robustness hardening for
x-medkit-graphhealth signals: freshness and staleness are now computed against a monotonic clock, so a backward wall-clock step (e.g. an NTP correction) can no longer make a dead topic read as fresh; a newstale_grace_secsetting (default2.0, per-function overridable) debounces a single late/diagnosticssample sopipeline_statusdoes not flap to"broken"and back; a newmulti_publisher_ratesetting (default"annotate", per-function overridable) defends against a duplicate or leftover publisher inflating a topic's summed arrival rate and masking a slow pipeline as healthy, backed by new per-edgemetrics.publisher_countandmetrics.rate_ambiguousfields;metrics.sourceis now cleared - not retained - whenever the most recent sample's publisher cannot be resolved, matching its documented latest-wins contract; and invalidplugins.graph_provider.*configuration, including per-function override field-name typos and wrong-typed values, now logs a warning and falls back to the previous valid value instead of failing silently (#545)
0.6.0 (2026-06-22)
- No functional changes; version bump for the coordinated 0.6.0 release.
- Contributors: \@bburda
0.5.0 (2026-06-08)
- Migrated
GraphProviderPluginto theget_routes()plugin API and fixed a route-separator bug - Added shutdown guards and
noexceptdestructors that reset rclcpp resources before member destruction, preventing teardown SIGSEGV - Added post-shutdown guard unit tests; dropped the cpp-httplib source
install from the Dockerfile (now vendored via
ros2_medkit_cmake) - Build: adopt the centralized
ROS2MedkitWarningscmake module - Contributors: \@bburda
0.4.0 (2026-03-20)
- Initial release - extracted from
ros2_medkit_gatewaypackage -
GraphProviderPluginfor ROS 2 graph-based entity introspection - Standalone external plugin package with independent build and test
- Locking support via
PluginContextAPI - Contributors: \@bburda
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| ros2_medkit_cmake | |
| ament_lint_auto | |
| ament_lint_common | |
| ament_cmake_clang_format | |
| ament_cmake_gtest | |
| rclcpp | |
| diagnostic_msgs | |
| ros2_medkit_gateway |
System Dependencies
| Name |
|---|
| nlohmann-json-dev |
Dependant Packages
| Name | Deps |
|---|---|
| ros2_medkit_integration_tests |
Launch files
Messages
Services
Plugins
Recent questions tagged ros2_medkit_graph_provider at Robotics Stack Exchange
Package Summary
| Version | 0.6.0 |
| License | Apache-2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/selfpatch/ros2_medkit.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- bburda
Authors
ros2_medkit_graph_provider
Gateway plugin that builds a live ROS 2 topic dataflow graph per SOVD Function,
enriched with frequency, latency, and drop-rate metrics sourced from /diagnostics.
This is the default IntrospectionProvider - extracted from ros2_medkit_gateway
into a standalone plugin package in v0.4.0.
What It Does
- Serves
GET /api/v1/functions/{function_id}/x-medkit-graph, plus a cyclic-subscription sampler under the same resource name and a capability href on every Function’s detail response. - Subscribes to
/diagnosticsand resolves the publishing node for each metrics sample (never a fabricated or hardcoded name). - Builds a per-Function graph of Apps (nodes) and topic connections (edges) with
per-edge frequency (Hz), latency (ms), and drop-rate (%) metrics. Drop-rate
degradation only fires if your producer actually emits
drop_rate_percent/drop_rate- the referencegreenwave_monitorproducer does not, so that rule is inert against it out of the box. - Reports
pipeline_status(healthy/degraded/broken) and, when degraded, thebottleneck_edge. - Flags each edge’s live publisher count (
publisher_count) and arate_ambiguouswarning when more than one publisher shares a topic, since the measured rate is then summed across publishers and can mask a slow pipeline as healthy.
The metrics require a real /diagnostics producer running elsewhere in your system -
see the Graph Provider tutorial
for the producer contract before doing anything else. Without one, every edge stays
pending forever.
Configuration
Loaded as a gateway plugin. gateway.launch.py auto-detects and loads this plugin
when the package is installed, with no configuration required. To load it manually:
plugins: ["graph_provider"]
plugins.graph_provider.path: "/path/to/lib/ros2_medkit_graph_provider/libros2_medkit_graph_provider_plugin.so"
plugins.graph_provider.expected_frequency_hz_default: 30.0
See the configuration reference for the full set of thresholds and per-function overrides.
Architecture
The plugin implements GatewayPlugin + IntrospectionProvider:
-
GraphProviderPlugin- Main plugin class with ROS 2 subscriptions -
GraphBuildState- Per-request snapshot of topic metrics and app last-seen timestamps -
GraphBuildConfig- Resolved thresholds (expected frequency, degradation, freshness)
Entity cache is populated from the ROS 2 graph during each discovery cycle
via the merge pipeline’s PluginLayer. The graph document itself is always rebuilt
fresh from the live entity cache on every request - there is no cross-request cache
to go stale.
Documentation
License
Apache License 2.0
Changelog for package ros2_medkit_graph_provider
Forthcoming
-
x-medkit-graphpipeline health rework:pipeline_statusno longer misreports"broken"for edges with no/diagnosticscoverage at all (the previous status model conflated "never observed" with "actively broken").error_reasonis now freshness-based and its only reachable value ismetrics_stale;node_offline,topic_stale, andno_data_sourceare gone.metrics.sourceis now the actual resolved/diagnosticspublisher node name (resolved per message via publisher GID matching against/diagnostics), omitted rather than hardcoded to"greenwave_monitor"when it cannot be resolved. Per-function threshold overrides (plugins.graph_provider.function_overrides.<function_id>.*) now take effect.schema_versionbumped to"2.0.0"(#545) - Robustness hardening for
x-medkit-graphhealth signals: freshness and staleness are now computed against a monotonic clock, so a backward wall-clock step (e.g. an NTP correction) can no longer make a dead topic read as fresh; a newstale_grace_secsetting (default2.0, per-function overridable) debounces a single late/diagnosticssample sopipeline_statusdoes not flap to"broken"and back; a newmulti_publisher_ratesetting (default"annotate", per-function overridable) defends against a duplicate or leftover publisher inflating a topic's summed arrival rate and masking a slow pipeline as healthy, backed by new per-edgemetrics.publisher_countandmetrics.rate_ambiguousfields;metrics.sourceis now cleared - not retained - whenever the most recent sample's publisher cannot be resolved, matching its documented latest-wins contract; and invalidplugins.graph_provider.*configuration, including per-function override field-name typos and wrong-typed values, now logs a warning and falls back to the previous valid value instead of failing silently (#545)
0.6.0 (2026-06-22)
- No functional changes; version bump for the coordinated 0.6.0 release.
- Contributors: \@bburda
0.5.0 (2026-06-08)
- Migrated
GraphProviderPluginto theget_routes()plugin API and fixed a route-separator bug - Added shutdown guards and
noexceptdestructors that reset rclcpp resources before member destruction, preventing teardown SIGSEGV - Added post-shutdown guard unit tests; dropped the cpp-httplib source
install from the Dockerfile (now vendored via
ros2_medkit_cmake) - Build: adopt the centralized
ROS2MedkitWarningscmake module - Contributors: \@bburda
0.4.0 (2026-03-20)
- Initial release - extracted from
ros2_medkit_gatewaypackage -
GraphProviderPluginfor ROS 2 graph-based entity introspection - Standalone external plugin package with independent build and test
- Locking support via
PluginContextAPI - Contributors: \@bburda
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| ros2_medkit_cmake | |
| ament_lint_auto | |
| ament_lint_common | |
| ament_cmake_clang_format | |
| ament_cmake_gtest | |
| rclcpp | |
| diagnostic_msgs | |
| ros2_medkit_gateway |
System Dependencies
| Name |
|---|
| nlohmann-json-dev |
Dependant Packages
| Name | Deps |
|---|---|
| ros2_medkit_integration_tests |
Launch files
Messages
Services
Plugins
Recent questions tagged ros2_medkit_graph_provider at Robotics Stack Exchange
Package Summary
| Version | 0.6.0 |
| License | Apache-2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/selfpatch/ros2_medkit.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- bburda
Authors
ros2_medkit_graph_provider
Gateway plugin that builds a live ROS 2 topic dataflow graph per SOVD Function,
enriched with frequency, latency, and drop-rate metrics sourced from /diagnostics.
This is the default IntrospectionProvider - extracted from ros2_medkit_gateway
into a standalone plugin package in v0.4.0.
What It Does
- Serves
GET /api/v1/functions/{function_id}/x-medkit-graph, plus a cyclic-subscription sampler under the same resource name and a capability href on every Function’s detail response. - Subscribes to
/diagnosticsand resolves the publishing node for each metrics sample (never a fabricated or hardcoded name). - Builds a per-Function graph of Apps (nodes) and topic connections (edges) with
per-edge frequency (Hz), latency (ms), and drop-rate (%) metrics. Drop-rate
degradation only fires if your producer actually emits
drop_rate_percent/drop_rate- the referencegreenwave_monitorproducer does not, so that rule is inert against it out of the box. - Reports
pipeline_status(healthy/degraded/broken) and, when degraded, thebottleneck_edge. - Flags each edge’s live publisher count (
publisher_count) and arate_ambiguouswarning when more than one publisher shares a topic, since the measured rate is then summed across publishers and can mask a slow pipeline as healthy.
The metrics require a real /diagnostics producer running elsewhere in your system -
see the Graph Provider tutorial
for the producer contract before doing anything else. Without one, every edge stays
pending forever.
Configuration
Loaded as a gateway plugin. gateway.launch.py auto-detects and loads this plugin
when the package is installed, with no configuration required. To load it manually:
plugins: ["graph_provider"]
plugins.graph_provider.path: "/path/to/lib/ros2_medkit_graph_provider/libros2_medkit_graph_provider_plugin.so"
plugins.graph_provider.expected_frequency_hz_default: 30.0
See the configuration reference for the full set of thresholds and per-function overrides.
Architecture
The plugin implements GatewayPlugin + IntrospectionProvider:
-
GraphProviderPlugin- Main plugin class with ROS 2 subscriptions -
GraphBuildState- Per-request snapshot of topic metrics and app last-seen timestamps -
GraphBuildConfig- Resolved thresholds (expected frequency, degradation, freshness)
Entity cache is populated from the ROS 2 graph during each discovery cycle
via the merge pipeline’s PluginLayer. The graph document itself is always rebuilt
fresh from the live entity cache on every request - there is no cross-request cache
to go stale.
Documentation
License
Apache License 2.0
Changelog for package ros2_medkit_graph_provider
Forthcoming
-
x-medkit-graphpipeline health rework:pipeline_statusno longer misreports"broken"for edges with no/diagnosticscoverage at all (the previous status model conflated "never observed" with "actively broken").error_reasonis now freshness-based and its only reachable value ismetrics_stale;node_offline,topic_stale, andno_data_sourceare gone.metrics.sourceis now the actual resolved/diagnosticspublisher node name (resolved per message via publisher GID matching against/diagnostics), omitted rather than hardcoded to"greenwave_monitor"when it cannot be resolved. Per-function threshold overrides (plugins.graph_provider.function_overrides.<function_id>.*) now take effect.schema_versionbumped to"2.0.0"(#545) - Robustness hardening for
x-medkit-graphhealth signals: freshness and staleness are now computed against a monotonic clock, so a backward wall-clock step (e.g. an NTP correction) can no longer make a dead topic read as fresh; a newstale_grace_secsetting (default2.0, per-function overridable) debounces a single late/diagnosticssample sopipeline_statusdoes not flap to"broken"and back; a newmulti_publisher_ratesetting (default"annotate", per-function overridable) defends against a duplicate or leftover publisher inflating a topic's summed arrival rate and masking a slow pipeline as healthy, backed by new per-edgemetrics.publisher_countandmetrics.rate_ambiguousfields;metrics.sourceis now cleared - not retained - whenever the most recent sample's publisher cannot be resolved, matching its documented latest-wins contract; and invalidplugins.graph_provider.*configuration, including per-function override field-name typos and wrong-typed values, now logs a warning and falls back to the previous valid value instead of failing silently (#545)
0.6.0 (2026-06-22)
- No functional changes; version bump for the coordinated 0.6.0 release.
- Contributors: \@bburda
0.5.0 (2026-06-08)
- Migrated
GraphProviderPluginto theget_routes()plugin API and fixed a route-separator bug - Added shutdown guards and
noexceptdestructors that reset rclcpp resources before member destruction, preventing teardown SIGSEGV - Added post-shutdown guard unit tests; dropped the cpp-httplib source
install from the Dockerfile (now vendored via
ros2_medkit_cmake) - Build: adopt the centralized
ROS2MedkitWarningscmake module - Contributors: \@bburda
0.4.0 (2026-03-20)
- Initial release - extracted from
ros2_medkit_gatewaypackage -
GraphProviderPluginfor ROS 2 graph-based entity introspection - Standalone external plugin package with independent build and test
- Locking support via
PluginContextAPI - Contributors: \@bburda
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| ros2_medkit_cmake | |
| ament_lint_auto | |
| ament_lint_common | |
| ament_cmake_clang_format | |
| ament_cmake_gtest | |
| rclcpp | |
| diagnostic_msgs | |
| ros2_medkit_gateway |
System Dependencies
| Name |
|---|
| nlohmann-json-dev |
Dependant Packages
| Name | Deps |
|---|---|
| ros2_medkit_integration_tests |
Launch files
Messages
Services
Plugins
Recent questions tagged ros2_medkit_graph_provider at Robotics Stack Exchange
Package Summary
| Version | 0.6.0 |
| License | Apache-2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/selfpatch/ros2_medkit.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- bburda
Authors
ros2_medkit_graph_provider
Gateway plugin that builds a live ROS 2 topic dataflow graph per SOVD Function,
enriched with frequency, latency, and drop-rate metrics sourced from /diagnostics.
This is the default IntrospectionProvider - extracted from ros2_medkit_gateway
into a standalone plugin package in v0.4.0.
What It Does
- Serves
GET /api/v1/functions/{function_id}/x-medkit-graph, plus a cyclic-subscription sampler under the same resource name and a capability href on every Function’s detail response. - Subscribes to
/diagnosticsand resolves the publishing node for each metrics sample (never a fabricated or hardcoded name). - Builds a per-Function graph of Apps (nodes) and topic connections (edges) with
per-edge frequency (Hz), latency (ms), and drop-rate (%) metrics. Drop-rate
degradation only fires if your producer actually emits
drop_rate_percent/drop_rate- the referencegreenwave_monitorproducer does not, so that rule is inert against it out of the box. - Reports
pipeline_status(healthy/degraded/broken) and, when degraded, thebottleneck_edge. - Flags each edge’s live publisher count (
publisher_count) and arate_ambiguouswarning when more than one publisher shares a topic, since the measured rate is then summed across publishers and can mask a slow pipeline as healthy.
The metrics require a real /diagnostics producer running elsewhere in your system -
see the Graph Provider tutorial
for the producer contract before doing anything else. Without one, every edge stays
pending forever.
Configuration
Loaded as a gateway plugin. gateway.launch.py auto-detects and loads this plugin
when the package is installed, with no configuration required. To load it manually:
plugins: ["graph_provider"]
plugins.graph_provider.path: "/path/to/lib/ros2_medkit_graph_provider/libros2_medkit_graph_provider_plugin.so"
plugins.graph_provider.expected_frequency_hz_default: 30.0
See the configuration reference for the full set of thresholds and per-function overrides.
Architecture
The plugin implements GatewayPlugin + IntrospectionProvider:
-
GraphProviderPlugin- Main plugin class with ROS 2 subscriptions -
GraphBuildState- Per-request snapshot of topic metrics and app last-seen timestamps -
GraphBuildConfig- Resolved thresholds (expected frequency, degradation, freshness)
Entity cache is populated from the ROS 2 graph during each discovery cycle
via the merge pipeline’s PluginLayer. The graph document itself is always rebuilt
fresh from the live entity cache on every request - there is no cross-request cache
to go stale.
Documentation
License
Apache License 2.0
Changelog for package ros2_medkit_graph_provider
Forthcoming
-
x-medkit-graphpipeline health rework:pipeline_statusno longer misreports"broken"for edges with no/diagnosticscoverage at all (the previous status model conflated "never observed" with "actively broken").error_reasonis now freshness-based and its only reachable value ismetrics_stale;node_offline,topic_stale, andno_data_sourceare gone.metrics.sourceis now the actual resolved/diagnosticspublisher node name (resolved per message via publisher GID matching against/diagnostics), omitted rather than hardcoded to"greenwave_monitor"when it cannot be resolved. Per-function threshold overrides (plugins.graph_provider.function_overrides.<function_id>.*) now take effect.schema_versionbumped to"2.0.0"(#545) - Robustness hardening for
x-medkit-graphhealth signals: freshness and staleness are now computed against a monotonic clock, so a backward wall-clock step (e.g. an NTP correction) can no longer make a dead topic read as fresh; a newstale_grace_secsetting (default2.0, per-function overridable) debounces a single late/diagnosticssample sopipeline_statusdoes not flap to"broken"and back; a newmulti_publisher_ratesetting (default"annotate", per-function overridable) defends against a duplicate or leftover publisher inflating a topic's summed arrival rate and masking a slow pipeline as healthy, backed by new per-edgemetrics.publisher_countandmetrics.rate_ambiguousfields;metrics.sourceis now cleared - not retained - whenever the most recent sample's publisher cannot be resolved, matching its documented latest-wins contract; and invalidplugins.graph_provider.*configuration, including per-function override field-name typos and wrong-typed values, now logs a warning and falls back to the previous valid value instead of failing silently (#545)
0.6.0 (2026-06-22)
- No functional changes; version bump for the coordinated 0.6.0 release.
- Contributors: \@bburda
0.5.0 (2026-06-08)
- Migrated
GraphProviderPluginto theget_routes()plugin API and fixed a route-separator bug - Added shutdown guards and
noexceptdestructors that reset rclcpp resources before member destruction, preventing teardown SIGSEGV - Added post-shutdown guard unit tests; dropped the cpp-httplib source
install from the Dockerfile (now vendored via
ros2_medkit_cmake) - Build: adopt the centralized
ROS2MedkitWarningscmake module - Contributors: \@bburda
0.4.0 (2026-03-20)
- Initial release - extracted from
ros2_medkit_gatewaypackage -
GraphProviderPluginfor ROS 2 graph-based entity introspection - Standalone external plugin package with independent build and test
- Locking support via
PluginContextAPI - Contributors: \@bburda
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| ros2_medkit_cmake | |
| ament_lint_auto | |
| ament_lint_common | |
| ament_cmake_clang_format | |
| ament_cmake_gtest | |
| rclcpp | |
| diagnostic_msgs | |
| ros2_medkit_gateway |
System Dependencies
| Name |
|---|
| nlohmann-json-dev |
Dependant Packages
| Name | Deps |
|---|---|
| ros2_medkit_integration_tests |
Launch files
Messages
Services
Plugins
Recent questions tagged ros2_medkit_graph_provider at Robotics Stack Exchange
Package Summary
| Version | 0.6.0 |
| License | Apache-2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/selfpatch/ros2_medkit.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- bburda
Authors
ros2_medkit_graph_provider
Gateway plugin that builds a live ROS 2 topic dataflow graph per SOVD Function,
enriched with frequency, latency, and drop-rate metrics sourced from /diagnostics.
This is the default IntrospectionProvider - extracted from ros2_medkit_gateway
into a standalone plugin package in v0.4.0.
What It Does
- Serves
GET /api/v1/functions/{function_id}/x-medkit-graph, plus a cyclic-subscription sampler under the same resource name and a capability href on every Function’s detail response. - Subscribes to
/diagnosticsand resolves the publishing node for each metrics sample (never a fabricated or hardcoded name). - Builds a per-Function graph of Apps (nodes) and topic connections (edges) with
per-edge frequency (Hz), latency (ms), and drop-rate (%) metrics. Drop-rate
degradation only fires if your producer actually emits
drop_rate_percent/drop_rate- the referencegreenwave_monitorproducer does not, so that rule is inert against it out of the box. - Reports
pipeline_status(healthy/degraded/broken) and, when degraded, thebottleneck_edge. - Flags each edge’s live publisher count (
publisher_count) and arate_ambiguouswarning when more than one publisher shares a topic, since the measured rate is then summed across publishers and can mask a slow pipeline as healthy.
The metrics require a real /diagnostics producer running elsewhere in your system -
see the Graph Provider tutorial
for the producer contract before doing anything else. Without one, every edge stays
pending forever.
Configuration
Loaded as a gateway plugin. gateway.launch.py auto-detects and loads this plugin
when the package is installed, with no configuration required. To load it manually:
plugins: ["graph_provider"]
plugins.graph_provider.path: "/path/to/lib/ros2_medkit_graph_provider/libros2_medkit_graph_provider_plugin.so"
plugins.graph_provider.expected_frequency_hz_default: 30.0
See the configuration reference for the full set of thresholds and per-function overrides.
Architecture
The plugin implements GatewayPlugin + IntrospectionProvider:
-
GraphProviderPlugin- Main plugin class with ROS 2 subscriptions -
GraphBuildState- Per-request snapshot of topic metrics and app last-seen timestamps -
GraphBuildConfig- Resolved thresholds (expected frequency, degradation, freshness)
Entity cache is populated from the ROS 2 graph during each discovery cycle
via the merge pipeline’s PluginLayer. The graph document itself is always rebuilt
fresh from the live entity cache on every request - there is no cross-request cache
to go stale.
Documentation
License
Apache License 2.0
Changelog for package ros2_medkit_graph_provider
Forthcoming
-
x-medkit-graphpipeline health rework:pipeline_statusno longer misreports"broken"for edges with no/diagnosticscoverage at all (the previous status model conflated "never observed" with "actively broken").error_reasonis now freshness-based and its only reachable value ismetrics_stale;node_offline,topic_stale, andno_data_sourceare gone.metrics.sourceis now the actual resolved/diagnosticspublisher node name (resolved per message via publisher GID matching against/diagnostics), omitted rather than hardcoded to"greenwave_monitor"when it cannot be resolved. Per-function threshold overrides (plugins.graph_provider.function_overrides.<function_id>.*) now take effect.schema_versionbumped to"2.0.0"(#545) - Robustness hardening for
x-medkit-graphhealth signals: freshness and staleness are now computed against a monotonic clock, so a backward wall-clock step (e.g. an NTP correction) can no longer make a dead topic read as fresh; a newstale_grace_secsetting (default2.0, per-function overridable) debounces a single late/diagnosticssample sopipeline_statusdoes not flap to"broken"and back; a newmulti_publisher_ratesetting (default"annotate", per-function overridable) defends against a duplicate or leftover publisher inflating a topic's summed arrival rate and masking a slow pipeline as healthy, backed by new per-edgemetrics.publisher_countandmetrics.rate_ambiguousfields;metrics.sourceis now cleared - not retained - whenever the most recent sample's publisher cannot be resolved, matching its documented latest-wins contract; and invalidplugins.graph_provider.*configuration, including per-function override field-name typos and wrong-typed values, now logs a warning and falls back to the previous valid value instead of failing silently (#545)
0.6.0 (2026-06-22)
- No functional changes; version bump for the coordinated 0.6.0 release.
- Contributors: \@bburda
0.5.0 (2026-06-08)
- Migrated
GraphProviderPluginto theget_routes()plugin API and fixed a route-separator bug - Added shutdown guards and
noexceptdestructors that reset rclcpp resources before member destruction, preventing teardown SIGSEGV - Added post-shutdown guard unit tests; dropped the cpp-httplib source
install from the Dockerfile (now vendored via
ros2_medkit_cmake) - Build: adopt the centralized
ROS2MedkitWarningscmake module - Contributors: \@bburda
0.4.0 (2026-03-20)
- Initial release - extracted from
ros2_medkit_gatewaypackage -
GraphProviderPluginfor ROS 2 graph-based entity introspection - Standalone external plugin package with independent build and test
- Locking support via
PluginContextAPI - Contributors: \@bburda
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| ros2_medkit_cmake | |
| ament_lint_auto | |
| ament_lint_common | |
| ament_cmake_clang_format | |
| ament_cmake_gtest | |
| rclcpp | |
| diagnostic_msgs | |
| ros2_medkit_gateway |
System Dependencies
| Name |
|---|
| nlohmann-json-dev |
Dependant Packages
| Name | Deps |
|---|---|
| ros2_medkit_integration_tests |
Launch files
Messages
Services
Plugins
Recent questions tagged ros2_medkit_graph_provider at Robotics Stack Exchange
Package Summary
| Version | 0.6.0 |
| License | Apache-2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/selfpatch/ros2_medkit.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- bburda
Authors
ros2_medkit_graph_provider
Gateway plugin that builds a live ROS 2 topic dataflow graph per SOVD Function,
enriched with frequency, latency, and drop-rate metrics sourced from /diagnostics.
This is the default IntrospectionProvider - extracted from ros2_medkit_gateway
into a standalone plugin package in v0.4.0.
What It Does
- Serves
GET /api/v1/functions/{function_id}/x-medkit-graph, plus a cyclic-subscription sampler under the same resource name and a capability href on every Function’s detail response. - Subscribes to
/diagnosticsand resolves the publishing node for each metrics sample (never a fabricated or hardcoded name). - Builds a per-Function graph of Apps (nodes) and topic connections (edges) with
per-edge frequency (Hz), latency (ms), and drop-rate (%) metrics. Drop-rate
degradation only fires if your producer actually emits
drop_rate_percent/drop_rate- the referencegreenwave_monitorproducer does not, so that rule is inert against it out of the box. - Reports
pipeline_status(healthy/degraded/broken) and, when degraded, thebottleneck_edge. - Flags each edge’s live publisher count (
publisher_count) and arate_ambiguouswarning when more than one publisher shares a topic, since the measured rate is then summed across publishers and can mask a slow pipeline as healthy.
The metrics require a real /diagnostics producer running elsewhere in your system -
see the Graph Provider tutorial
for the producer contract before doing anything else. Without one, every edge stays
pending forever.
Configuration
Loaded as a gateway plugin. gateway.launch.py auto-detects and loads this plugin
when the package is installed, with no configuration required. To load it manually:
plugins: ["graph_provider"]
plugins.graph_provider.path: "/path/to/lib/ros2_medkit_graph_provider/libros2_medkit_graph_provider_plugin.so"
plugins.graph_provider.expected_frequency_hz_default: 30.0
See the configuration reference for the full set of thresholds and per-function overrides.
Architecture
The plugin implements GatewayPlugin + IntrospectionProvider:
-
GraphProviderPlugin- Main plugin class with ROS 2 subscriptions -
GraphBuildState- Per-request snapshot of topic metrics and app last-seen timestamps -
GraphBuildConfig- Resolved thresholds (expected frequency, degradation, freshness)
Entity cache is populated from the ROS 2 graph during each discovery cycle
via the merge pipeline’s PluginLayer. The graph document itself is always rebuilt
fresh from the live entity cache on every request - there is no cross-request cache
to go stale.
Documentation
License
Apache License 2.0
Changelog for package ros2_medkit_graph_provider
Forthcoming
-
x-medkit-graphpipeline health rework:pipeline_statusno longer misreports"broken"for edges with no/diagnosticscoverage at all (the previous status model conflated "never observed" with "actively broken").error_reasonis now freshness-based and its only reachable value ismetrics_stale;node_offline,topic_stale, andno_data_sourceare gone.metrics.sourceis now the actual resolved/diagnosticspublisher node name (resolved per message via publisher GID matching against/diagnostics), omitted rather than hardcoded to"greenwave_monitor"when it cannot be resolved. Per-function threshold overrides (plugins.graph_provider.function_overrides.<function_id>.*) now take effect.schema_versionbumped to"2.0.0"(#545) - Robustness hardening for
x-medkit-graphhealth signals: freshness and staleness are now computed against a monotonic clock, so a backward wall-clock step (e.g. an NTP correction) can no longer make a dead topic read as fresh; a newstale_grace_secsetting (default2.0, per-function overridable) debounces a single late/diagnosticssample sopipeline_statusdoes not flap to"broken"and back; a newmulti_publisher_ratesetting (default"annotate", per-function overridable) defends against a duplicate or leftover publisher inflating a topic's summed arrival rate and masking a slow pipeline as healthy, backed by new per-edgemetrics.publisher_countandmetrics.rate_ambiguousfields;metrics.sourceis now cleared - not retained - whenever the most recent sample's publisher cannot be resolved, matching its documented latest-wins contract; and invalidplugins.graph_provider.*configuration, including per-function override field-name typos and wrong-typed values, now logs a warning and falls back to the previous valid value instead of failing silently (#545)
0.6.0 (2026-06-22)
- No functional changes; version bump for the coordinated 0.6.0 release.
- Contributors: \@bburda
0.5.0 (2026-06-08)
- Migrated
GraphProviderPluginto theget_routes()plugin API and fixed a route-separator bug - Added shutdown guards and
noexceptdestructors that reset rclcpp resources before member destruction, preventing teardown SIGSEGV - Added post-shutdown guard unit tests; dropped the cpp-httplib source
install from the Dockerfile (now vendored via
ros2_medkit_cmake) - Build: adopt the centralized
ROS2MedkitWarningscmake module - Contributors: \@bburda
0.4.0 (2026-03-20)
- Initial release - extracted from
ros2_medkit_gatewaypackage -
GraphProviderPluginfor ROS 2 graph-based entity introspection - Standalone external plugin package with independent build and test
- Locking support via
PluginContextAPI - Contributors: \@bburda
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| ros2_medkit_cmake | |
| ament_lint_auto | |
| ament_lint_common | |
| ament_cmake_clang_format | |
| ament_cmake_gtest | |
| rclcpp | |
| diagnostic_msgs | |
| ros2_medkit_gateway |
System Dependencies
| Name |
|---|
| nlohmann-json-dev |
Dependant Packages
| Name | Deps |
|---|---|
| ros2_medkit_integration_tests |
Launch files
Messages
Services
Plugins
Recent questions tagged ros2_medkit_graph_provider at Robotics Stack Exchange
Package Summary
| Version | 0.6.0 |
| License | Apache-2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/selfpatch/ros2_medkit.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-08-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- bburda
Authors
ros2_medkit_graph_provider
Gateway plugin that builds a live ROS 2 topic dataflow graph per SOVD Function,
enriched with frequency, latency, and drop-rate metrics sourced from /diagnostics.
This is the default IntrospectionProvider - extracted from ros2_medkit_gateway
into a standalone plugin package in v0.4.0.
What It Does
- Serves
GET /api/v1/functions/{function_id}/x-medkit-graph, plus a cyclic-subscription sampler under the same resource name and a capability href on every Function’s detail response. - Subscribes to
/diagnosticsand resolves the publishing node for each metrics sample (never a fabricated or hardcoded name). - Builds a per-Function graph of Apps (nodes) and topic connections (edges) with
per-edge frequency (Hz), latency (ms), and drop-rate (%) metrics. Drop-rate
degradation only fires if your producer actually emits
drop_rate_percent/drop_rate- the referencegreenwave_monitorproducer does not, so that rule is inert against it out of the box. - Reports
pipeline_status(healthy/degraded/broken) and, when degraded, thebottleneck_edge. - Flags each edge’s live publisher count (
publisher_count) and arate_ambiguouswarning when more than one publisher shares a topic, since the measured rate is then summed across publishers and can mask a slow pipeline as healthy.
The metrics require a real /diagnostics producer running elsewhere in your system -
see the Graph Provider tutorial
for the producer contract before doing anything else. Without one, every edge stays
pending forever.
Configuration
Loaded as a gateway plugin. gateway.launch.py auto-detects and loads this plugin
when the package is installed, with no configuration required. To load it manually:
plugins: ["graph_provider"]
plugins.graph_provider.path: "/path/to/lib/ros2_medkit_graph_provider/libros2_medkit_graph_provider_plugin.so"
plugins.graph_provider.expected_frequency_hz_default: 30.0
See the configuration reference for the full set of thresholds and per-function overrides.
Architecture
The plugin implements GatewayPlugin + IntrospectionProvider:
-
GraphProviderPlugin- Main plugin class with ROS 2 subscriptions -
GraphBuildState- Per-request snapshot of topic metrics and app last-seen timestamps -
GraphBuildConfig- Resolved thresholds (expected frequency, degradation, freshness)
Entity cache is populated from the ROS 2 graph during each discovery cycle
via the merge pipeline’s PluginLayer. The graph document itself is always rebuilt
fresh from the live entity cache on every request - there is no cross-request cache
to go stale.
Documentation
License
Apache License 2.0
Changelog for package ros2_medkit_graph_provider
Forthcoming
-
x-medkit-graphpipeline health rework:pipeline_statusno longer misreports"broken"for edges with no/diagnosticscoverage at all (the previous status model conflated "never observed" with "actively broken").error_reasonis now freshness-based and its only reachable value ismetrics_stale;node_offline,topic_stale, andno_data_sourceare gone.metrics.sourceis now the actual resolved/diagnosticspublisher node name (resolved per message via publisher GID matching against/diagnostics), omitted rather than hardcoded to"greenwave_monitor"when it cannot be resolved. Per-function threshold overrides (plugins.graph_provider.function_overrides.<function_id>.*) now take effect.schema_versionbumped to"2.0.0"(#545) - Robustness hardening for
x-medkit-graphhealth signals: freshness and staleness are now computed against a monotonic clock, so a backward wall-clock step (e.g. an NTP correction) can no longer make a dead topic read as fresh; a newstale_grace_secsetting (default2.0, per-function overridable) debounces a single late/diagnosticssample sopipeline_statusdoes not flap to"broken"and back; a newmulti_publisher_ratesetting (default"annotate", per-function overridable) defends against a duplicate or leftover publisher inflating a topic's summed arrival rate and masking a slow pipeline as healthy, backed by new per-edgemetrics.publisher_countandmetrics.rate_ambiguousfields;metrics.sourceis now cleared - not retained - whenever the most recent sample's publisher cannot be resolved, matching its documented latest-wins contract; and invalidplugins.graph_provider.*configuration, including per-function override field-name typos and wrong-typed values, now logs a warning and falls back to the previous valid value instead of failing silently (#545)
0.6.0 (2026-06-22)
- No functional changes; version bump for the coordinated 0.6.0 release.
- Contributors: \@bburda
0.5.0 (2026-06-08)
- Migrated
GraphProviderPluginto theget_routes()plugin API and fixed a route-separator bug - Added shutdown guards and
noexceptdestructors that reset rclcpp resources before member destruction, preventing teardown SIGSEGV - Added post-shutdown guard unit tests; dropped the cpp-httplib source
install from the Dockerfile (now vendored via
ros2_medkit_cmake) - Build: adopt the centralized
ROS2MedkitWarningscmake module - Contributors: \@bburda
0.4.0 (2026-03-20)
- Initial release - extracted from
ros2_medkit_gatewaypackage -
GraphProviderPluginfor ROS 2 graph-based entity introspection - Standalone external plugin package with independent build and test
- Locking support via
PluginContextAPI - Contributors: \@bburda
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| ros2_medkit_cmake | |
| ament_lint_auto | |
| ament_lint_common | |
| ament_cmake_clang_format | |
| ament_cmake_gtest | |
| rclcpp | |
| diagnostic_msgs | |
| ros2_medkit_gateway |
System Dependencies
| Name |
|---|
| nlohmann-json-dev |
Dependant Packages
| Name | Deps |
|---|---|
| ros2_medkit_integration_tests |