Skip to content

Commit 98ceece

Browse files
authored
refactor(backend): add NoopTelemetryServiceImpl to make tel optional (#2991)
* refactor(backend): add NoopTelemetryServiceImpl to make tel optional * refactor(backend): rm unecessary telemetry exists check * fix(localenv): rm telemetry log noise * feat(backend): switch tel servive impl in dep definition
1 parent a45d56e commit 98ceece

File tree

10 files changed

+515
-442
lines changed

10 files changed

+515
-442
lines changed

localenv/telemetry/otel-collector-config.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ processors:
88
batch:
99

1010
exporters:
11+
logging:
12+
loglevel: info
1113
debug:
1214
verbosity: detailed
1315
prometheus:
@@ -18,6 +20,9 @@ exporters:
1820
insecure: true
1921

2022
service:
23+
telemetry:
24+
logs:
25+
level: warn
2126
pipelines:
2227
metrics:
2328
receivers: [otlp]

packages/backend/src/app.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,8 +215,8 @@ const WALLET_ADDRESS_PATH = '/:walletAddressPath+'
215215

216216
export interface AppServices {
217217
logger: Promise<Logger>
218-
telemetry?: Promise<TelemetryService>
219-
internalRatesService?: Promise<RatesService>
218+
telemetry: Promise<TelemetryService>
219+
internalRatesService: Promise<RatesService>
220220
knex: Promise<Knex>
221221
axios: Promise<AxiosInstance>
222222
config: Promise<IAppConfig>

packages/backend/src/index.ts

Lines changed: 36 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,14 @@ import {
4747
} from './payment-method/ilp/ilp_plugin'
4848
import { createHttpTokenService } from './payment-method/ilp/peer-http-token/service'
4949
import { createPeerService } from './payment-method/ilp/peer/service'
50-
import {
51-
createIlpPaymentService,
52-
ServiceDependencies as IlpPaymentServiceDependencies
53-
} from './payment-method/ilp/service'
50+
import { createIlpPaymentService } from './payment-method/ilp/service'
5451
import { createSPSPRoutes } from './payment-method/ilp/spsp/routes'
5552
import { createStreamCredentialsService } from './payment-method/ilp/stream-credentials/service'
5653
import { createRatesService } from './rates/service'
57-
import { TelemetryService, createTelemetryService } from './telemetry/service'
54+
import {
55+
createTelemetryService,
56+
createNoopTelemetryService
57+
} from './telemetry/service'
5858
import { createWebhookService } from './webhook/service'
5959

6060
BigInt.prototype.toJSON = function () {
@@ -135,29 +135,32 @@ export function initIocContainer(
135135
})
136136
})
137137

138-
if (config.enableTelemetry) {
139-
container.singleton('internalRatesService', async (deps) => {
140-
return createRatesService({
141-
logger: await deps.use('logger'),
142-
exchangeRatesUrl: config.telemetryExchangeRatesUrl,
143-
exchangeRatesLifetime: config.telemetryExchangeRatesLifetime
144-
})
138+
container.singleton('internalRatesService', async (deps) => {
139+
return createRatesService({
140+
logger: await deps.use('logger'),
141+
exchangeRatesUrl: config.telemetryExchangeRatesUrl,
142+
exchangeRatesLifetime: config.telemetryExchangeRatesLifetime
145143
})
144+
})
146145

147-
container.singleton('telemetry', async (deps) => {
148-
const config = await deps.use('config')
149-
return createTelemetryService({
150-
logger: await deps.use('logger'),
151-
aseRatesService: await deps.use('ratesService'),
152-
internalRatesService: await deps.use('internalRatesService')!,
153-
instanceName: config.instanceName,
154-
collectorUrls: config.openTelemetryCollectors,
155-
exportIntervalMillis: config.openTelemetryExportInterval,
156-
baseAssetCode: 'USD',
157-
baseScale: 4
158-
})
146+
container.singleton('telemetry', async (deps) => {
147+
const config = await deps.use('config')
148+
149+
if (!config.enableTelemetry) {
150+
return createNoopTelemetryService()
151+
}
152+
153+
return createTelemetryService({
154+
logger: await deps.use('logger'),
155+
aseRatesService: await deps.use('ratesService'),
156+
internalRatesService: await deps.use('internalRatesService')!,
157+
instanceName: config.instanceName,
158+
collectorUrls: config.openTelemetryCollectors,
159+
exportIntervalMillis: config.openTelemetryExportInterval,
160+
baseAssetCode: 'USD',
161+
baseScale: 4
159162
})
160-
}
163+
})
161164

162165
container.singleton('openApi', async () => {
163166
const resourceServerSpec = await getResourceServerOpenAPI()
@@ -356,10 +359,6 @@ export function initIocContainer(
356359

357360
container.singleton('connectorApp', async (deps) => {
358361
const config = await deps.use('config')
359-
let telemetry: TelemetryService | undefined
360-
if (config.enableTelemetry) {
361-
telemetry = await deps.use('telemetry')
362-
}
363362
return await createConnectorService({
364363
logger: await deps.use('logger'),
365364
redis: await deps.use('redis'),
@@ -370,7 +369,7 @@ export function initIocContainer(
370369
ratesService: await deps.use('ratesService'),
371370
streamServer: await deps.use('streamServer'),
372371
ilpAddress: config.ilpAddress,
373-
telemetry
372+
telemetry: await deps.use('telemetry')
374373
})
375374
})
376375

@@ -425,19 +424,14 @@ export function initIocContainer(
425424
})
426425

427426
container.singleton('ilpPaymentService', async (deps) => {
428-
const serviceDependencies: IlpPaymentServiceDependencies = {
427+
return await createIlpPaymentService({
429428
logger: await deps.use('logger'),
430429
knex: await deps.use('knex'),
431430
config: await deps.use('config'),
432431
makeIlpPlugin: await deps.use('makeIlpPlugin'),
433-
ratesService: await deps.use('ratesService')
434-
}
435-
436-
if (config.enableTelemetry) {
437-
serviceDependencies.telemetry = await deps.use('telemetry')
438-
}
439-
440-
return createIlpPaymentService(serviceDependencies)
432+
ratesService: await deps.use('ratesService'),
433+
telemetry: await deps.use('telemetry')
434+
})
441435
})
442436

443437
container.singleton('paymentMethodHandlerService', async (deps) => {
@@ -469,7 +463,6 @@ export function initIocContainer(
469463
})
470464

471465
container.singleton('outgoingPaymentService', async (deps) => {
472-
const config = await deps.use('config')
473466
return await createOutgoingPaymentService({
474467
logger: await deps.use('logger'),
475468
knex: await deps.use('knex'),
@@ -481,9 +474,7 @@ export function initIocContainer(
481474
peerService: await deps.use('peerService'),
482475
walletAddressService: await deps.use('walletAddressService'),
483476
quoteService: await deps.use('quoteService'),
484-
telemetry: config.enableTelemetry
485-
? await deps.use('telemetry')
486-
: undefined
477+
telemetry: await deps.use('telemetry')
487478
})
488479
})
489480

@@ -548,10 +539,8 @@ export const gracefulShutdown = async (
548539
await redis.quit()
549540
redis.disconnect()
550541

551-
if (config.enableTelemetry) {
552-
const telemetry = await container.use('telemetry')
553-
telemetry?.shutdown()
554-
}
542+
const telemetry = await container.use('telemetry')
543+
telemetry.shutdown()
555544
}
556545

557546
export const start = async (

packages/backend/src/open_payments/payment/outgoing/lifecycle.ts

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -85,26 +85,24 @@ export async function handleSending(
8585
})
8686
const payEndTime = Date.now()
8787

88-
if (deps.telemetry) {
89-
const payDuration = payEndTime - payStartTime
90-
await Promise.all([
91-
deps.telemetry.incrementCounter('transactions_total', 1, {
92-
description: 'Count of funded transactions'
93-
}),
94-
deps.telemetry.recordHistogram('ilp_pay_time_ms', payDuration, {
95-
description: 'Time to complete an ILP payment'
96-
}),
97-
deps.telemetry.incrementCounterWithTransactionAmountDifference(
98-
'transaction_fee_amounts',
99-
payment.sentAmount,
100-
payment.receiveAmount,
101-
{
102-
description: 'Amount sent through the network as fees',
103-
valueType: ValueType.DOUBLE
104-
}
105-
)
106-
])
107-
}
88+
const payDuration = payEndTime - payStartTime
89+
await Promise.all([
90+
deps.telemetry.incrementCounter('transactions_total', 1, {
91+
description: 'Count of funded transactions'
92+
}),
93+
deps.telemetry.recordHistogram('ilp_pay_time_ms', payDuration, {
94+
description: 'Time to complete an ILP payment'
95+
}),
96+
deps.telemetry.incrementCounterWithTransactionAmountDifference(
97+
'transaction_fee_amounts',
98+
payment.sentAmount,
99+
payment.receiveAmount,
100+
{
101+
description: 'Amount sent through the network as fees',
102+
valueType: ValueType.DOUBLE
103+
}
104+
)
105+
])
108106

109107
await handleCompleted(deps, payment)
110108
}

packages/backend/src/open_payments/payment/outgoing/service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ export interface ServiceDependencies extends BaseService {
6666
paymentMethodHandlerService: PaymentMethodHandlerService
6767
walletAddressService: WalletAddressService
6868
quoteService: QuoteService
69-
telemetry?: TelemetryService
69+
telemetry: TelemetryService
7070
}
7171

7272
export async function createOutgoingPaymentService(

packages/backend/src/payment-method/ilp/connector/core/rafiki.ts

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ export interface TransferOptions {
6363
export interface RafikiServices {
6464
//router: Router
6565
accounting: AccountingService
66-
telemetry?: TelemetryService
66+
telemetry: TelemetryService
6767
walletAddresses: WalletAddressService
6868
logger: Logger
6969
incomingPayments: IncomingPaymentService
@@ -143,7 +143,7 @@ export class Rafiki<T = any> {
143143
get walletAddresses(): WalletAddressService {
144144
return config.walletAddresses
145145
},
146-
get telemetry(): TelemetryService | undefined {
146+
get telemetry(): TelemetryService {
147147
return config.telemetry
148148
},
149149
logger
@@ -162,9 +162,7 @@ export class Rafiki<T = any> {
162162
const response = new IlpResponse()
163163
const telemetry = this.publicServer.context.services.telemetry
164164

165-
if (telemetry) {
166-
incrementPreparePacketCount(unfulfillable, prepare.amount, telemetry)
167-
}
165+
incrementPreparePacketCount(unfulfillable, prepare.amount, telemetry)
168166

169167
await this.routes(
170168
{
@@ -194,23 +192,21 @@ export class Rafiki<T = any> {
194192
)
195193
if (!response.rawReply) throw new Error('error generating reply')
196194

197-
if (telemetry) {
198-
const { code, scale } = sourceAccount.asset
199-
incrementFulfillOrRejectPacketCount(
200-
unfulfillable,
201-
prepare.amount,
202-
response,
203-
telemetry
204-
)
205-
await incrementAmount(
206-
unfulfillable,
207-
prepare.amount,
208-
response,
209-
code,
210-
scale,
211-
telemetry
212-
)
213-
}
195+
const { code, scale } = sourceAccount.asset
196+
incrementFulfillOrRejectPacketCount(
197+
unfulfillable,
198+
prepare.amount,
199+
response,
200+
telemetry
201+
)
202+
await incrementAmount(
203+
unfulfillable,
204+
prepare.amount,
205+
response,
206+
code,
207+
scale,
208+
telemetry
209+
)
214210
return response.rawReply
215211
}
216212

packages/backend/src/payment-method/ilp/connector/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ interface ServiceDependencies extends BaseService {
3838
peerService: PeerService
3939
streamServer: StreamServer
4040
ilpAddress: string
41-
telemetry?: TelemetryService
41+
telemetry: TelemetryService
4242
}
4343

4444
export async function createConnectorService({

packages/backend/src/payment-method/ilp/service.ts

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export interface ServiceDependencies extends BaseService {
2222
config: IAppConfig
2323
ratesService: RatesService
2424
makeIlpPlugin: (options: IlpPluginOptions) => IlpPlugin
25-
telemetry?: TelemetryService
25+
telemetry: TelemetryService
2626
}
2727

2828
export async function createIlpPaymentService(
@@ -94,16 +94,14 @@ async function getQuote(
9494
}
9595
const payEndTime = Date.now()
9696

97-
if (deps.telemetry) {
98-
const rateProbeDuraiton = payEndTime - rateProbeStartTime
99-
deps.telemetry.recordHistogram(
100-
'ilp_rate_probe_time_ms',
101-
rateProbeDuraiton,
102-
{
103-
description: 'Time to get an ILP quote'
104-
}
105-
)
106-
}
97+
const rateProbeDuraiton = payEndTime - rateProbeStartTime
98+
deps.telemetry.recordHistogram(
99+
'ilp_rate_probe_time_ms',
100+
rateProbeDuraiton,
101+
{
102+
description: 'Time to get an ILP quote'
103+
}
104+
)
107105
// Pay.startQuote should return PaymentError.InvalidSourceAmount or
108106
// PaymentError.InvalidDestinationAmount for non-positive amounts.
109107
// Outgoing payments' sendAmount or receiveAmount should never be

0 commit comments

Comments
 (0)