Skip to content
This repository was archived by the owner on May 29, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 9 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -153,16 +153,16 @@ Note: In this case, if the service is staked, then it will not update the on-cha
cd trader; poetry run python ../report.py; cd ..
```

3. Use this command to investigate your agent's logs:
3. Use the `analyse_logs.py` script to investigate your agent's logs:

```bash
cd trader; poetry run autonomy analyse logs --from-dir trader_service/abci_build/persistent_data/logs/ --agent aea_0 --reset-db; cd ..
cd trader; poetry run python ../analyse_logs.py --agent aea_0 --reset-db; cd ..
```

For example, inspect the state transitions using this command:
For example, inspect the state transitions using the following command:

```bash
cd trader; poetry run autonomy analyse logs --from-dir trader_service/abci_build/persistent_data/logs/ --agent aea_0 --fsm --reset-db; cd ..
cd trader; poetry run python ../analyse_logs.py --agent aea_0 --fsm --reset-db; cd ..
```

This will output the different state transitions of your agent per period, for example:
Expand Down Expand Up @@ -411,7 +411,11 @@ Error: Service terminatation failed with following error; ChainInteractionError(

## Build deployments without executing the service

The script builds both a Docker Compose deployment (on `./trader/trader_service/abci_build`) and a Kubernetes deployment (on `./trader/trader_service/abci_build_k8s`). Then, by default, the script will launch the local Docker Compose deployment. If you just want to build the deployment without executing the service (for example, if you are deploying to a custom Kubernetes cluster), then execute the script as
The script builds both a Docker Compose deployment (on `./trader/trader_service/abci_build_????`)
and a Kubernetes deployment (on `./trader/trader_service/abci_build_k8s`).
Then, by default, the script will launch the local Docker Compose deployment.
If you just want to build the deployment without executing the service
(for example, if you are deploying to a custom Kubernetes cluster), then execute the script as:

```bash
./run_service.sh --build-only
Expand Down
145 changes: 145 additions & 0 deletions analyse_logs.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
import os
import subprocess
import sys
import argparse


def _parse_args():
"""Parse the script arguments."""
parser = argparse.ArgumentParser(description="Analyse agent logs.")

parser.add_argument(
"--service-dir",
default="trader_service",
help="The service directory containing build directories (default: 'trader_service')."
)
parser.add_argument(
"--from-dir",
help="Path to the logs directory. If not provided, it is auto-detected."
)
parser.add_argument(
"--agent",
default="aea_0",
help="The agent name to analyze (default: 'aea_0')."
)
parser.add_argument(
"--reset-db",
action="store_true",
help="Use this flag to disable resetting the log database."
)
parser.add_argument(
"--start-time",
help="Start time in `YYYY-MM-DD H:M:S,MS` format."
)
parser.add_argument(
"--end-time",
help="End time in `YYYY-MM-DD H:M:S,MS` format."
)
parser.add_argument(
"--log-level",
choices=["INFO", "DEBUG", "WARNING", "ERROR", "CRITICAL"],
help="Logging level."
)
parser.add_argument(
"--period",
type=int,
help="Period ID."
)
parser.add_argument(
"--round",
help="Round name."
)
parser.add_argument(
"--behaviour",
help="Behaviour name filter."
)
parser.add_argument(
"--fsm",
action="store_true",
help="Print only the FSM execution path."
)
parser.add_argument(
"--include-regex",
help="Regex pattern to include in the result."
)
parser.add_argument(
"--exclude-regex",
help="Regex pattern to exclude from the result."
)

return parser.parse_args()


def find_build_directory(service_dir):
"""Find the appropriate build directory within the service directory."""
try:
build_dirs = [
d for d in os.listdir(service_dir)
if d.startswith("abci_build_") and os.path.isdir(os.path.join(service_dir, d))
]
return os.path.join(service_dir, build_dirs[0]) if build_dirs else os.path.join(service_dir, "abci_build")
except FileNotFoundError:
print(f"Service directory '{service_dir}' not found")
sys.exit(1)


def run_analysis(logs_dir, **kwargs):
"""Run the log analysis command."""
command = [
"poetry", "run", "autonomy", "analyse", "logs",
"--from-dir", logs_dir,
]
if kwargs.get("agent"):
command.extend(["--agent", kwargs.get("agent")])
if kwargs.get("reset_db"):
command.extend(["--reset-db"])
if kwargs.get("start_time"):
command.extend(["--start-time", kwargs.get("start_time")])
if kwargs.get("end_time"):
command.extend(["--end-time", kwargs.get("end_time")])
if kwargs.get("log_level"):
command.extend(["--log-level", kwargs.get("log_level")])
if kwargs.get("period"):
command.extend(["--period", kwargs.get("period")])
if kwargs.get("round"):
command.extend(["--round", kwargs.get("round")])
if kwargs.get("behaviour"):
command.extend(["--behaviour", kwargs.get("behaviour")])
if kwargs.get("fsm"):
command.extend(["--fsm"])
if kwargs.get("include_regex"):
command.extend(["--include-regex", kwargs.get("include_regex")])
if kwargs.get("exclude_regex"):
command.extend(["--exclude-regex", kwargs.get("exclude_regex")])

try:
subprocess.run(command, check=True)
print("Analysis completed successfully.")
except subprocess.CalledProcessError as e:
print(f"Command failed with exit code {e.returncode}")
sys.exit(e.returncode)
except FileNotFoundError:
print("Poetry or autonomy not found. Ensure they are installed and accessible.")
sys.exit(1)


if __name__ == "__main__":
# Parse user arguments
args = _parse_args()

# Determine the logs directory
if args.from_dir:
logs_dir = args.from_dir
if not os.path.exists(logs_dir):
print(f"Specified logs directory '{logs_dir}' not found.")
sys.exit(1)
else:
# Auto-detect the logs directory
build_dir = find_build_directory(args.service_dir)
logs_dir = os.path.join(build_dir, "persistent_data", "logs")
if not os.path.exists(logs_dir):
print(f"Logs directory '{logs_dir}' not found.")
sys.exit(1)

# Run the analysis
run_analysis(logs_dir, **vars(args))
20 changes: 15 additions & 5 deletions run_service.sh
Original file line number Diff line number Diff line change
Expand Up @@ -832,10 +832,15 @@ command -v docker >/dev/null 2>&1 ||
exit 1
}

docker rm -f abci0 node0 trader_abci_0 trader_tm_0 &> /dev/null ||
containers=$(docker ps --filter name=trader_* -aq) &> /dev/null ||
{ echo >&2 "Docker is not running!";
exit 1
}
if [[ -n "$containers" ]]; then
docker rm -f $containers
fi

docker network prune --force

try_read_storage

Expand Down Expand Up @@ -1287,9 +1292,9 @@ if [ -n "$SUBGRAPH_API_KEY" ]; then
fi

service_dir="trader_service"
build_dir="abci_build"
directory=$(ls -d "$service_dir"/abci_build_???? 2>/dev/null || echo "$service_dir/abci_build")
build_dir=$(basename "$directory")
build_dir_k8s="abci_build_k8s"
directory="$service_dir/$build_dir"

if [ -d $directory ]
then
Expand Down Expand Up @@ -1329,19 +1334,24 @@ if [[ -d "$build_dir_k8s" ]]; then
echo "Directory removed: $build_dir"
fi
export OPEN_AUTONOMY_PRIVATE_KEY_PASSWORD="$password" && poetry run autonomy deploy build --kubernetes "../../$keys_json_path" --n $n_agents -ltm
build_dir=$(ls -d abci_build_???? 2>/dev/null || echo "abci_build")
mv $build_dir $build_dir_k8s
echo "Kubernetes deployment built on ./trader/$service_dir/$build_dir_k8s"

export OPEN_AUTONOMY_PRIVATE_KEY_PASSWORD="$password" && poetry run autonomy deploy build "../../$keys_json_path" --n $n_agents -ltm
build_dir=$(ls -d abci_build_???? 2>/dev/null || echo "abci_build")
echo "Docker Compose deployment built on ./trader/$service_dir/$build_dir"

cd ..

# warm start is disabled as no global weights are provided to calibrate the tools' weights
# warm_start

add_volume_to_service_docker_compose "$PWD/trader_service/abci_build/docker-compose.yaml" "trader_abci_0" "/data" "$path_to_store"
add_volume_to_service_k8s "$PWD/trader_service/abci_build_k8s/build.yaml"
directory="$service_dir/$build_dir"
suffix=${build_dir##*_}
abci_0="trader${suffix}_abci_0"
add_volume_to_service_docker_compose "$PWD/$directory/docker-compose.yaml" "$abci_0" "/data" "$path_to_store"
add_volume_to_service_k8s "$PWD/$service_dir/$build_dir_k8s/build.yaml"
sudo chown -R $(whoami) "$path_to_store"

if [[ "$build_only" == true ]]; then
Expand Down
6 changes: 5 additions & 1 deletion stop_service.sh
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,8 @@
export PYTHONUTF8=1


cd trader; poetry run autonomy deploy stop --build-dir trader_service/abci_build; cd ..
cd trader
service_dir="trader_service"
build_dir=$(ls -d "$service_dir"/abci_build_???? 2>/dev/null || echo "$service_dir/abci_build")
poetry run autonomy deploy stop --build-dir "$build_dir"
cd ..