From 71fe3789c801a98cb40897f30b01d65e1de99a73 Mon Sep 17 00:00:00 2001 From: Marimuthukalivelraja Date: Sat, 26 Jul 2025 22:39:54 +0530 Subject: [PATCH 01/14] Fixes #4: Updated documentation for curl loader --- src/loaders/curl/curlloader.md | 90 ++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 src/loaders/curl/curlloader.md diff --git a/src/loaders/curl/curlloader.md b/src/loaders/curl/curlloader.md new file mode 100644 index 0000000..1efa476 --- /dev/null +++ b/src/loaders/curl/curlloader.md @@ -0,0 +1,90 @@ +# Curl loader + +You can simulate your project by continuously send HTTP requests from config.json file to a list of target services by this lightweight load generator component within this [Application Simulator project](https://github.com/cisco-open/app-simulator) + + +# Configuration - config.json + +You have to create a config.json file to define the load behaviour .For example: +```JSON +{ + "sleep": 2, + "wait": 5, + "urls": [ + "http://frontend/upload", + "http://frontend/upload", + "http://frontend/upload" + ] +} +``` + +These are fields you have to define , +## Sleep +**Type** : number +Seconds to sleep between each request loop + +## Wait +**Type** : number +Initial wait time before the first request + +## URLs +**Type** : array +List of service URLs to target + + + +## Behavior Summary +- Waits for `wait` seconds before starting. +- Repeatedly sends HTTP GET requests to each URL with`?unique_session_id=`. +- Waits `sleep` seconds between each loop. + +## Dependencies + +The script requires the following in its runtime environment: + +-curl +-jq +-uuidgen (part of uuid-runtime or util-linux) + +# Usage + +## 1.Docker +Build: +```Bash docker build -t curl-loader``` +Run: +```Bash docker run --rm -v $(pwd)/config.json:/config.json curl-loader``` + +## 2.Docker Compose Integration +Use this block in your config.yaml: +```Yaml loaders: + user-1: + type: curl + wait: 0 + sleep: 2 + urls: + - http://frontend/upload + - http://frontend/upload + - http://frontend/upload +``` +Then generate the Docker Compose config: +```Bash docker run --rm -v ${PWD}:/mnt \ + ghcr.io/cisco-open/app-simulator-generators-docker-compose \ + --config /mnt/config.yaml \ + --output /mnt/docker-compose.yaml +``` +##Example Scenario +Your `docker-compose.yaml` may include services like: + +```Yaml services: + frontend: + image: ghcr.io/cisco-open/app-simulator-services-java:edge + ports: + - "3000:80" + user-1: + image: ghcr.io/cisco-open/app-simulator-loaders-curl:edge +``` +After running `docker compose up `,the loader will continuously simulate user-traffice to `frontend`. + +## Tracing with Jaeger + +Combine this loader with OpenTelemetry instrumentation in your services and Jaeger to visualize traces flowing through your architecture.See the 1. [Observability with OpenTelemetry](https://github.com/cisco-open/app-simulator/blob/main/docs/tutorial/5-observability-with-opentelemetry.md) for details. \ No newline at end of file From 94bbe7954d550851258e22e3dc579ea188a35985 Mon Sep 17 00:00:00 2001 From: Marimuthukalivelraja Date: Sat, 2 Aug 2025 14:17:05 +0530 Subject: [PATCH 02/14] update the document --- src/loaders/curl/README.md | 96 ++++++++++++++++++++++++++++++++++ src/loaders/curl/curlloader.md | 90 ------------------------------- 2 files changed, 96 insertions(+), 90 deletions(-) create mode 100644 src/loaders/curl/README.md delete mode 100644 src/loaders/curl/curlloader.md diff --git a/src/loaders/curl/README.md b/src/loaders/curl/README.md new file mode 100644 index 0000000..0d0a3e9 --- /dev/null +++ b/src/loaders/curl/README.md @@ -0,0 +1,96 @@ +# **Curl loader quick start** +### *Load Testing with Application Simulator* + +--- + +Looking to test your services under realistic conditions? Meet `Curl loader`,the lightweight load generation component built right into the [Application Simulator project](https://github.com/cisco-open/app-simulator) by Cisco Open Source. + +Designed for speed, simplicity, and reliability, curl loader lets you simulate real world HTTP traffic using a config.json file. + +## Configuration + +To define load behavior, create a config.json file. + +For example: + +If you want to test how your API endpoint on the frontend service handles concurrent traffic, you can list it multiple times in the `urls` array and adjust the `sleep` and `wait` values accordingly to simulate the desired load pattern. + +```JSON +{   + "sleep": 2,  + "wait": 5,  + "urls": [    + "http://frontend/upload",    + "http://frontend/upload",    + "http://frontend/upload"  + ] +} +``` + +Each of the following parameters must be specified to control how the load is executed: + +| field         | type          | description                              | +| ------------- | ------------- | ---------------------------------------- | +| Sleep         | number        |seconds to sleep between each request loop| +| Wait          | number        |initial wait time before the first request| +| URLs          | array         |list of service URLs to target            | + +## Behavior Summary +- **Initial Delay**: Waits for the duration specified in wait (in seconds) before initiating any requests. +- **Request Execution**: Sends repeated HTTP GET requests to each URL in the list, automatically appending a `?unique_session_id=` parameter to ensure each request is distinct. +- **Loop Interval**: Pauses for the duration specified in sleep (in seconds) between each full cycle of requests to all URLs. + +## Dependencies + +The script requires the following in its runtime environment: +- curl +- jq +- uuidgen (part of uuid-runtime or util-linux) + +## Getting Started with Docker + +### 1. Docker +Build the Docker image: +```Bash docker build -t curl-loader``` + +Run the container: +```Bash docker run --rm -v $(pwd)/config.json:/config.json curl-loader``` + +### 2. Docker Compose Integration +Use this block in your config.yaml: +```Yaml loaders:  + user-1:    + type: curl    + wait: 0    + sleep: 2    + urls:      + - http://frontend/upload      + - http://frontend/upload      + - http://frontend/upload + + +``` +Generate the Docker Compose config: +```Bash + docker run --rm -v ${PWD}:/mnt \  + ghcr.io/cisco-open/app-simulator-generators-docker-compose   + --config /mnt/config.yaml \  + --output /mnt/docker-compose.yaml +``` +### 3. Example Scenario + +Here is an example of `docker-compose.yaml` setup: + +```Yaml services:  + frontend:    + image: ghcr.io/cisco-open/app-simulator-services-java:edge    + ports:      + - "3000:80"  + user-1:    + image: ghcr.io/cisco-open/app-simulator-loaders-curl:edge +``` +After running `docker compose up `,the loader will continuously simulate user-traffic to frontend. + +## Tracing with Jaeger + +Combine this loader with OpenTelemetry instrumentation in your services and Jaeger to visualize traces flowing through your architecture.See the  [Observability with OpenTelemetry](https://github.com/cisco-open/app-simulator/blob/main/docs/tutorial/5-observability-with-opentelemetry.md) for details. \ No newline at end of file diff --git a/src/loaders/curl/curlloader.md b/src/loaders/curl/curlloader.md deleted file mode 100644 index 1efa476..0000000 --- a/src/loaders/curl/curlloader.md +++ /dev/null @@ -1,90 +0,0 @@ -# Curl loader - -You can simulate your project by continuously send HTTP requests from config.json file to a list of target services by this lightweight load generator component within this [Application Simulator project](https://github.com/cisco-open/app-simulator) - - -# Configuration - config.json - -You have to create a config.json file to define the load behaviour .For example: -```JSON -{ - "sleep": 2, - "wait": 5, - "urls": [ - "http://frontend/upload", - "http://frontend/upload", - "http://frontend/upload" - ] -} -``` - -These are fields you have to define , -## Sleep -**Type** : number -Seconds to sleep between each request loop - -## Wait -**Type** : number -Initial wait time before the first request - -## URLs -**Type** : array -List of service URLs to target - - - -## Behavior Summary -- Waits for `wait` seconds before starting. -- Repeatedly sends HTTP GET requests to each URL with`?unique_session_id=`. -- Waits `sleep` seconds between each loop. - -## Dependencies - -The script requires the following in its runtime environment: - --curl --jq --uuidgen (part of uuid-runtime or util-linux) - -# Usage - -## 1.Docker -Build: -```Bash docker build -t curl-loader``` -Run: -```Bash docker run --rm -v $(pwd)/config.json:/config.json curl-loader``` - -## 2.Docker Compose Integration -Use this block in your config.yaml: -```Yaml loaders: - user-1: - type: curl - wait: 0 - sleep: 2 - urls: - - http://frontend/upload - - http://frontend/upload - - http://frontend/upload -``` -Then generate the Docker Compose config: -```Bash docker run --rm -v ${PWD}:/mnt \ - ghcr.io/cisco-open/app-simulator-generators-docker-compose \ - --config /mnt/config.yaml \ - --output /mnt/docker-compose.yaml -``` -##Example Scenario -Your `docker-compose.yaml` may include services like: - -```Yaml services: - frontend: - image: ghcr.io/cisco-open/app-simulator-services-java:edge - ports: - - "3000:80" - user-1: - image: ghcr.io/cisco-open/app-simulator-loaders-curl:edge -``` -After running `docker compose up `,the loader will continuously simulate user-traffice to `frontend`. - -## Tracing with Jaeger - -Combine this loader with OpenTelemetry instrumentation in your services and Jaeger to visualize traces flowing through your architecture.See the 1. [Observability with OpenTelemetry](https://github.com/cisco-open/app-simulator/blob/main/docs/tutorial/5-observability-with-opentelemetry.md) for details. \ No newline at end of file From 4674b423795c43aa2a142e7171bba161e160a59a Mon Sep 17 00:00:00 2001 From: Marimuthukalivelraja Date: Sat, 2 Aug 2025 14:26:02 +0530 Subject: [PATCH 03/14] make correction in the code snippets --- src/loaders/curl/README.md | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/loaders/curl/README.md b/src/loaders/curl/README.md index 0d0a3e9..ddbcdcf 100644 --- a/src/loaders/curl/README.md +++ b/src/loaders/curl/README.md @@ -51,14 +51,19 @@ The script requires the following in its runtime environment: ### 1. Docker Build the Docker image: -```Bash docker build -t curl-loader``` +```Bash + docker build -t curl-loader +``` Run the container: -```Bash docker run --rm -v $(pwd)/config.json:/config.json curl-loader``` +```Bash + docker run --rm -v $(pwd)/config.json:/config.json curl-loader +``` ### 2. Docker Compose Integration Use this block in your config.yaml: -```Yaml loaders:  +```Yaml +loaders:  user-1:    type: curl    wait: 0    @@ -81,7 +86,8 @@ Generate the Docker Compose config: Here is an example of `docker-compose.yaml` setup: -```Yaml services:  +```Yaml +services:  frontend:    image: ghcr.io/cisco-open/app-simulator-services-java:edge    ports:      From beae69ba59a4d69da69dbde0d882cfac77fd30b5 Mon Sep 17 00:00:00 2001 From: Kalivelraja <118364359+Marimuthukalivelraja@users.noreply.github.com> Date: Wed, 6 Aug 2025 11:22:33 +0530 Subject: [PATCH 04/14] Update src/loaders/curl/README.md removed orphaned spaces Co-authored-by: Severin Neumann --- src/loaders/curl/README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/loaders/curl/README.md b/src/loaders/curl/README.md index ddbcdcf..128fafa 100644 --- a/src/loaders/curl/README.md +++ b/src/loaders/curl/README.md @@ -16,13 +16,13 @@ For example: If you want to test how your API endpoint on the frontend service handles concurrent traffic, you can list it multiple times in the `urls` array and adjust the `sleep` and `wait` values accordingly to simulate the desired load pattern. ```JSON -{   - "sleep": 2,  - "wait": 5,  - "urls": [    - "http://frontend/upload",    - "http://frontend/upload",    - "http://frontend/upload"  +{ + "sleep": 2, + "wait": 5, + "urls": [ + "http://frontend/upload", + "http://frontend/upload", + "http://frontend/upload" ] } ``` From 0dc913f493deabde55757f720a00adca996820b6 Mon Sep 17 00:00:00 2001 From: Kalivelraja <118364359+Marimuthukalivelraja@users.noreply.github.com> Date: Wed, 6 Aug 2025 11:30:30 +0530 Subject: [PATCH 05/14] corrected the spaces Co-authored-by: Severin Neumann --- src/loaders/curl/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/loaders/curl/README.md b/src/loaders/curl/README.md index 128fafa..ed12584 100644 --- a/src/loaders/curl/README.md +++ b/src/loaders/curl/README.md @@ -50,13 +50,14 @@ The script requires the following in its runtime environment: ## Getting Started with Docker ### 1. Docker + Build the Docker image: -```Bash +```bash docker build -t curl-loader ``` Run the container: -```Bash +```bash docker run --rm -v $(pwd)/config.json:/config.json curl-loader ``` From c30b0ba7e0b4961a468bc84094be6895cb9a6b74 Mon Sep 17 00:00:00 2001 From: Kalivelraja <118364359+Marimuthukalivelraja@users.noreply.github.com> Date: Wed, 6 Aug 2025 11:31:26 +0530 Subject: [PATCH 06/14] added the hyperlink Co-authored-by: Severin Neumann --- src/loaders/curl/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/loaders/curl/README.md b/src/loaders/curl/README.md index ed12584..37082c9 100644 --- a/src/loaders/curl/README.md +++ b/src/loaders/curl/README.md @@ -43,8 +43,9 @@ Each of the following parameters must be specified to control how the load is ex ## Dependencies The script requires the following in its runtime environment: -- curl -- jq + +- [curl](https://curl.se/) +- [jq](https://jqlang.org/) - uuidgen (part of uuid-runtime or util-linux) ## Getting Started with Docker From 5e5462e7675f6e15e1711fea52dcd5585474f3e4 Mon Sep 17 00:00:00 2001 From: Kalivelraja <118364359+Marimuthukalivelraja@users.noreply.github.com> Date: Wed, 6 Aug 2025 11:33:12 +0530 Subject: [PATCH 07/14] aligned the spaces align the spaces in the heading and code snippet section Co-authored-by: Severin Neumann --- src/loaders/curl/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/loaders/curl/README.md b/src/loaders/curl/README.md index 37082c9..e52782a 100644 --- a/src/loaders/curl/README.md +++ b/src/loaders/curl/README.md @@ -63,8 +63,9 @@ Run the container: ``` ### 2. Docker Compose Integration + Use this block in your config.yaml: -```Yaml +```yaml loaders:  user-1:    type: curl    From eac53d932d98e008e6c443c8089a31cb0798ff99 Mon Sep 17 00:00:00 2001 From: Kalivelraja <118364359+Marimuthukalivelraja@users.noreply.github.com> Date: Sat, 9 Aug 2025 23:35:26 +0530 Subject: [PATCH 08/14] space alignments Co-authored-by: Severin Neumann --- src/loaders/curl/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/loaders/curl/README.md b/src/loaders/curl/README.md index e52782a..589f1b8 100644 --- a/src/loaders/curl/README.md +++ b/src/loaders/curl/README.md @@ -1,5 +1,6 @@ -# **Curl loader quick start** -### *Load Testing with Application Simulator* +# Curl loader quick start + +> Load Testing with Application Simulator --- From 95aa31cfc7b4cd278566fda68163f23985ec0032 Mon Sep 17 00:00:00 2001 From: Kalivelraja <118364359+Marimuthukalivelraja@users.noreply.github.com> Date: Sat, 9 Aug 2025 23:36:22 +0530 Subject: [PATCH 09/14] suggestion no - 1 Co-authored-by: Severin Neumann --- src/loaders/curl/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/src/loaders/curl/README.md b/src/loaders/curl/README.md index 589f1b8..f96a839 100644 --- a/src/loaders/curl/README.md +++ b/src/loaders/curl/README.md @@ -2,7 +2,6 @@ > Load Testing with Application Simulator ---- Looking to test your services under realistic conditions? Meet `Curl loader`,the lightweight load generation component built right into the [Application Simulator project](https://github.com/cisco-open/app-simulator) by Cisco Open Source. From 45e72f24c7cfc6950e2a86d68cec65bbf3452051 Mon Sep 17 00:00:00 2001 From: Kalivelraja <118364359+Marimuthukalivelraja@users.noreply.github.com> Date: Sat, 9 Aug 2025 23:37:02 +0530 Subject: [PATCH 10/14] suggestion no - 2 Co-authored-by: Severin Neumann --- src/loaders/curl/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/loaders/curl/README.md b/src/loaders/curl/README.md index f96a839..37724cc 100644 --- a/src/loaders/curl/README.md +++ b/src/loaders/curl/README.md @@ -36,6 +36,7 @@ Each of the following parameters must be specified to control how the load is ex | URLs          | array         |list of service URLs to target            | ## Behavior Summary + - **Initial Delay**: Waits for the duration specified in wait (in seconds) before initiating any requests. - **Request Execution**: Sends repeated HTTP GET requests to each URL in the list, automatically appending a `?unique_session_id=` parameter to ensure each request is distinct. - **Loop Interval**: Pauses for the duration specified in sleep (in seconds) between each full cycle of requests to all URLs. From 83f620331f991d77df618a81727116ea6a90fd2c Mon Sep 17 00:00:00 2001 From: Kalivelraja <118364359+Marimuthukalivelraja@users.noreply.github.com> Date: Sat, 9 Aug 2025 23:40:46 +0530 Subject: [PATCH 11/14] suggestion no - 3 Co-authored-by: Severin Neumann --- src/loaders/curl/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/loaders/curl/README.md b/src/loaders/curl/README.md index 37724cc..06dc7be 100644 --- a/src/loaders/curl/README.md +++ b/src/loaders/curl/README.md @@ -80,14 +80,17 @@ loaders:  ``` Generate the Docker Compose config: -```Bash + +```vash docker run --rm -v ${PWD}:/mnt \  ghcr.io/cisco-open/app-simulator-generators-docker-compose   --config /mnt/config.yaml \  --output /mnt/docker-compose.yaml ``` + ### 3. Example Scenario + Here is an example of `docker-compose.yaml` setup: ```Yaml From b7ff892e9f0ea888429729a0ddaa223ceb7b1d1c Mon Sep 17 00:00:00 2001 From: Kalivelraja <118364359+Marimuthukalivelraja@users.noreply.github.com> Date: Sat, 9 Aug 2025 23:41:38 +0530 Subject: [PATCH 12/14] suggestion no - 4 Co-authored-by: Severin Neumann --- src/loaders/curl/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/loaders/curl/README.md b/src/loaders/curl/README.md index 06dc7be..76d1eb8 100644 --- a/src/loaders/curl/README.md +++ b/src/loaders/curl/README.md @@ -93,7 +93,7 @@ Generate the Docker Compose config: Here is an example of `docker-compose.yaml` setup: -```Yaml +```yaml services:  frontend:    image: ghcr.io/cisco-open/app-simulator-services-java:edge    From 8b1b451b01f2aa691b4dc6fdbda19abc91a94de0 Mon Sep 17 00:00:00 2001 From: Kalivelraja <118364359+Marimuthukalivelraja@users.noreply.github.com> Date: Sat, 9 Aug 2025 23:43:38 +0530 Subject: [PATCH 13/14] suggestion no - 5 Co-authored-by: Severin Neumann --- src/loaders/curl/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/loaders/curl/README.md b/src/loaders/curl/README.md index 76d1eb8..2db5cf2 100644 --- a/src/loaders/curl/README.md +++ b/src/loaders/curl/README.md @@ -102,7 +102,8 @@ services:  user-1:    image: ghcr.io/cisco-open/app-simulator-loaders-curl:edge ``` -After running `docker compose up `,the loader will continuously simulate user-traffic to frontend. + +After running `docker compose up`, the loader will continuously simulate user-traffic to frontend. ## Tracing with Jaeger From c302212388b29dee11cd4c8e3155f2602b4053d7 Mon Sep 17 00:00:00 2001 From: svrnm Date: Fri, 29 Aug 2025 13:00:30 +0200 Subject: [PATCH 14/14] apply feedback Signed-off-by: svrnm --- src/loaders/curl/README.md | 85 ++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 45 deletions(-) diff --git a/src/loaders/curl/README.md b/src/loaders/curl/README.md index 2db5cf2..e3feb6c 100644 --- a/src/loaders/curl/README.md +++ b/src/loaders/curl/README.md @@ -1,11 +1,4 @@ -# Curl loader quick start - -> Load Testing with Application Simulator - - -Looking to test your services under realistic conditions? Meet `Curl loader`,the lightweight load generation component built right into the [Application Simulator project](https://github.com/cisco-open/app-simulator) by Cisco Open Source. - -Designed for speed, simplicity, and reliability, curl loader lets you simulate real world HTTP traffic using a config.json file. +# Curl loader ## Configuration @@ -15,7 +8,7 @@ For example: If you want to test how your API endpoint on the frontend service handles concurrent traffic, you can list it multiple times in the `urls` array and adjust the `sleep` and `wait` values accordingly to simulate the desired load pattern. -```JSON +```json { "sleep": 2, "wait": 5, @@ -29,11 +22,11 @@ If you want to test how your API endpoint on the frontend service handles concur Each of the following parameters must be specified to control how the load is executed: -| field         | type          | description                              | -| ------------- | ------------- | ---------------------------------------- | -| Sleep         | number        |seconds to sleep between each request loop| -| Wait          | number        |initial wait time before the first request| -| URLs          | array         |list of service URLs to target            | +| field         | type           | description                               | +| -------------- | -------------- | ------------------------------------------ | +| Sleep         | number         | seconds to sleep between each request loop | +| Wait           | number         | initial wait time before the first request | +| URLs           | array         | list of service URLs to target             | ## Behavior Summary @@ -45,61 +38,62 @@ Each of the following parameters must be specified to control how the load is ex The script requires the following in its runtime environment: -- [curl](https://curl.se/) -- [jq](https://jqlang.org/) -- uuidgen (part of uuid-runtime or util-linux) +- [`curl`](https://curl.se/) +- [`jq`](https://jqlang.org/) +- `uuidgen` (part of uuid-runtime or util-linux) ## Getting Started with Docker -### 1. Docker +### Docker + +Build the Docker image: -Build the Docker image: -```bash +```bash docker build -t curl-loader ``` -Run the container: -```bash +Run the container: + +```bash docker run --rm -v $(pwd)/config.json:/config.json curl-loader ``` ### 2. Docker Compose Integration Use this block in your config.yaml: -```yaml + +```yaml loaders:  - user-1:    - type: curl    - wait: 0    - sleep: 2    - urls:      - - http://frontend/upload      - - http://frontend/upload      + user-1:    + type: curl    + wait: 0    + sleep: 2    + urls:      + - http://frontend/upload      + - http://frontend/upload      - http://frontend/upload - - ``` + Generate the Docker Compose config: -```vash - docker run --rm -v ${PWD}:/mnt \  - ghcr.io/cisco-open/app-simulator-generators-docker-compose   - --config /mnt/config.yaml \  +```bash + docker run --rm -v ${PWD}:/mnt \  + ghcr.io/cisco-open/app-simulator-generators-docker-compose   + --config /mnt/config.yaml \  --output /mnt/docker-compose.yaml ``` ### 3. Example Scenario - Here is an example of `docker-compose.yaml` setup: -```yaml -services:  - frontend:    - image: ghcr.io/cisco-open/app-simulator-services-java:edge    - ports:      - - "3000:80"  - user-1:    +```yaml +services:  + frontend:    + image: ghcr.io/cisco-open/app-simulator-services-java:edge    + ports:      + - "3000:80"  + user-1:    image: ghcr.io/cisco-open/app-simulator-loaders-curl:edge ``` @@ -107,4 +101,5 @@ After running `docker compose up`, the loader will continuously simulate user-tr ## Tracing with Jaeger -Combine this loader with OpenTelemetry instrumentation in your services and Jaeger to visualize traces flowing through your architecture.See the  [Observability with OpenTelemetry](https://github.com/cisco-open/app-simulator/blob/main/docs/tutorial/5-observability-with-opentelemetry.md) for details. \ No newline at end of file +Combine this loader with OpenTelemetry instrumentation in your services and Jaeger to visualize traces flowing through your architecture. +See the [Observability with OpenTelemetry](../../../docs/tutorial/5-observability-with-opentelemetry.md) for details.