Skip to content
CAI
Software that uses CAICheck a score

esl/amoc

61.3

Weak · 2 October 2026

3.3k

lines of production code

Erlang

primary language

2

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

AMOC is a distributed load testing framework built on Erlang/OTP that orchestrates user scenarios across multiple nodes in a cluster. It provides capabilities for defining state-machine-based protocols, managing distributed user lifecycles, and applying rate-limiting throttles to simulate realistic traffic patterns. The system supports dynamic cluster scaling, coordinated user actions, and comprehensive metrics reporting via Telemetry.

How it got here

2015 — rebar3 migration and telemetry adoption

4 changes.

The project migrated its build system to rebar3 and upgraded to Erlang/OTP 29, standardizing dependency management and tooling. Internal architecture was restructured to replace legacy Exometer metrics and user supervision with a new controller-based design and the Telemetry event system.

2019–2023 — Testing expansion and documentation

6 changes.

This period focused on significantly expanding test coverage for AMOC's core components, configuration handling, and distributed cluster operations through new unit and integration suites. Concurrently, the project released version 3.0 documentation featuring an interactive Livebook guide and detailed instructions for distributed execution and load testing.

2024 — Distributed cluster and coordination infrastructure

5 changes.

This period focused on building the core distributed infrastructure for the AMOC system, introducing modules for cluster management, distributed throttling, and user-group coordination. The work established a scalable architecture with master/slave node discovery, configurable worker pools, and high-performance user lifecycle management to support complex, multi-node test scenarios.

Features

Introduce distributed throttle mechanism with rate limiting and gradual changes

Added a new distributed throttling system (\amoc\_throttle\) that allows limiting user actions by rate (events per interval) or interarrival time (milliseconds between events). The system supports pausing, resuming, and unlocking throttles, as well as applying gradual rate changes via configurable plans. It uses a supervisor tree with a controller, a process pooler, and individual throttle processes to manage concurrency across nodes, ensuring that only allowed actions are executed or scheduled.

src/throttle · high confidence

Introduce user-group coordination with configurable worker pools

Added a new coordination subsystem (\amoc\_coordinator\) that synchronizes actions across groups of users. Users can define a coordination plan specifying how many users (a fixed number, a range, or all) must participate before triggering specific actions. The system manages a pool of worker processes for each coordinator, handling data collection, timeout events, and reset states, while ensuring ordered execution of actions (non-all users first, then all users).

src/coordinator · high confidence

New Amoc v3.0 documentation and interactive guide

The documentation has been updated to version 3.0, introducing a new interactive Livebook guide (\amoc\_livebook.livemd\) that allows users to experiment with load testing scenarios directly in the browser. The guide includes a complete example of a private messaging server, demonstrating how to define a session manager, implement a state-machine-based protocol, and run load tests using Amoc. Additionally, the documentation now covers distributed execution via Docker, detailing how to configure nodes, set up Graphite for metrics, and run scenarios across multiple nodes using \amoc\_dist\. Configuration options are documented, including environment variables and required scenario variables, while the coordinator and throttle modules are explained with examples of coordination plans and rate-limiting strategies.

guides · high confidence

New distributed cluster management and test execution API

Added two new modules, \amoc\_cluster\ and \amoc\_dist\, to support running tests in a distributed Erlang environment. \amoc\_cluster\ implements a gen\_server-based cluster manager that handles node discovery, master/slave role assignment, and connectivity status. \amoc\_dist\ provides a high-level API to orchestrate test scenarios across this cluster, allowing users to start, stop, and dynamically scale user loads across multiple nodes while propagating code and settings.

src/dist · high confidence

Removals

Removed legacy HTTP and XMPP load-test scenarios

The \scenarios\ directory has removed the \http\_req\ module (which handled HTTP requests via the \fusco\ library) and the \mongoose\_simple\ and \mongoose\_simple\_with\_metrics\ modules (which implemented XMPP load tests using \escalus\ and \exometer\). The sample \rebar.config\ file for these scenarios has also been deleted, indicating these specific test harnesses are no longer part of the project.

scenarios · high confidence

Behavioural changes

Introduce local/global configuration scope and binary description support

The configuration system now supports a scope attribute (local or global) for configuration parameters, enabling global settings to be propagated from the master node to slave nodes in a cluster. Additionally, the description field for required variables is now accepted as binary data, resolving previous validation issues.

src/config · high confidence

Introduce pooled user supervision with optimized lifecycle management

The user management system has been restructured to use a pool of worker supervisors (\amoc\_users\_worker\_sup\) managed by a top-level supervisor (\amoc\_users\_sup\). This change distributes user instances across multiple supervisors based on their ID, allowing for more efficient parallel startup and shutdown of users. User counts are now tracked using atomics for high-performance concurrent access, and the system ensures proper encapsulation and termination handling for user processes, improving scalability and reliability when managing many concurrent users.

src/users · high confidence

Migrate to rebar3 and upgrade to Erlang/OTP 29

The project has migrated its build system from legacy rebar to rebar3, enabling support for Erlang/OTP 29 and requiring OTP 23.0 or later. This change simplifies the dependency management by replacing the previous complex dependency tree (including escalus, lager, exometer, and lhttpc) with a minimal set of dependencies centered on telemetry. The build process is now standardized via a new Makefile and rebar.config, which also introduces new tooling for documentation generation (ex\_doc), linting, and code coverage analysis.

(repo-wide) · high confidence

Removal of legacy Exometer metrics configuration

The application no longer includes the default Exometer configuration file, removing predefined Erlang system metrics (such as port and process counts, and memory usage) and the setup for reporting these metrics to a Graphite instance at 10.100.0.70. This change aligns with the migration from the abandoned exometer library to exometer\_core, meaning users relying on this specific default metrics reporting setup will need to reconfigure their metrics collection.

priv · high confidence

Replaced legacy user supervision and metrics with a new controller, code server, and telemetry system

The application's internal architecture has been significantly restructured. The previous \amoc\_user\ and \amoc\_users\_sup\ modules, which handled user spawning and metrics via \exometer\, have been removed. They are replaced by a new \amoc\_controller\ (a gen\_server managing scenario state and user counts), an \amoc\_code\_server\ (handling module loading and distribution), and an \amoc\_throttle\_sup\ (managing user spawn rates). The supervision tree in \amoc\_sup\ now starts these new components using a \one\_for\_all\ strategy. Additionally, the application has switched from \exometer\ to \telemetry\ for event reporting, and the \amoc\ API has been updated to interact with the new controller for starting, stopping, and managing scenarios.

src · high confidence

Fixes

Add OTP 21-compatible logger configuration

The release configuration now includes a logger setup compatible with OTP 21, configuring both console and file handlers with a specific time, level, and message template.

rel · high confidence

Test coverage

Added comprehensive test suites for AMOC core components; New integration test for AMOC distributed user management; New integration test scenario with variable scoping and verification; New integration test suite for AMOC cluster operations.

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Score

  • CAI 63 → 61 (-2.1)
  • Rubric changed (rubric-2026.09.12 → rubric-2026.09.18) — scores are not directly comparable.

Lenses

  • Code Health 98 → 98 (+0.0)
  • Architecture 92 → 93 (+1.3)
  • Maturity 49 → 49 (+0.0)
  • Readiness 80 → 59 (-21.3)
  • Security 66 → 77 (+11.5)

Resolved (2)

  • Coverage not measured — no coverage collector is wired up
  • Off-boarding risk: anonymized user #1

New (4)

  • Documentation: no contributor guidance (README.md)
  • Documentation: no project overview (README.md)
  • Off-boarding risk: anonymized user #1
  • Outdated: telemetry

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

esl/amoc was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 2 October 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 36b0946efbddefcc0120d90bfd86dfd5fd3be536 — the exact code this score is about.
  • Scored under rubric-2026.09.18 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-e569280dd5e2.