mirror of
https://github.com/hanzo-fi/payments.git
synced 2026-10-30 20:31:20 +00:00
* feat: commit * feat: Update connectors * chore: review code * fix: align Coinbase Prime client with actual API contract - Remove query string from HMAC signature (match official SDK) - Use raw API secret bytes instead of base64-decoding - Change TransferFrom/TransferTo from string to *TransferEndpoint struct - Map all 35 transaction types to correct payment types (PAYIN/PAYOUT/TRANSFER/OTHER) - Fix status mapping: TRANSACTION_DONE (not fictional TRANSACTION_COMPLETED) - Add CANCELLED/REJECTED/EXPIRED to failed statuses - Use transfer_from/transfer_to endpoints with walletID fallback for account refs * fix(e2e): use polling outbox check in setupV3PoolAccounts to fix race condition MustOutbox performs a single instant check which is flaky when plugin initialization adds latency. Switch to MustEventuallyOutbox (5s polling) to match setupV2PoolAccounts behavior. * fix(coinbase): fix HMAC signing, pagination, symbol normalization and observability - Base64-decode API secret before HMAC computation (was using raw string) - Include query params in signed message via RequestURI() - Loop through all pages in GetBalancesForSymbol instead of single page - Normalize currency symbols to uppercase before lookup - Add otelhttp transport for OpenTelemetry tracing - Include ErrorResponse.Message in API error strings - Use req.PageSize instead of hardcoded PAGE_SIZE in balances - Capture time.Now() once before balance loop - Add base64 validation on APISecret config field - Add format:password and align pageSize default in OpenAPI schema - Reclassify INTERNAL_DEPOSIT/INTERNAL_WITHDRAWAL as TRANSFER - Make fetch_balances periodic in workflow * fix(tests): stabilize outbox assertions and make metrics registry thread-safe * fix(coinbase): address review feedback for balances and test stability * fix(testserver): make outbox polling window robust for e2e timing * fix(coinbase): address PR review feedback on metadata, status mapping, and DefaultAsset Remove redundant metadata from payments (already in Raw), refine transaction status mapping to use CANCELLED/EXPIRED/OTHER, remove symbol from account metadata, and derive wallet symbol from DefaultAsset instead of metadata/raw fallback in balances. * fix(coinbase): enumerate all pending statuses and use UNKNOWN as default Explicitly list all Coinbase pending transaction statuses, map OTHER_TRANSACTION_STATUS to OTHER, and default to UNKNOWN for unrecognized statuses (including TRANSACTION_RETRIED). * feat: Update * feat: Switch name to Coinbase Prime
103 lines
2.4 KiB
Go
103 lines
2.4 KiB
Go
package metrics
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"go.opentelemetry.io/otel/metric"
|
|
"go.opentelemetry.io/otel/metric/noop"
|
|
)
|
|
|
|
var (
|
|
registry MetricsRegistry
|
|
registryMu sync.RWMutex
|
|
)
|
|
|
|
func GetMetricsRegistry() MetricsRegistry {
|
|
registryMu.RLock()
|
|
currentRegistry := registry
|
|
registryMu.RUnlock()
|
|
if currentRegistry != nil {
|
|
return currentRegistry
|
|
}
|
|
|
|
registryMu.Lock()
|
|
defer registryMu.Unlock()
|
|
if registry == nil {
|
|
registry = NewNoOpMetricsRegistry()
|
|
}
|
|
|
|
return registry
|
|
}
|
|
|
|
type MetricsRegistry interface {
|
|
ConnectorPSPCalls() metric.Int64Counter
|
|
ConnectorPSPCallLatencies() metric.Int64Histogram
|
|
}
|
|
|
|
type metricsRegistry struct {
|
|
connectorPSPCalls metric.Int64Counter
|
|
connectorPSPCallLatencies metric.Int64Histogram
|
|
}
|
|
|
|
func RegisterMetricsRegistry(meterProvider metric.MeterProvider) (MetricsRegistry, error) {
|
|
meter := meterProvider.Meter("payments")
|
|
|
|
connectorPSPCalls, err := meter.Int64Counter(
|
|
"payments_connectors_psp_calls",
|
|
metric.WithUnit("1"),
|
|
metric.WithDescription("payments connectors psp calls"),
|
|
)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
connectorPSPCallLatencies, err := meter.Int64Histogram(
|
|
"payments_connectors_psp_calls_latencies",
|
|
metric.WithUnit("ms"),
|
|
metric.WithDescription("payments connectors psp calls latencies"),
|
|
)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
currentRegistry := &metricsRegistry{
|
|
connectorPSPCalls: connectorPSPCalls,
|
|
connectorPSPCallLatencies: connectorPSPCallLatencies,
|
|
}
|
|
|
|
registryMu.Lock()
|
|
registry = currentRegistry
|
|
registryMu.Unlock()
|
|
|
|
return currentRegistry, nil
|
|
}
|
|
|
|
func (m *metricsRegistry) ConnectorPSPCalls() metric.Int64Counter {
|
|
return m.connectorPSPCalls
|
|
}
|
|
|
|
func (m *metricsRegistry) ConnectorPSPCallLatencies() metric.Int64Histogram {
|
|
return m.connectorPSPCallLatencies
|
|
}
|
|
|
|
type NoopMetricsRegistry struct{}
|
|
|
|
func NewNoOpMetricsRegistry() *NoopMetricsRegistry {
|
|
return &NoopMetricsRegistry{}
|
|
}
|
|
|
|
func (m *NoopMetricsRegistry) ConnectorPSPCalls() metric.Int64Counter {
|
|
counter, _ := noop.NewMeterProvider().Meter("payments").Int64Counter("payments_connectors_psp_calls")
|
|
return counter
|
|
}
|
|
|
|
func (m *NoopMetricsRegistry) ConnectorPSPCallLatencies() metric.Int64Histogram {
|
|
histogram, _ := noop.NewMeterProvider().Meter("payments").Int64Histogram("payments_connectors_psp_calls_latencies")
|
|
return histogram
|
|
}
|
|
|
|
var (
|
|
_ MetricsRegistry = (*metricsRegistry)(nil)
|
|
_ MetricsRegistry = (*NoopMetricsRegistry)(nil)
|
|
)
|