Before you report a problem¶
A SatL bug report is worth roughly what its log excerpt is worth. Everything below is about collecting an excerpt that answers the next three questions without another round trip.
Two rules to apply before you paste anything:
grep -a, and read the rotated files too. A report saying "the daemon logged nothing" is nearly always a report where one of the two traps fired.- Pin the excerpt to an identity, not to a time window. A task ID, a service ID, a node ID. SatL IDs are 25 characters of base36 and a task is one-shot, so a grep on one can only be about the thing you mean.
What to collect¶
1. What is running¶
satl version
uname -a
freebsd-version -kru
sudo grep -a 'starting satld' /var/log/messages | tail -1
The startup banner is one line and carries the effective configuration: version, git commit, config file and whether it was actually read, socket path, state dir, ZFS root, node name, pf_mode, listen and advertise addresses, and the certificate validity in force.
It is the single most useful line in a report, and it is the one most likely to have been rotated away — read the archives if it is not in the live file.
2. What the daemon said¶
Rotation-aware, ASCII-safe, pinned to an identity:
{ for f in $(ls -tr /var/log/messages.*.bz2 2>/dev/null); do bzcat "$f"; done
cat /var/log/messages; } 2>/dev/null | grep -a satld > /tmp/satld-full.log
grep -a '<task or node or service id>' /tmp/satld-full.log > /tmp/satld-excerpt.log
Include the excerpt and the count of errors in the full file, which tells a reader whether the daemon is unhappy in general or only about your object:
If the daemon is reproducibly wrong, re-run with more detail.
RUST_LOG wins over the configured level, and JSON is easier to hand to someone else:
sysrc satld_env="RUST_LOG=satld=debug,satl_cluster=debug,satl_dispatcher=debug"
sysrc satld_flags="--log-format json"
service satld restart
3. What the host looks like¶
The four facts that explain most "it works on my machine" divergence:
sysctl kern.racct.enable net.inet.ip.forwarding
zfs list -o name,mountpoint,used | grep -i satl
kldstat -m if_vxlan ; kldstat -m linux
pfctl -s info | head -3 ; pfctl -a 'satl/*' -s all
Plus, when networking is involved at all:
ifconfig -a
netstat -rn | grep default
netstat -s -p ip | grep -i fragment # host stack: outer fragmentation
4. What the cluster thinks¶
On a manager:
satl node ls
satl service ls
satl service ps <the service>
satl service inspect <the service>
satl network ls
Say which node each command was run on
A worker answers Docker's This node is not a swarm manager. for most of these, and a manager reports its own view of node-local things — health, a network's gateway.
"Which node" is part of the data.
And do not report the MANAGER STATUS column as evidence of who leads: it is written when the cluster forms and never refreshed (why).
Read leadership from the log.
5. The smallest thing that reproduces it¶
The most valuable line in a report is the command that shows the problem. If the problem needs a cluster, say how many nodes and which roles; if it needs an image, name one that is publicly pullable, or describe the entrypoint and the platform of yours.
What not to paste¶
| Never | Why |
|---|---|
| a join token | it is a credential. Redact everything after SATL-1- |
the contents of <state_dir>/raft/dek |
it is the key that encrypts the Raft log and snapshots at rest — treat it like a private key |
private keys under <state_dir>/certs |
the certificates themselves are fine; the keys are not |
| secret or config payloads | names are fine and appear in the log by design; payloads never do |
A secret payload in /var/log/messages is itself the bug
Secret names appear in the daemon log (materialized dependency payload, secret assigned/withdrawn).
A payload byte sequence must never appear there.
If you find one, that is the report — say so plainly, and do not attach the log to a public tracker.
Things that are expected and are not bugs¶
Save yourself the round trip. All of these are documented behaviour:
| You see | Read |
|---|---|
a container dataset still present a minute after satl rm |
containers |
a published port refusing on localhost of the publishing node |
node-local networking |
| a node with no replica of a service not answering its published port | node-local networking |
satl service ls reading 8/6 while a node is down |
the cluster |
a dead node still shown as Leader |
the cluster |
| a returned node staying empty after a drain | the cluster |
start refused on a stopped container |
containers |
--privileged and friends rejected with a 400 |
containers |
PreviousSpec empty after an automatic rollback |
the cluster |
Things that are always bugs¶
Report these on sight, with the line that shows them:
- two timestamps, or two
{, on one log line — one event is one line by construction (why); M-^escape sequences in a log line — a message escaped the ASCII-only rule;- ANSI colour escapes in a log file — colour is emitted only to a terminal;
- a background loop's span nested under another span, or the same span twice in one chain (why);
- a secret payload anywhere in the log;
- a task id in a
published ports convergedline after that node's ownpublished ports removedfor it (why).
Where to send it¶
Issues go to the SatL repository: https://github.com/fredericalix/satl/issues. A fix to this documentation goes to https://github.com/fredericalix/satl-doc — every page has an edit link in its top-right corner, which is the shortest path for a wrong sentence.
SatL is at 0.1.0-beta and the gaps people actually walk into are the ones worth closing first, so a report of the shape described above is genuinely useful — and a report saying "this worked, on this hardware, with this workload" is worth more than you would think.