Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
212 changes: 212 additions & 0 deletions apps/hellgate/TRACING.org
Original file line number Diff line number Diff line change
@@ -0,0 +1,212 @@
* 袗泻褌懈胁薪芯褋褌懈

袩芯褋泻芯谢褜泻褍 锌芯褟胁谢械薪懈械 薪械泻芯褌芯褉褘褏 邪泻褌懈胁薪芯褋褌械泄 懈薪胁芯泄褋邪/锌谢邪褌械卸邪 胁 锌褉芯褑械褋褋懈薪谐械 芯锌褉械写械谢褟械褌褋褟 写懈薪邪屑懈褔械褋泻懈 薪邪 芯褋薪芯胁械 芯褌泻谢懈泻芯胁 芯褌 写褉褍谐懈褏 褔邪褋褌械泄 褋懈褋褌械屑褘, 褋斜芯械胁 懈 懈蟹屑械薪械薪懈泄 泻芯薪褎懈谐褉褍邪褑懈懈, 褌芯 褋褌芯懈褌 胁芯蟹屑芯卸薪芯 褉邪褋褋屑芯褌褉懈胁邪褌褜 褌褉邪褋褋懈褉芯胁泻褍 斜懈蟹薪械褋 谢芯谐懈泻懈 泻邪泻 褌褉邪褋褋懈褉芯胁泻褍 芯褌写械谢褜薪褘褏 褋褑械薪邪褉懈械胁 锌褉芯褑械褋褋懈薪谐邪. 袠 泻邪泻 褋谢械写褋褌胁懈械 褋褉邪蟹褍 写芯斜邪胁谢褟褌褜 胁 懈薪褋褌褉褍屑械薪褌褘 褌褉邪褋褋懈褉芯胁泻懈 泻芯褉-褋械褉胁懈褋邪 锌褉芯褑械褑褋褋懈薪谐邪 褍锌褉邪胁谢械薪懈械 褝褌懈屑懈 褋褑械薪邪褉懈褟屑懈.

袣邪泻 锌褉懈屑懈褌懈胁薪褘泄 褋褑械薪邪褉懈泄 褌褉邪褋褋懈褉芯胁泻懈 锌褉械写谢邪谐邪褞 褉邪褋褋屑芯褌褉械褌褜 褌褉邪褋褋懈褉芯胁泻褍 胁褋械褏 邪泻褌懈胁薪芯褋褌械泄 泻邪泻 褋锌邪薪芯胁 懈 褋 泻谢褞褔械胁褘屑懈 斜懈蟹薪械褋-褋芯斜褘褌懈褟屑懈 泻邪泻 褋芯斜褘褌褟屑懈 胁薪褍褌褉懈 褝褌懈褏 褋锌邪薪芯胁, 邪 锌邪褉邪屑械褌褉懈蟹邪褑懈褞 褌邪泻芯谐芯 褋褑械薪邪褉懈褟 蟹邪褏邪褉写泻芯写懈褌褜 泻邪泻 薪邪斜芯褉 褎谢邪谐芯胁: 泻邪泻褍褞 邪泻褌懈胁薪芯褋褌褜 蟹邪锌懈褋褘胁邪械屑 / 泻邪泻褍褞 懈谐薪芯褉懈褉褍械屑.

** 袠薪胁芯泄褋

袙胁懈写褍 褌芯谐芯 褔褌芯 褋褍褖薪芯褋褌懈 锌谢邪褌械卸械泄 薪械 械写褍褌 薪邪 屑邪褕懈薪邪褏 芯褌写械谢褜薪褘褏 芯褌 褋褍褖薪芯褋褌懈 懈薪胁芯泄褋邪, 褌芯 薪械 胁芯蟹屑芯卸薪芯褋褌懈 胁褘薪械褋褌懈 锌褉芯褑械褋褋懈薪谐 锌谢邪褌械卸邪 懈薪胁芯褋邪 褋 ~activity = {payment, payment_id()}~ 胁 芯褌写械谢褜薪褘泄 褑械谢褜薪褘泄 褋锌邪薪.

*** "creating invoice"

协褌邪 邪泻褌懈胁薪芯褋褌褜 胁褘锌芯谢薪褟械褌褋褟 胁 褉邪屑泻邪 ~init~ 胁褘蟹芯胁邪 屑邪褕懈薪褘. 肖邪泻褌懈褔械褋泻邪褟 懈薪懈褑懈邪谢懈蟹邪褑懈褟 芯斜褗械泻褌邪 褋褍褖薪芯褋褌懈.

袩械褉械胁芯写 胁 ~activity = invoice~.

*** "invoice expiration"

孝邪泄屑邪褍褌 屑邪褕懈薪褘 褋褍褖薪芯褋褌懈 泻芯谐写邪 薪械褌 邪泻褌懈胁薪芯褋褌械泄 锌芯 锌褉芯褑械褋褋懈薪谐邪 锌谢邪褌械卸械泄. 孝芯 械褋褌褜 泻芯谐写邪 ~activity = invoice~. 袙 褋谢褍褔邪械 械褋谢懈 胁 写邪薪薪褘泄 屑芯屑械薪褌 锌褉芯懈褋褏芯写懈褌 锌褉芯褑械褋褋懈薪谐 锌谢邪褌械卸邪, 褌芯 胁 褋芯褋褌芯褟薪懈懈 褋褍褖薪芯褋褌懈 懈薪胁芯泄褋邪 胁 锌褉芯褑械褋褋芯褉械 斜褍写械褌 ~activity = {payment, payment_id()}~.

** 袩谢邪褌褢卸

小芯蟹写邪薪懈械 褋锌邪薪芯胁 锌谢邪褌械卸邪 锌褉芯懈蟹胁芯写懈褌褋褟 薪邪 芯褋薪芯胁械 褌械泻褍褖懈褏 懈褋锌芯谢薪褟械屑褘 邪泻褌懈胁薪芯褋褌械泄 胁薪褍褌褉懈 褉械邪谢懈蟹邪褑懈懈 锌褉芯褑械褋褋芯褉邪 屑邪褕懈薪褘.

小谢械写褍褞褖懈械 褋锌械泻懈 芯锌懈褋褘胁邪褞 胁芯蟹屑芯卸薪褘械 蟹薪邪褔械薪懈褟 邪泻褌懈胁薪芯褋褌懈 锌芯 锌谢邪褌械卸褍.

#+begin_src erlang

-type activity() ::
payment_activity()
| {refund, refund_id()}
| adjustment_activity()
| chargeback_activity()
| idle.

-type payment_activity() :: {payment, payment_step()}.

-type adjustment_activity() ::
{adjustment_new, adjustment_id()}
| {adjustment_pending, adjustment_id()}.

-type chargeback_activity() :: {chargeback, chargeback_id(), chargeback_activity_type()}.

-type chargeback_activity_type() :: hg_invoice_payment_chargeback:activity().

-type payment_step() ::
new
| shop_limit_initializing
| shop_limit_failure
| shop_limit_finalizing
| risk_scoring
| routing
| routing_failure
| cash_flow_building
| processing_session
| processing_accounter
| processing_capture
| processing_failure
| updating_accounter
| flow_waiting
| finalizing_session
| finalizing_accounter.

#+end_src

袠蟹 褝褌芯谐芯 褋谢械写褍械褌 褔褌芯 邪写卸邪褋褌屑械薪褌褘, 褔邪褉写卸斜械泻懈 懈 褉械褎邪薪写褘 芯褋褍褖械褋褌胁谢褟褞褌褋褟 泻邪泻 褋芯芯褌胁械褌褋褌胁褍褞褖懈械 邪泻褌懈胁薪芯褋褌懈 褋褍褖薪芯褋褌懈 锌谢邪褌械卸邪.

袛邪谢械械 邪泻褌懈胁薪芯褋褌懈 褍泻邪蟹邪薪褘 胁 锌芯褉褟写泻械 懈褏 胁褘锌芯谢薪械薪懈褟 胁 褉邪屑泻邪褏 芯斜褋谢褍卸懈胁邪薪懈褟 锌谢邪褌械卸邪.

*** "initializing payment"

袙褘蟹芯胁 ~init~ 褎褍薪泻褑懈懈 锌褉懈 胁褘蟹芯胁械 泻 屑邪褕懈薪械 懈薪胁芯泄褋邪 写谢褟 褋芯蟹写邪薪懈褟 锌谢邪褌械卸邪. 袙褋械 锌芯褋谢械写褍褞褖懈械 邪泻褌懈胁薪芯褋褌懈 胁褘锌芯谢薪褟褞褌褋褟 锌褉懈 褌邪泄屑邪褍褌-褋懈谐薪邪谢邪褏 屑邪褕懈薪褘.

*** "new"

袧械 "褌邪泄屑邪褍褌薪邪褟" 邪泻褌懈胁薪芯褋褌褜, 褝褌芯 褎邪泻褌懈械褔械褋泻懈 懈 械褋褌褜 =initializing payment=.

*** "shop limit initializing"

校写械褉卸邪薪懈械 谢懈屑懈褌芯胁 锌芯 屑邪谐邪蟹懈薪褍.

孝褍褌 械褋褌褜 懈薪褎芯褉屑邪褑懈褟 芯 谢懈屑懈褌邪褏. 袠 褌邪泻 泻邪泻 褌褍褌 锌褉芯懈褋褏芯写懈褌 锌褉芯胁械褉泻邪 锌械褉械锌芯谢薪械薪懈褟 褌芯 屑芯卸薪芯 写芯斜邪胁懈褌褜 胁 褋锌邪薪褘 懈谢懈 褋芯斜褘褌懈褟 褌褉邪褋褋懈褉芯胁泻懈 泻芯薪褌械泻褋褌薪褘械 写邪薪薪褘械 锌芯 蟹邪褌褉芯薪褍褌褘屑 谢懈屑懈褌邪屑.

*** "shop limit failure"

袙褘斜褉芯褋 斜懈蟹薪械褋-芯褕懈斜泻懈 锌械褉械锌芯谢薪械薪懈褟 芯写薪芯谐芯 懈谢懈 薪械褋泻芯谢褜泻懈褏 谢懈屑懈褌芯胁 屑邪谐邪蟹懈薪邪.

*** "shop limit finalizing"

袩芯写褌胁械褉卸写械薪懈械 芯斜薪芯胁谢械薪懈褟 (泻芯屑屑懈褌) 谢懈屑懈褌芯胁 屑邪谐邪蟹懈薪邪.

*** "risk scoring"

袨锌褉芯褋 懈薪褋锌械泻褌芯褉邪, 芯褑械薪泻懈 褉懈褋泻邪 锌谢邪褌械卸邪.

协褌芯褌 褕邪谐 屑芯卸械褌 斜褘褌褜 锌褉芯锌褍褖械薪 锌褉懈 懈褋锌芯谢褜蟹胁邪薪懈懈 褋褑械薪邪褉懈褟 锌芯褔懈薪泻懈.

*** "routing"

袙褘斜芯褉 褋芯谐谢邪褋薪芯 薪械泻芯褌芯褉褘屑 褍褋谢芯胁懈褟 锌芯写褏芯写褟褖械谐芯 屑邪褉褕褉褍褌邪 (锌褉芯胁邪泄写械褉邪 懈 褌械褉屑懈薪邪谢邪) 写谢褟 芯褋褍褖械褋褌胁谢械薪懈褟 薪械锌芯褋褉械写褋褌胁械薪薪褘褏 锌褉芯胁芯写芯泻 褔械褉械蟹 API 斜邪薪泻芯胁.

*** "routing failure"

袨褌泻邪褌 胁芯蟹屑芯卸薪芯 锌褉械卸写械 褍写械褉卸邪薪薪褘褏 谢懈屑懈褌芯胁 薪邪 褕邪谐械 胁褘斜芯褉邪 屑邪褉褕褉褍褌邪. 协褌邪 邪泻褌懈胁薪芯褋褌褜 锌褉芯懈褋褏芯写懈褌 泻芯谐写邪 薪械 斜褘谢 薪邪泄写械褌 锌芯写褏芯写褟褖懈泄 屑邪褉褕褉褍褌 懈 锌谢邪褌褢卸 胁锌芯褋谢械写褋褌胁懈懈 斜褍写械褌 锌褉懈蟹薪邪薪 薪械褍褋锌械褕薪褘屑 褋 锌褉懈褔懈薪芯泄 褎芯褉屑褍谢懈褉褍械屑芯泄 薪邪 褝褌芯屑 褕邪谐械.

*** "cash flow building"

袟薪邪褟 锌褉芯胁邪泄写械褉邪 懈 械谐芯 褍褋谢芯胁懈褟 胁 褝褌芯泄 邪泻褌懈胁薪芯褋褌懈 锌谢邪褌械卸邪 褎芯褉屑懈褉褍械褌褋褟 薪邪斜芯褉 锌褉芯胁芯写芯泻 褉械谐懈褋褌懈褉褍褞褖懈褏 锌谢邪褌褢卸 胁 褋懈褋褌械屑械.

孝褍褌 胁褘锌芯谢薪褟褞褌褋褟 褋谢械写褍褞褖懈械 写械泄褋褌胁懈褟 褋 锌芯斜芯褔薪褘屑 褝褎褎械泻褌邪屑 蟹邪 锌褉械写械谢邪屑懈 锌褉芯褑械褋褋芯褉邪:

- 芯褌屑械薪褟褞褌褋褟 褍写械褉卸邪薪懈褟 谢懈屑懈褌芯胁 蟹邪褌褉芯薪褍褌褘褏 锌芯 写褉褍谐懈屑 褉邪褋褋屑芯褌褉械薪薪褘屑, 薪芯 薪械 锌芯写芯褕械写褕懈屑 锌芯 褌械屑 懈谢懈 懈薪褘屑 锌褉懈褔懈薪邪屑, 屑邪褉褕褉褍褌邪屑;

- 胁 锌芯写褋懈褋褌械屑械 斜褍褏谐邪谢褌械褉褋泻芯谐芯 褍褔褢褌邪 褉械谐懈褋褌褉懈褉褍褞褌褋褟 褋褎芯褉屑懈褉芯胁邪薪薪褘械 锌褉芯胁芯写泻懈.

袛谢褟 褌褉邪褋褋懈褉芯胁泻懈 屑芯谐褍褌 斜褘褌褜 懈薪褌械褉械褋薪褘 写邪薪薪褘械 芯斜 邪泻泻邪褍薪褌邪褏 懈 写胁懈卸械薪懈褟褏 褍褔邪胁褋褌胁褍褞褖懈褏 胁 锌褉芯胁芯写泻邪褏.

小邪屑懈 锌褉芯胁芯写泻懈 褝褌芯 褋锌懈褋芯泻 褋褌褉褍泻褌褍褉, 泻芯褌芯褉褘械 屑芯卸薪芯 锌芯锌褉芯斜芯胁邪褌褜 胁褘褉邪蟹懈褌褜 胁 胁懈写械 =json= 懈 邪褌褉懈斜褍褌芯胁 褋锌邪薪邪 懈谢懈 褋芯斜褘褌懈褟.

#+begin_src thrift

struct FinalCashFlowPosting {
1: required FinalCashFlowAccount source
2: required FinalCashFlowAccount destination
3: required Cash volume
4: optional string details
}

#+end_src

*** TODO "processing session"

袨褋褍褖械褋褌胁谢褟械褌褋褟 薪械锌芯褋褉械写褋褌胁械薪薪芯械 芯斜褉邪褖械薪懈械 泻 胁薪械褕薪械屑褍 锌芯 芯褌薪芯褕械薪懈褞 泻 锌褉芯褑械褋褋芯褉褍 邪写邪锌褌械褉褍 胁蟹邪懈屑芯写械泄褋褌胁懈褟 褋 斜邪薪泻芯胁褋泻芯泄 褋懈褋褌械屑芯泄.

袙 懈薪褌械褉械褋邪褏 褌褉邪褋褋懈褉芯胁泻懈 屑芯卸械褌 斜褘褌褜 懈薪褌械褉械褋薪芯 芯斜械褉薪褍褌褜 褋锌邪薪邪屑 写芯褔械褉薪械泄 褋褍褖薪芯褋褌懈 锌谢邪褌械卸邪 -- 褋械褋褋懈懈. 小械褋褋懈懈 褉邪蟹谢懈褔懈屑褘 胁 褉邪屑泻邪褏 芯写薪芯谐芯 锌谢邪褌械卸邪 懈 懈屑械褞 褋胁芯懈 薪械蟹邪胁懈褋懈屑褘械 邪泻褌懈胁薪芯褋褌懈 懈褋锌芯谢薪褟械屑褘械 胁 褝褌芯屑 褋锌邪薪械 锌谢邪褌械卸邪.

*** TODO "processing accounter"

*** "processing capture"

袨斜褉邪斜芯褌泻邪 锌芯褋谢械 锌芯写褌胁械褉卸写械薪懈械 锌芯谢褍褔械薪懈褟 锌谢邪褌械卸邪 芯褌 邪写邪锌褌械褉邪. 袙 褔邪褋褌薪芯褋褌懈 锌褉芯胁械褉泻懈 锌芯谢褍褔械薪懈褟 锌芯谢薪芯谐芯 懈谢懈 褔邪褋褌懈褔薪芯谐芯 锌谢邪褌械卸邪.

*** "processing failure"

袨斜褉邪斜芯褌泻邪 薪械褍褋锌械褏邪 锌谢邪褌械卸邪 谢懈斜芯 锌芯 褉械蟹褍谢褜褌邪褌邪屑 芯斜褖械薪懈褟 褋 邪写邪锌褌械褉芯屑 (褌芯 械褋褌褜 褍卸械 懈屑械谢邪 屑械褋褌芯 褋械褋褋懈褟), 谢懈斜芯 薪邪 褝褌邪锌械 屑邪褉褕褉褍褌懈蟹邪褑懈懈, 谢懈斜芯 锌芯锌褘褌泻懈 褍写械褉卸邪薪懈褟 谢懈屑懈褌芯胁 屑邪谐邪蟹懈薪邪.

*** "updating accounter"

袨斜薪芯胁谢械薪懈械 锌褉芯胁芯写芯泻 懈 褋褌邪褉褌 褋械褋褋懈懈 薪邪 锌芯谢褍褔械薪懈褟 锌谢邪褌械卸邪 胁 邪写邪锌褌械褉械 胁 褋谢褍褔邪械 械褋谢懈 懈屑械谢芯 屑械褋褌芯 懈蟹屑械薪械薪懈械 褋褍屑屑褘 锌谢邪褌械卸邪. 袧邪锌褉懈屑械褉 锌褉懈 泻芯褉褉械泻褌懈褉芯胁泻械.

*** TODO "flow waiting"

*** TODO "finalizing session"

*** TODO "finalizing accounter"

** TODO 效邪褉写卸斜械泻懈

*** "preparing initial chargeback cash flow"

*** "updating chargeback"

*** "updating chargeback cash flow"

*** "finalizing chargeback accounter"

** 袙芯蟹胁褉邪褌褘

袩褉懈 褋芯蟹写邪薪懈懈 褉械褎邪薪写邪 屑芯卸薪芯 褋械褉懈邪谢懈蟹芯胁褘胁邪褌褜 械谐芯 锌邪褉邪屑械褌褉褘 胁 邪褌褉懈斜褍褌褘 褋锌邪薪邪 懈谢懈 褋芯斜褘褌懈褟 褌褉邪褋褋懈褉芯胁泻懈.

#+begin_src thrift

struct InvoicePaymentRefund {
1 : required InvoicePaymentRefundID id
2 : required InvoicePaymentRefundStatus status
3 : required base.Timestamp created_at
4 : required DataRevision domain_revision
7 : optional PartyRevision party_revision
6 : optional Cash cash
5 : optional string reason
8 : optional InvoiceCart cart
9 : optional string external_id
10: optional Allocation allocation
}

#+end_src

*** TODO "processing refund"

** 袣芯褉褉械泻褌懈褉芯胁泻懈

袩褉懈 褋芯蟹写邪薪懈懈 泻芯褉褉械泻褌懈褉芯胁泻懈 屑芯卸薪芯 褋芯蟹写邪胁邪褌褜 褋芯斜褘褌懈械 懈 写芯斜邪胁谢褟褌褜 胁 泻邪褔械褋褌胁械 邪褌褉懈斜褍褌芯胁 KV 锌邪褉邪屑械褌褉褘 褋邪屑芯泄 泻芯褉褉械泻褌懈褉芯胁泻懈.

#+begin_src thrift

struct InvoicePaymentAdjustment {
1: required InvoicePaymentAdjustmentID id
2: required InvoicePaymentAdjustmentStatus status
3: required base.Timestamp created_at
4: required DataRevision domain_revision
5: required string reason
6: required FinalCashFlow new_cash_flow
7: required FinalCashFlow old_cash_flow_inverse
8: optional PartyRevision party_revision
9: optional InvoicePaymentAdjustmentState state
}

#+end_src

*** TODO "processing new adjustment"

*** TODO "capturing pending adjustment"
10 changes: 8 additions & 2 deletions apps/hellgate/src/hg_invoice.erl
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@
-include("domain.hrl").
-include("hg_invoice.hrl").

-include_lib("opentelemetry_api/include/otel_tracer.hrl").
-include_lib("opentelemetry_api/include/opentelemetry.hrl").

-include_lib("damsel/include/dmsl_repair_thrift.hrl").

-define(NS, <<"invoice">>).
Expand Down Expand Up @@ -303,8 +306,11 @@ handle_signal(timeout, St = #st{activity = {payment, PaymentID}}) ->
PaymentSession = get_payment_session(PaymentID, St),
process_payment_signal(timeout, PaymentID, PaymentSession, St);
handle_signal(timeout, St = #st{activity = invoice}) ->
% invoice is expired
handle_expiration(St).
SpanOpts = #{kind => ?SPAN_KIND_INTERNAL, attributes => #{<<"hg.business_logic">> => true}},
?with_span(<<"invoice expiration">>, SpanOpts, fun(_SpanCtx) ->
% invoice is expired
handle_expiration(St)
end).

construct_repair_action(CA) when CA /= undefined ->
lists:foldl(
Expand Down
109 changes: 92 additions & 17 deletions apps/hellgate/src/hg_invoice_payment.erl
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@
-include_lib("hellgate/include/domain.hrl").
-include_lib("hellgate/include/allocation.hrl").

-include_lib("opentelemetry_api/include/otel_tracer.hrl").
-include_lib("opentelemetry_api/include/opentelemetry.hrl").

-include("hg_invoice_payment.hrl").

%% API
Expand Down Expand Up @@ -410,15 +413,17 @@ get_chargeback_opts(#st{opts = Opts} = St) ->

-spec init(payment_id(), _, opts()) -> {st(), result()}.
init(PaymentID, PaymentParams, Opts) ->
scoper:scope(
payment,
#{
id => PaymentID
},
fun() ->
init_(PaymentID, PaymentParams, Opts)
end
).
?with_span(<<"initializing payment">>, mk_default_span_opts(), fun(_SpanCtx) ->
scoper:scope(
payment,
#{
id => PaymentID
},
fun() ->
init_(PaymentID, PaymentParams, Opts)
end
)
end).

-spec init_(payment_id(), _, opts()) -> {st(), result()}.
init_(PaymentID, Params, Opts = #{timestamp := CreatedAt}) ->
Expand Down Expand Up @@ -1827,8 +1832,11 @@ process_signal(timeout, St, Options) ->
).

process_timeout(St) ->
Action = hg_machine_action:new(),
repair_process_timeout(get_activity(St), Action, St).
Activity = get_activity(St),
maybe_with_activity_span(Activity, fun() ->
Action = hg_machine_action:new(),
repair_process_timeout(Activity, Action, St)
end).

-spec process_timeout(activity(), action(), st()) -> machine_result().
process_timeout({payment, shop_limit_initializing}, Action, St) ->
Expand Down Expand Up @@ -2020,18 +2028,36 @@ process_routing(Action, St) ->
handle_choose_route_error(Error, [], St, Action)
end.

-define(ROUTING_SPAN(Name, Fun), fun(A) ->
?with_span(Name, mk_default_span_opts(), fun(_SpanCtx) ->
Fun(A)
end)
end).

run_routing_decision_pipeline(Ctx0, VS, St) ->
hg_routing_ctx:pipeline(
Ctx0,
[
fun(Ctx) -> filter_attempted_routes(Ctx, St) end,
?ROUTING_SPAN(<<"excluding attempted routes">>, fun(Ctx) ->
filter_attempted_routes(Ctx, St)
end),
%% Since this is routing step then current attempt is not yet
%% accounted for in `St`.
fun(Ctx) -> filter_routes_with_limit_hold(Ctx, VS, get_iter(St) + 1, St) end,
fun(Ctx) -> filter_routes_by_limit_overflow(Ctx, VS, St) end,
fun(Ctx) -> hg_routing:filter_by_blacklist(Ctx, build_blacklist_context(St)) end,
fun hg_routing:filter_by_critical_provider_status/1,
fun hg_routing:choose_route_with_ctx/1
?ROUTING_SPAN(<<"holding limits">>, fun(Ctx) ->
filter_routes_with_limit_hold(Ctx, VS, get_iter(St) + 1, St)
end),
?ROUTING_SPAN(<<"checking limits overflows">>, fun(Ctx) ->
filter_routes_by_limit_overflow(Ctx, VS, St)
end),
?ROUTING_SPAN(<<"filtering blacklisted">>, fun(Ctx) ->
hg_routing:filter_by_blacklist(Ctx, build_blacklist_context(St))
end),
?ROUTING_SPAN(<<"rejecting routes with critical provider status">>, fun(Ctx) ->
hg_routing:filter_by_critical_provider_status(Ctx)
end),
?ROUTING_SPAN(<<"choosing best scored route">>, fun(Ctx) ->
hg_routing:choose_route_with_ctx(Ctx)
end)
]
).

Expand Down Expand Up @@ -3968,6 +3994,55 @@ get_route_cascade_behaviour(Route, Revision) ->
#domain_Provider{cascade_behaviour = Behaviour} = hg_domain:get(Revision, {provider, ProviderRef}),
Behaviour.

maybe_with_activity_span(Activity, Fun) ->
case mk_activity_span_params(Activity) of
{undefined, _SpanOpts} ->
Fun();
{SpanName, SpanOpts} ->
?with_span(SpanName, SpanOpts, fun(_SpanCtx) ->
Fun()
end)
end.

mk_activity_span_params(Activity) ->
{mk_activity_span_name(Activity), mk_default_span_opts()}.

%% NOTE Tries to name and wrap every activity into an OTEL span
mk_activity_span_name({payment, PaymentActivity}) when is_atom(PaymentActivity) ->
activity_atom_to_binary(PaymentActivity);
mk_activity_span_name({chargeback, _ID, preparing_initial_cash_flow}) ->
<<"preparing initial chargeback cash flow">>;
mk_activity_span_name({chargeback, _ID, updating_chargeback}) ->
<<"updating chargeback">>;
mk_activity_span_name({chargeback, _ID, updating_cash_flow}) ->
<<"updating chargeback cash flow">>;
mk_activity_span_name({chargeback, _ID, finalising_accounter}) ->
<<"finalizing chargeback accounter">>;
mk_activity_span_name({refund, _ID}) ->
<<"processing refund">>;
mk_activity_span_name({adjustment_new, _ID}) ->
<<"processing new adjustment">>;
mk_activity_span_name({adjustment_pending, _ID}) ->
<<"capturing pending adjustment">>;
mk_activity_span_name(_Activity) ->
%% TODO Handle unknown activity
undefined.

activity_atom_to_binary(PaymentActivity) ->
%% Transforms
%% 'shop_limit_initializing' to <<"shop limit initializing">>,
%% 'risk_scoring' to <<"risk scoring">>
%% etc.
binary:replace(erlang:atom_to_binary(PaymentActivity), <<$_>>, <<$\s>>, [global]).

mk_default_span_opts() ->
#{kind => ?SPAN_KIND_INTERNAL, attributes => mk_business_logic_attrs()}.

mk_business_logic_attrs() ->
#{
<<"hg.business_logic">> => true
}.

-ifdef(TEST).
-include_lib("eunit/include/eunit.hrl").
-include_lib("hellgate/test/hg_ct_domain.hrl").
Expand Down
2 changes: 2 additions & 0 deletions apps/hellgate/test/hg_invoice_tests_SUITE.erl
Original file line number Diff line number Diff line change
Expand Up @@ -506,6 +506,8 @@ groups() ->

-spec init_per_suite(config()) -> config().
init_per_suite(C) ->
%% Don't wait for batches, flush local collector right away:
% ok = application:set_env(opentelemetry, span_processor, simple),
% _ = dbg:tracer(),
% _ = dbg:p(all, c),
% _ = dbg:tpl({'hg_invoice_payment', 'p', '_'}, x),
Expand Down
Loading