<<../../../_common/fidl/_diagnostics_intro.md>>
<<../../../_common/fidl/_diagnostics_fidlcat.md>>
<<../../../_common/fidl/_diagnostics_inspect.md>>
In this section, you'll use the diagnostics tools to monitor the health and behavior of the echo server component.
<<../_common/_start_femu_with_packages.md>>
Create a new instance of the echo-realm
containing the server and client components:
ffx component run /core/ffx-laboratory:echo-realm fuchsia-pkg://fuchsiasamples.com/echo-realm#meta/echo_realm.cm
You can use fidlcat
to monitor and debug the FIDL connections in your components. Launch ffx debug fidl
and configure it to monitor the echo server component:
ffx debug fidl --remote-name echo_server.cm --fidl-ir-path bazel-out/
Checking for debug agent on [fe80::d6c5:4526:c282:fb6%qemu]:2345. Debug agent not found. Starting one. INFO: [main.cc(238)] Connected to symbol server gs://fuchsia-artifacts-release/debug INFO: [main.cc(122)] Connecting to port 2345 on fe80::d6c5:4526:c282:fb6%qemu... INFO: [main.cc(92)] Connected!
Initiate a FIDL connection to the server by starting an echo client instance:
ffx component start /core/ffx-laboratory:echo-realm/echo_client
The client binds to the server component and communicates using the Echo
FIDL protocol. Review the ffx debug fidl
output to see a list of the FIDL transactions handled by echo server:
Monitoring echo_server.cm echo_server.cm 58694:58696 zx_channel_read_etc(handle: handle = fb9b5273, options: uint32 = 0, num_bytes: uint32 = 512, num_handles: uint32 = 4) -> ZX_OK received request fuchsia.io/Directory.Open = { flags: uint32 = 3, mode: uint32 = 493, path: string = "svc/examples.routing.echo.Echo", object: handle = Channel:f93b597b(ZX_RIGHT_TRANSFER | ZX_RIGHT_READ | ZX_RIGHT_WRITE | ZX_RIGHT_SIGNAL | ZX_RIGHT_SIGNAL_PEER | ZX_RIGHT_WAIT | ZX_RIGHT_INSPECT)(channel:0:svc/examples.routing.echo.Echo) } echo_server.cm 58694:58696 zx_channel_read_etc(handle: handle = Channel:f93b597b(channel:0:svc/examples.routing.echo.Echo), options: uint32 = 0, num_bytes: uint32 = 512, num_handles: uint32 = 4) -> ZX_OK received request examples.routing.echo/Echo.EchoString = { value: string = "Hello, Fuchsia" } echo_server.cm 58694:58696 zx_channel_write_etc(handle: handle = Channel:f93b597b(channel:0:svc/examples.routing.echo.Echo), options: uint32 = 0) sent response examples.routing.echo/Echo.EchoString = { response: string = "Hello, Fuchsia" } -> ZX_OK echo_server.cm 58694:58696 zx_channel_read_etc(handle: handle = Channel:f93b597b(channel:0:svc/examples.routing.echo.Echo), options: uint32 = 0, num_bytes: uint32 = 512, num_handles: uint32 = 4) -> ZX_ERR_PEER_CLOSED echo_server.cm 58694:58696 zx_handle_close(handle: handle = Channel:f93b597b(channel:0:svc/examples.routing.echo.Echo)) -> ZX_OK
Notice the sequence of events:
svc/examples.routing.echo.Echo
.Echo.EchoString
request over the open channel, containing the string payload sent by the client.By tracing the FIDL connections between your components, fidlcat
enables you to find and diagnose potential issues such as failed connections or invalid data payloads.
Component inspection allows you to publish diagnostic information from your components to assist in debugging. You'll use the Inspect API to track some usage statistics for the echo server component.
Update the echo_server
request handler to accept a new struct containing numeric Inspect properties for request count and bytes processed. The handler increments these properties on each incoming request:
echo-server/main.cc
:
{% includecode gerrit_repo="fuchsia/sdk-samples/getting-started" gerrit_path="src/routing/cpp/inspect_server/main.cc" region_tag="handler" adjust_indentation="auto" %}
Add the following code to main()
to initialize the Inspect propertes and pass them to the updated handler:
echo-server/main.cc
:
int main(int argc, const char** argv) { // ... {% includecode gerrit_repo="fuchsia/sdk-samples/getting-started" gerrit_path="src/routing/cpp/inspect_server/main.cc" region_tag="echo_instance" %} {{ '<strong>' }}{% includecode gerrit_repo="fuchsia/sdk-samples/getting-started" gerrit_path="src/routing/cpp/inspect_server/main.cc" region_tag="add_properties" %} {{ '</strong>' }} // ... }
Finally, update the imports to include the new Inspect libraries:
echo-server/main.cc
:
{% includecode gerrit_repo="fuchsia/sdk-samples/getting-started" gerrit_path="src/routing/cpp/inspect_server/main.cc" region_tag="imports" adjust_indentation="auto" %}
Build and publish the updated package to the fuchsiasamples.com
repository:
bazel run //fuchsia-codelab/echo-realm:pkg.publish -- \ --repo_name fuchsiasamples.com
Create a new echo-realm
component containing the updated echo-server
:
ffx component run /core/ffx-laboratory:echo-realm fuchsia-pkg://fuchsiasamples.com/echo-realm#meta/echo_realm.cm \ --recreate
Run the echo client component multiple times. This causes the request count in echo-server
to increment with each connection:
ffx component start /core/ffx-laboratory:echo-realm/echo_client ffx component start /core/ffx-laboratory:echo-realm/echo_client ffx component start /core/ffx-laboratory:echo-realm/echo_client
View the available Inspect data for the echo server component with ffx inspect
. You'll see the values for request count and bytes processed in the tree under the root
node alongside the component health status:
ffx inspect show 'core/ffx-laboratory\:echo-realm/echo_server'
core/ffx-laboratory\:echo-realm/echo_server: metadata: filename = fuchsia.inspect.Tree component_url = #meta/echo_server.cm timestamp = 1476246046122 payload: root: bytes_processed = 42 total_requests = 3 fuchsia.inspect.Health: start_timestamp_nanos = 1467828507317 status = OK
Publishing health and behavior information using Inspect enables you to observe the current state of your components and diagnose issues on production devices.
Clean up the echo-realm
instance using the following command:
ffx component destroy /core/ffx-laboratory:echo-realm
Congratulations! You've successfully built a Fuchsia IPC interface using FIDL, and connected two components together using that interface.
You have completed all the modules in this course! Take your newfound understanding to the next level and dive deeper into the:
Fuchsia concepts