A Job run can issue a COST message that is picked up by the Data Manager and passed to the corresponding Product/Unit in the attached Account Server. Costs values are interpreted as a COIN
value, typically represented by a Python Decimal, but it can be another numeric form like an integer
or float
.
Integer or Decimal values are encouraged as cost values to avoid any precision issues.
- Costs are either incremental where each cost is added to a running total or they are considered to be a total (the default) where each cost line’s value represents the current total and replaces any previous cost line.
- Costs are +ve, non-zero values
- Cost messages are written by the Pod to
stdout
.
Python
The im-data-manager-job-utilities PyPI package provides a convenient logging class and method to generate COST lines: -
# Import the DM logging utility
from dm_job_utilities.dm_log import DmLog
from decimal import Decimal
# Issue a total cost of 5.7 coins
cost: Decimal = Decimal('5.7')
DmLog.emit_cost(cost)
# Issue an incremental cost of 0.5 coins
cost: Decimal = Decimal('0.5')
DmLog.emit_cost(cost, incremental=True)
Non-Python
Cost lines are written to stdout
. Any line that matches the following pattern will be interpreted by the Data Manager as a cost: -
<iso8601 date> # <level> -COST- <[+]cost> <sequence number>
- The date needs to be recognised by the Python python-dateutil package
- The cost needs to be a number (prefixed with
+
if it’s incremental) - The sequence number must be unique for the all costs generated by the Job