Skip to main content
The exporter API is the track machine’s local service layer, and it serves two unrelated jobs from one process. It answers the dashboard by querying InfluxDB and writing STL exports, and it receives DAQ run uploads from the karts and puts them in S3. It listens on port 5432, and the same code is also built as the conversion Lambda that runs in AWS. See Deployment and the Pipeline.

The Two Jobs

These share nothing but the process. A fault in one does not imply a fault in the other, and the logs are split on that basis.

Endpoints

Live Monitoring

The stats endpoint returns more than readings. Alongside batteryStats it reports secondsSinceValid, a dataIsShownButOutdated flag raised when the newest reading is more than 2 minutes old, and errorGettingStats when the query itself failed.
Those three fields are why the dashboard can distinguish stale data from absent data from a broken query, which are three different faults. The 15 minute window and the 2 minute threshold are hard coded rather than configurable.
/regions raises rather than defaulting if HUB_REGIONS or HUB_REGION are not set on the container, so a machine missing either fails the region selector outright. That is deliberate: guessing a region would file exports in the wrong place.

Charging Export

That sequence is the export, and Charging Export covers what each step does to the data.
The export endpoint returns HTTP 500 with an error field when a run fails to export, and the failure is logged to the charging log. A part-completed export leaves whatever it already wrote in the local folder, so a retry can find files from the previous attempt already present.

DAQ Upload

The kart identifies itself with a kart-id request header. See Upload and Conversion for the zip contents, the metadata fields and the run numbering.

How The Logs Are Split

Requests are logged on the way in and the way out, into three files under the container’s logs/ folder:
The split is decided purely by the presence of the kart-id header, not by the path. So anything that reaches the API without that header lands in the charging log regardless of what it was doing. When you cannot find a request, check the combined log rather than assuming it never arrived.
All three sync to S3 with the rest of the track logs every 30 minutes. See Track Operations.

Key Files

All paths are under telemetry/telemetry-api/ in can-wifi.
Last modified on September 8, 2026