Knowledge base

PMTA knowledge base›Block Global›Directive§ 3.3.1.42

time-first-attempt-hires-timestamp

Global

Milliseconds in the first attempt time
in the configuration this is a linetime-first-attempt-hires-timestamp falseinside the block Global
Sub-second precision where seconds are too coarse

The line adds milliseconds to the first attempt timestamp in accounting records. The default is false, and it applies only when track-time-first-attempt is enabled.

It makes sense on fast nodes. If messages go out in fractions of a second, a timestamp precise to the second shows zero for everyone — and telling “instantly” from “in half a second” becomes impossible. That very difference is the subject of measurement.

Do not confuse it with log-hires-timestamp — that line is about timestamps in the log, this one about a field in accounting. The names are similar, the files differ.

The price is a few characters per record, and only for the record types where the field is present.

The main trap is enabling it without counting. Without track-time-first-attempt the line does nothing: the value it adds a fractional part to simply does not exist. There will be no error.
What the Hub does. It does not write it, although counting itself is enabled: track-time-first-attempt true is in both templates since Aug 30, 2026.

The fractional part would give the Hub nothing now: telemetry calculates delivery time in whole seconds — from timeLogged, timeQueued and totalSecondsQueued, while timeFirstAttempt serves only as a fallback and is also taken to the nearest second.

Recommended values

Enabled together with counting or not at all:

Value When
false (default) counting is off or the node is slow
true counting is on and messages go out in fractions of a second
The false default and the condition “only with counting enabled” come from the manual (§ 3.3.1.42). The argument about fast nodes is ours.
Example configuration
# both lines together: without the first the second does nothing
track-time-first-attempt true
time-first-attempt-hires-timestamp true
The similarly named log-hires-timestamp is about the log, not accounting. They are easy to mix up in the configuration.
yellow — — directive names, blue — blocks. They are highlighted the same way in the text of the card.
▲

Common mistakes and problems

what people get wrong and how it ends2 mistakes▶

Enabling sub-second precision without counting

§ 3.3.1.42

What it costsThe line applies only with track-time-first-attempt enabled. Without it there is nothing to add a fractional part to, and it silently does not work.
How to spot itThe line is there, the first attempt column is empty.
How to do it rightEnable counting; sub-second precision makes sense only together with it.

Confusing it with the sub-second line for the log

our experience

What it costslog-hires-timestamp concerns timestamps in the engine log, this one — the field in accounting. Enabling the wrong line does not give what was expected.
How to spot itMilliseconds appeared in the log but not in accounting — or the other way around.
How to do it rightFor accounting — this line, for the log — log-hires-timestamp.
Compatibility
PowerMTA 6.0
described in the manual of this version · platform: any
The vendor does not state the first version for every directive — there is no note here. The name also appears in the 5.0 edition of the manual.
Reference data
Syntax
time-first-attempt-hires-timestamp <boolean>
Values
yes | no | true | false
Default
false § 3.3.1.42
Applying
reload, no restart needed
Queue
will not touch what is already queued
Where to write it
Global
How many times
once in the block
Everything here comes from the manual, with the section.
Inheritance
No inheritance: the line is written at the root of the file, in the Global section. It applies to all of the node’s accounting records that have the first attempt field.
How to check on the node
We look at the value in accounting itself:
head -3 "$(ls -t /var/log/pmta/acct-*.csv | head -1)"
Three digits after the dot in the first attempt timestamp mean the line works. An empty column means counting is not enabled.
In the Hub
Cost of a mistake
safe: a wrong value breaks nothing
Scenarios
Collect telemetry