From 4882dc4fa206797bbd2e828213c2fe7670e296df Mon Sep 17 00:00:00 2001 From: Bai Yingjie Date: Tue, 26 Sep 2023 00:59:29 +0000 Subject: [PATCH] message tracing: improve doc --- docs/messagetracing.md | 8 +++++--- docs/tracing_echo_server.png | Bin 0 -> 13819 bytes 2 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 docs/tracing_echo_server.png diff --git a/docs/messagetracing.md b/docs/messagetracing.md index e958abc..95f9473 100644 --- a/docs/messagetracing.md +++ b/docs/messagetracing.md @@ -71,8 +71,8 @@ Message tracing can be enabled per message type dynamically, without any code mo In this scenario, we have a service called 'echoservice' running. The 'echoclient' sends hundreds of `echo.Request` messages to the server, and we want to trace how `echo.Request` is going to be processed. It's important to note that message tracing operates on a session-based approach, and here's how it works: 1. We tag message type `echo.Request` with a special 'traced' flag, return a unique token. -2. The client consumes the token upon sending a `echo.Request` because it matches 'traced' message type. Each token is specific to a session and gets consumed, so subsequent messages of type echo.Request won't be traced unless tagged again. -3. When the server-side handles an `echo.Request`, all messages involved in processing that request, in the order they occur, are tagged as 'traced' messages (see the demo example). In this scenario, we don't have dependent messages, so the server responds with `echo.Reply` to the client. +2. The client consumes the token upon sending a `echo.Request` because it matches 'traced' message type. Each token is specific to a session and gets consumed, so subsequent messages of type `echo.Request` won't be traced unless tagged again. +3. When the server-side handles an `echo.Request`, all messages involved in processing that request, in the order they occur, are tagged as 'traced' messages (see the demo example). In our scenario here, we don't have dependent messages, so the server responds with `echo.Reply` to the client. 4. Events related to the client sending, server receiving, server sending, and client receiving are recorded throughout the tracing process. 5. We use the token to access traced records. The records will be read and then cleared. @@ -126,6 +126,9 @@ Summary(paste below content to http://www.plantuml.com/plantuml): "example/echo.v1.0@0f4de739464d" -> "client": 12:32:14.411652 echo.Reply{} ``` +The sequence diagram: +![tracing session for echo server](tracing_echo_server.png) + ## Trace sequential sessions ```shell cd gshellos @@ -165,7 +168,6 @@ gsh run -rm -i testdata/tracemsg.go show ac098704-9971-4810-b338-8398ec27bf78.0. ``` Sequential tracing session result includes many session results, from `ac098704-9971-4810-b338-8398ec27bf78.0` to `ac098704-9971-4810-b338-8398ec27bf78.8`, with each one displayed separately. -``` ## The help diff --git a/docs/tracing_echo_server.png b/docs/tracing_echo_server.png new file mode 100644 index 0000000000000000000000000000000000000000..bbe74cbe09ca7725221b412bf4d58de240caadf0 GIT binary patch literal 13819 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