From 3f483c5bf57f8dd1ad3e4e282825d1e725029ff5 Mon Sep 17 00:00:00 2001 From: KernelDeimos Date: Sun, 6 Jul 2025 15:46:28 -0400 Subject: [PATCH] dev: add otel spans for permission scans and db --- .../src/services/auth/PermissionService.js | 15 ++++++++++--- .../database/BaseDatabaseAccessService.js | 21 +++++++++++++----- .../src/services/drivers/DriverService.js | 22 +++++++++++-------- 3 files changed, 40 insertions(+), 18 deletions(-) diff --git a/src/backend/src/services/auth/PermissionService.js b/src/backend/src/services/auth/PermissionService.js index 6bcc24ff2..b5f2d39f4 100644 --- a/src/backend/src/services/auth/PermissionService.js +++ b/src/backend/src/services/auth/PermissionService.js @@ -322,9 +322,12 @@ class PermissionService extends BaseService { async check (actor, permission_options) { // TODO: optimized implementation for check instead of // delegating to the scan() method - const reading = await this.scan(actor, permission_options); - const options = PermissionUtil.reading_to_options(reading); - return options.length > 0; + const svc_trace = this.services.get('traceService'); + return await svc_trace.spanify(`permission:check`, async () => { + const reading = await this.scan(actor, permission_options); + const options = PermissionUtil.reading_to_options(reading); + return options.length > 0; + }); } @@ -344,6 +347,12 @@ class PermissionService extends BaseService { * @returns {Promise} A promise that resolves to an array of permission readings. */ async scan (actor, permission_options, _reserved, state) { + const svc_trace = this.services.get('traceService'); + return await svc_trace.spanify(`permission:scan`, async () => { + return await this.scan_(actor, permission_options, _reserved, state); + }, { attributes: { permission_options }, actor: actor.uid }); + } + async scan_ (actor, permission_options, _reserved, state) { if ( ! state ) this.log.info('scan', { actor: actor.uid, permission_options, diff --git a/src/backend/src/services/database/BaseDatabaseAccessService.js b/src/backend/src/services/database/BaseDatabaseAccessService.js index b2adb465f..cd43041a6 100644 --- a/src/backend/src/services/database/BaseDatabaseAccessService.js +++ b/src/backend/src/services/database/BaseDatabaseAccessService.js @@ -56,8 +56,11 @@ class BaseDatabaseAccessService extends BaseService { return this; } - read (query, params) { - return this._read(query, params); + async read (query, params) { + const svc_trace = this.services.get('traceService'); + return await svc_trace.spanify(`database:read`, async () => { + return await this._read(query, params); + }, { attributes: { query } }); } /** @@ -91,12 +94,18 @@ class BaseDatabaseAccessService extends BaseService { return results; } - pread (query, params) { - return this._read(query, params, { use_primary: true }); + async pread (query, params) { + const svc_trace = this.services.get('traceService'); + return await svc_trace.spanify(`database:pread`, async () => { + return await this._read(query, params, { use_primary: true }); + }, { attributes: { query } }); } - write (query, params) { - return this._write(query, params); + async write (query, params) { + const svc_trace = this.services.get('traceService'); + return await svc_trace.spanify(`database:write`, async () => { + return await this._write(query, params); + }, { attributes: { query } }); } insert (table_name, data) { diff --git a/src/backend/src/services/drivers/DriverService.js b/src/backend/src/services/drivers/DriverService.js index 2fcb99fb7..d10bcbc59 100644 --- a/src/backend/src/services/drivers/DriverService.js +++ b/src/backend/src/services/drivers/DriverService.js @@ -343,16 +343,20 @@ class DriverService extends BaseService { svc_event.emit('driver.create-call-context', event); - return event.context.arun(async () => { - const result = await this.call_new_({ - actor, - service, - service_name: driver, - iface, method, args: processed_args, - skip_usage, + const svc_trace = this.services.get('traceService'); + + return await svc_trace.spanify(`driver:${driver}:${iface}:${method}`, async () => { + return event.context.arun(async () => { + const result = await this.call_new_({ + actor, + service, + service_name: driver, + iface, method, args: processed_args, + skip_usage, + }); + result.metadata = client_driver_call.response_metadata; + return result; }); - result.metadata = client_driver_call.response_metadata; - return result; }); }