From df3c51bfdb9770a95f6223fc85baf8632ca93279 Mon Sep 17 00:00:00 2001 From: Santiago Palladino Date: Tue, 17 Dec 2024 10:44:59 -0300 Subject: [PATCH] chore: Add spans to proving job (#10794) Related to #10124 --- yarn-project/prover-node/src/job/epoch-proving-job.ts | 9 ++++++++- yarn-project/prover-node/src/metrics.ts | 2 +- yarn-project/prover-node/src/prover-node.ts | 8 ++++++-- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/yarn-project/prover-node/src/job/epoch-proving-job.ts b/yarn-project/prover-node/src/job/epoch-proving-job.ts index ebaf9c8c422..ffe46a1e5e8 100644 --- a/yarn-project/prover-node/src/job/epoch-proving-job.ts +++ b/yarn-project/prover-node/src/job/epoch-proving-job.ts @@ -17,6 +17,7 @@ import { promiseWithResolvers } from '@aztec/foundation/promise'; import { Timer } from '@aztec/foundation/timer'; import { type L1Publisher } from '@aztec/sequencer-client'; import { type PublicProcessor, type PublicProcessorFactory } from '@aztec/simulator'; +import { Attributes, type Traceable, type Tracer, trackSpan } from '@aztec/telemetry-client'; import * as crypto from 'node:crypto'; @@ -27,13 +28,15 @@ import { type ProverNodeMetrics } from '../metrics.js'; * re-executes their public calls, generates a rollup proof, and submits it to L1. This job will update the * world state as part of public call execution via the public processor. */ -export class EpochProvingJob { +export class EpochProvingJob implements Traceable { private state: EpochProvingJobState = 'initialized'; private log = createLogger('prover-node:epoch-proving-job'); private uuid: string; private runPromise: Promise | undefined; + public readonly tracer: Tracer; + constructor( private dbProvider: ForkMerkleTreeOperations, private epochNumber: bigint, @@ -49,6 +52,7 @@ export class EpochProvingJob { private cleanUp: (job: EpochProvingJob) => Promise = () => Promise.resolve(), ) { this.uuid = crypto.randomUUID(); + this.tracer = metrics.client.getTracer('EpochProvingJob'); } public getId(): string { @@ -62,6 +66,9 @@ export class EpochProvingJob { /** * Proves the given epoch and submits the proof to L1. */ + @trackSpan('EpochProvingJob.run', function () { + return { [Attributes.EPOCH_NUMBER]: Number(this.epochNumber) }; + }) public async run() { const epochNumber = Number(this.epochNumber); const epochSize = this.blocks.length; diff --git a/yarn-project/prover-node/src/metrics.ts b/yarn-project/prover-node/src/metrics.ts index 4828b784d93..f37e12ef299 100644 --- a/yarn-project/prover-node/src/metrics.ts +++ b/yarn-project/prover-node/src/metrics.ts @@ -4,7 +4,7 @@ import { type Histogram, Metrics, type TelemetryClient, ValueType } from '@aztec export class ProverNodeMetrics { provingJobDuration: Histogram; - constructor(client: TelemetryClient, name = 'ProverNode') { + constructor(public readonly client: TelemetryClient, name = 'ProverNode') { const meter = client.getMeter(name); this.provingJobDuration = meter.createHistogram(Metrics.PROVER_NODE_JOB_DURATION, { description: 'Duration of proving job', diff --git a/yarn-project/prover-node/src/prover-node.ts b/yarn-project/prover-node/src/prover-node.ts index cc7a5b126f5..65b788fc03b 100644 --- a/yarn-project/prover-node/src/prover-node.ts +++ b/yarn-project/prover-node/src/prover-node.ts @@ -20,7 +20,7 @@ import { type Maybe } from '@aztec/foundation/types'; import { type P2P } from '@aztec/p2p'; import { type L1Publisher } from '@aztec/sequencer-client'; import { PublicProcessorFactory } from '@aztec/simulator'; -import { type TelemetryClient } from '@aztec/telemetry-client'; +import { Attributes, type TelemetryClient, type Traceable, type Tracer, trackSpan } from '@aztec/telemetry-client'; import { type BondManager } from './bond/bond-manager.js'; import { EpochProvingJob, type EpochProvingJobState } from './job/epoch-proving-job.js'; @@ -42,7 +42,7 @@ export type ProverNodeOptions = { * from a tx source in the p2p network or an external node, re-executes their public functions, creates a rollup * proof for the epoch, and submits it to L1. */ -export class ProverNode implements ClaimsMonitorHandler, EpochMonitorHandler, ProverNodeApi { +export class ProverNode implements ClaimsMonitorHandler, EpochMonitorHandler, ProverNodeApi, Traceable { private log = createLogger('prover-node'); private latestEpochWeAreProving: bigint | undefined; @@ -50,6 +50,8 @@ export class ProverNode implements ClaimsMonitorHandler, EpochMonitorHandler, Pr private options: ProverNodeOptions; private metrics: ProverNodeMetrics; + public readonly tracer: Tracer; + constructor( private readonly prover: EpochProverManager, private readonly publisher: L1Publisher, @@ -74,6 +76,7 @@ export class ProverNode implements ClaimsMonitorHandler, EpochMonitorHandler, Pr }; this.metrics = new ProverNodeMetrics(telemetryClient, 'ProverNode'); + this.tracer = telemetryClient.getTracer('ProverNode'); } public getP2P() { @@ -242,6 +245,7 @@ export class ProverNode implements ClaimsMonitorHandler, EpochMonitorHandler, Pr return maxPendingJobs === 0 || this.jobs.size < maxPendingJobs; } + @trackSpan('ProverNode.createProvingJob', epochNumber => ({ [Attributes.EPOCH_NUMBER]: Number(epochNumber) })) private async createProvingJob(epochNumber: bigint) { if (!this.checkMaximumPendingJobs()) { throw new Error(`Maximum pending proving jobs ${this.options.maxPendingJobs} reached. Cannot create new job.`);