Skip to content

Commit fbed0c0

Browse files
committed
chore(flipcash/transactions): add processing tracing to claiming cash links
Signed-off-by: Brandon McAnsh <git@bmcreations.dev>
1 parent 802008b commit fbed0c0

4 files changed

Lines changed: 64 additions & 32 deletions

File tree

libs/logging/src/main/kotlin/com/getcode/utils/Logging.kt

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import com.google.firebase.crashlytics.CustomKeysAndValues
77
import com.google.firebase.crashlytics.FirebaseCrashlytics
88
import timber.log.Timber
99
import kotlin.time.Duration
10+
import kotlin.time.TimeSource
1011
import kotlin.time.measureTime
1112

1213
sealed interface TraceType {
@@ -153,19 +154,33 @@ suspend fun <T> timedTraceSuspend(
153154
metadata: MetadataBuilder.() -> Unit = {},
154155
error: Throwable? = null,
155156
onComplete: (T, Duration) -> Unit = { _, _ -> },
156-
block: suspend () -> T
157+
block: suspend (onStep: (String) -> Unit) -> T
157158
): T {
158159
var result: T
160+
val breadcrumbs = mutableMapOf<String, Duration>()
161+
val clock = TimeSource.Monotonic // Use monotonic clock for precise timing
162+
val startMark = clock.markNow() // Mark the start of the operation
163+
var previousMark = startMark
164+
159165
val time = measureTime {
160-
result = block()
166+
result = block {stepName ->
167+
val currentMark = clock.markNow()
168+
val stepDuration = currentMark - previousMark
169+
breadcrumbs[stepName] = stepDuration
170+
previousMark = currentMark
171+
}
161172
}
162173

163174
val timedMetadata: MetadataBuilder.() -> Unit = {
164175
// Add the original metadata
165176
metadata()
166-
"duration" to time.inWholeMilliseconds
177+
breadcrumbs.entries.onEach {
178+
it.key to it.value.inWholeMilliseconds
179+
}
180+
"total duration" to time.inWholeMilliseconds
167181
}
168182

183+
println("metadata=${ metadata { timedMetadata() }}")
169184
trace(message = message, tag = tag, type = type, metadata = timedMetadata, error = error)
170185
onComplete(result, time)
171186
return result

services/opencode/src/main/kotlin/com/getcode/opencode/internal/bidi/OpenStream.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ suspend fun <Request, Response, StreamRef : BidirectionalStreamReference<*, *>,
2222
reconnectOnDeadlineExceeded: Boolean = false,
2323
reconnectOnCancelled: Boolean = false,
2424
reconnectHandler: (() -> Unit)? = null,
25-
responseHandler: suspend (Response, (ResultType) -> Unit, (Request) -> Unit) -> Unit
25+
responseHandler: suspend (response: Response, onResult: (ResultType) -> Unit, requestChannel: (Request) -> Unit) -> Unit
2626
): ResultType {
2727
return suspendCancellableCoroutine { cont ->
2828
try {

services/opencode/src/main/kotlin/com/getcode/opencode/internal/network/services/TransactionService.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,6 @@ internal class TransactionService @Inject constructor(
241241
}
242242

243243
SubmitIntentResponse.ResponseCase.RESPONSE_NOT_SET -> Unit
244-
else -> Unit
245244
}
246245
}
247246
)

services/opencode/src/main/kotlin/com/getcode/opencode/internal/transactors/ReceiveGiftCardTransactor.kt

Lines changed: 45 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,11 @@ import com.getcode.opencode.model.accounts.AccountInfo
99
import com.getcode.opencode.model.accounts.GiftCardAccount
1010
import com.getcode.opencode.model.financial.LocalFiat
1111
import com.getcode.opencode.model.transactions.TransactionMetadata
12+
import com.getcode.solana.keys.PublicKey
1213
import com.getcode.utils.CodeServerError
1314
import com.getcode.utils.ErrorUtils
15+
import com.getcode.utils.timedTrace
16+
import com.getcode.utils.timedTraceSuspend
1417
import kotlinx.coroutines.CoroutineScope
1518
import kotlinx.coroutines.cancel
1619

@@ -37,45 +40,60 @@ internal class ReceiveGiftCardTransactor(
3740
)
3841
)
3942

43+
return timedTraceSuspend("Gift card claim processing") { onStep ->
44+
4045
// before we can receive the gift card
4146
// we need to determine the balance of it
4247
val accounts = accountController.getAccounts(
4348
accountOwner = giftCard.cluster,
4449
requestingOwner = ownerKey
45-
).getOrElse { return logAndFail(ReceiveGiftTransactorError.FailedToQuery()) }
46-
.takeIf { it.isNotEmpty() }
47-
?: return logAndFail(ReceiveGiftTransactorError.FailedToQuery())
50+
).getOrElse {
51+
onStep("account query")
52+
return@timedTraceSuspend logAndFail(ReceiveGiftTransactorError.FailedToQuery())
53+
}.takeIf { it.isNotEmpty() }
54+
?: run {
55+
onStep("account query")
56+
return@timedTraceSuspend logAndFail(ReceiveGiftTransactorError.FailedToQuery())
57+
}
4858

49-
val info = accounts.values.first()
59+
onStep("account query")
60+
val info = accounts.values.first()
5061

51-
if (info.claimState == AccountInfo.ClaimState.Claimed) {
52-
return logAndFail(ReceiveGiftTransactorError.AlreadyClaimed())
53-
}
62+
if (info.claimState == AccountInfo.ClaimState.Claimed) {
63+
onStep("pre-claim checks")
64+
return@timedTraceSuspend logAndFail(ReceiveGiftTransactorError.AlreadyClaimed())
65+
}
5466

55-
if (info.claimState == AccountInfo.ClaimState.Expired || info.claimState == AccountInfo.ClaimState.Unknown) {
56-
return logAndFail(ReceiveGiftTransactorError.Expired())
57-
}
67+
if (info.claimState == AccountInfo.ClaimState.Expired || info.claimState == AccountInfo.ClaimState.Unknown) {
68+
onStep("pre-claim checks")
69+
return@timedTraceSuspend logAndFail(ReceiveGiftTransactorError.Expired())
70+
}
5871

59-
if (info.isGiftCardIssuer && !claimIfOwned) {
60-
return Result.failure(ReceiveGiftTransactorError.UsersGiftCard())
61-
}
72+
if (info.isGiftCardIssuer && !claimIfOwned) {
73+
onStep("pre-claim checks")
74+
return@timedTraceSuspend Result.failure(ReceiveGiftTransactorError.UsersGiftCard())
75+
}
6276

63-
val exchangeData = info.originalExchangeData
64-
val amount = LocalFiat(exchangeData)
77+
val exchangeData = info.originalExchangeData
78+
val amount = LocalFiat(exchangeData)
6579

66-
return transactionController.receiveRemotely(
67-
giftCard = giftCard,
68-
amount = amount,
69-
owner = ownerKey
70-
).fold(
71-
onSuccess = { Result.success(amount) },
72-
onFailure = {
73-
if (it !is ReceiveGiftTransactorError) {
74-
ErrorUtils.handleError(it)
80+
return@timedTraceSuspend transactionController.receiveRemotely(
81+
giftCard = giftCard,
82+
amount = amount,
83+
owner = ownerKey
84+
).fold(
85+
onSuccess = {
86+
onStep("intent")
87+
Result.success(amount) },
88+
onFailure = {
89+
onStep("intent")
90+
if (it !is ReceiveGiftTransactorError) {
91+
ErrorUtils.handleError(it)
92+
}
93+
logAndFail(it)
7594
}
76-
logAndFail(it)
77-
}
78-
)
95+
)
96+
}
7997
}
8098

8199
fun dispose() {

0 commit comments

Comments
 (0)