You can turn an app sim config into a docker compose file using the docker compose generator.
The generator is available as docker image and you can retrieve it by running
docker pull ghcr.io/cisco-open/app-simulator-generators-docker-compose:latestTo try it out, create the a file called config.yaml with the following content
in a new folder:
services:
frontend:
type: java
exposedPort: 3000
endpoints:
http:
/upload:
- http://processing/magicByte
- http://processing/virus
processing:
type: java
endpoints:
http:
/magicByte:
- cache,128
/virus:
- http://virus-scanner/scan
virus-scanner:
type: nodejs
endpoints:
http:
scan:
- sleep,1500
- call: error,500,Scan failed
probability: 0.1
- sleep,500
loaders:
user-1:
type: curl
wait: 0
sleep: 2
urls:
- http://frontend/upload
- http://frontend/upload
- http://frontend/uploadTo generate a docker-compose.yaml from this file run
docker run --rm -t -i -v ${PWD}:/mnt ghcr.io/cisco-open/app-simulator-generators-docker-compose --config /mnt/config.yaml --output /mnt/docker-compose.yamlTo run the simulation using the generated docker-compose.yaml, execute the
following in your terminal:
docker compose upThis will bring up the three services (frontend, processing and
virus-scanner) and a loader (user-1). Run docker ps to verify that all
services are up and running:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aebccbe1bc54 ghcr.io/cisco-open/app-simulator-services-java:edge "/entrypoint.sh" 4 seconds ago Up 3 seconds 8080/tcp, 0.0.0.0:3000->80/tcp test-app-sim-frontend-1
75218ac52b90 ghcr.io/cisco-open/app-simulator-services-java:edge "/entrypoint.sh" 4 seconds ago Up 3 seconds 8080/tcp test-app-sim-processing-1
75d7433f85c0 ghcr.io/cisco-open/app-simulator-services-nodejs:edge "docker-entrypoint.s…" 4 seconds ago Up 3 seconds 80/tcp test-app-sim-virus-scanner-1
5f86a8738e15 ghcr.io/cisco-open/app-simulator-loaders-curl:edge "/usr/bin/entrypoint…" 4 seconds ago Up 3 seconds test-app-sim-user-1-1The loader will continuously load from the /upload endpoint. You can also
reach that endpoint yourself, either by opening http://localhost:3000/upload
in the browser or by running the following:
curl http://localhost:3000/uploadThe docker-compose.yaml that was generated now works independent of the
generator. You can use it wherever you want and you can modify it to your needs.
If you want to quickly visualize the simulation, you can add OpenTelemetry using
the Java agent and
Node.js
@opentelemetry/auto-instrumentations-node
and send trace data to jaeger.
To do so, download the Java agent and Node.js package:
curl -L -O https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar
echo {} > package.json
npm install @opentelemetry/auto-instrumentations-nodeNext, create a
docker-compose.override.yaml
with the following content:
services:
frontend:
environment:
- JAVA_TOOL_OPTIONS=-javaagent:/mnt/opentelemetry-javaagent.jar
- OTEL_RESOURCE_ATTRIBUTES=service.name=frontend
- OTEL_EXPORTER=otlp
- OTEL_EXPORTER_OTLP_ENDPOINT=http://jaeger:4318
volumes:
- ./opentelemetry-javaagent.jar:/mnt/opentelemetry-javaagent.jar
processing:
environment:
- JAVA_TOOL_OPTIONS=-javaagent:/mnt/opentelemetry-javaagent.jar
- OTEL_RESOURCE_ATTRIBUTES=service.name=processing
- OTEL_EXPORTER=otlp
- OTEL_EXPORTER_OTLP_ENDPOINT=http://jaeger:4318
volumes:
- ./opentelemetry-javaagent.jar:/mnt/opentelemetry-javaagent.jar
virus-scanner:
environment:
- NODE_PATH=/mnt/node_modules
- NODE_OPTIONS=-r "@opentelemetry/auto-instrumentations-node/register"
- OTEL_RESOURCE_ATTRIBUTES=service.name=virus-scanner
- OTEL_EXPORTER=otlp
- OTEL_EXPORTER_OTLP_ENDPOINT=http://jaeger:4318
volumes:
- ./node_modules:/mnt/node_modules
jaeger:
image: jaegertracing/all-in-one
ports:
- "16686:16686"
- "4317:4317"
- "4318:4318"The existing docker-compose.yaml and the newly created
docker-compose.override.yaml will be merged, such that the OpenTelemetry Java
agent and Node.js package are injected into the services. Once again start the
simulation:
docker compose upThis will bring up the three services for the simulation and additionally a container running jaeger. In your browser you can navigate to http://localhost:16686/search to see traces flowing through your system:
If you want to learn more about app-simulator and how you can use it for your own needs, we recommend that you continue with the tutorial.
