categorizeRejectionReason maps a free-text rejection reason to a bounded set of metric labels to keep Prometheus cardinality under control.
(reason string)
| 1729 | // categorizeRejectionReason maps a free-text rejection reason to a bounded set of metric labels |
| 1730 | // to keep Prometheus cardinality under control. |
| 1731 | func categorizeRejectionReason(reason string) string { |
| 1732 | lower := strings.ToLower(reason) |
| 1733 | switch { |
| 1734 | case strings.Contains(lower, "insufficient funds"): |
| 1735 | return "insufficient_funds" |
| 1736 | case strings.Contains(lower, "overdraft limit"): |
| 1737 | return "overdraft_limit" |
| 1738 | case hotpairs.IsLockContentionError(errors.New(reason)): |
| 1739 | return "lock_contention" |
| 1740 | case strings.Contains(lower, "exceeded max"): |
| 1741 | return "max_retries" |
| 1742 | default: |
| 1743 | return "other" |
| 1744 | } |
| 1745 | } |
| 1746 | |
| 1747 | // prepareTransactionForQueue prepares a transaction for queueing by setting status, metadata, |
| 1748 | // and resolving source/destination balances. |