From 48f3dc02cca5e13a43a95ac50ee970bed1337961 Mon Sep 17 00:00:00 2001 From: Adam Fowler Date: Thu, 9 Jan 2025 10:03:55 +0000 Subject: [PATCH 1/2] Metrics cleanup, removed unnecesary meters, renamed label variables --- Sources/Jobs/JobMetricsHelper.swift | 32 +++++++++++------------------ Sources/Jobs/JobQueueHandler.swift | 10 ++++----- 2 files changed, 17 insertions(+), 25 deletions(-) diff --git a/Sources/Jobs/JobMetricsHelper.swift b/Sources/Jobs/JobMetricsHelper.swift index 76545b4..7aecb78 100644 --- a/Sources/Jobs/JobMetricsHelper.swift +++ b/Sources/Jobs/JobMetricsHelper.swift @@ -16,12 +16,16 @@ import Metrics /// OTEL labels and dimensions internal enum JobMetricsHelper { - /// Metrics label - static let metricsLabel: String = "swift.jobs" - /// Meter label for Processsing, Queued, Failed and Completed + /// Counter label + static let counterLabel: String = "swift.jobs" + /// Job duration timer label + static let timerLabel: String = "swift.jobs.duration" + /// Job queued timer label + static let queuedTimerLabel: String = "swift.jobs.queued.duration" + /// Meter label for Processsing, Queued static let meterLabel: String = "swift.jobs.meter" - /// Meter label for discarded jobs - static let discardedMeter: String = "swift.jobs.discarded" + /// Counter label for discarded jobs + static let discardedCounter: String = "swift.jobs.discarded" /// Used for the histogram which can be useful to see by job status enum JobStatus: String, Codable, Sendable { case queued @@ -46,21 +50,9 @@ internal enum JobMetricsHelper { error: Error? = nil, retrying: Bool = false ) { - // This meter can be used to display total job - // Or decrement processing vector in Prometheus UI or Grafana - // with something like count(swif_jobs_meter{status="processing"} - // unless on(jobID) (swif_jobs_meter{status="queued"}) - // or (swif_jobs_meter{status="completed")) or vector(0) - Meter( - label: JobMetricsHelper.meterLabel, - dimensions: [ - ("status", JobMetricsHelper.JobStatus.completed.rawValue) - ] - ).increment() - if retrying { Counter( - label: Self.metricsLabel, + label: Self.counterLabel, dimensions: [("name", name), ("status", JobStatus.retried.rawValue)] ).increment() return @@ -84,14 +76,14 @@ internal enum JobMetricsHelper { // Calculate job execution time Timer( - label: "\(Self.metricsLabel).duration", + label: Self.timerLabel, dimensions: dimensions, preferredDisplayUnit: .seconds ).recordNanoseconds(DispatchTime.now().uptimeNanoseconds - startTime) // Increment job counter base on status Counter( - label: Self.metricsLabel, + label: Self.counterLabel, dimensions: dimensions ).increment() } diff --git a/Sources/Jobs/JobQueueHandler.swift b/Sources/Jobs/JobQueueHandler.swift index 7becee5..96f4685 100644 --- a/Sources/Jobs/JobQueueHandler.swift +++ b/Sources/Jobs/JobQueueHandler.swift @@ -99,8 +99,8 @@ final class JobQueueHandler: Sendable { } catch let error as JobQueueError where error == .unrecognisedJobId { logger.debug("Failed to find Job with ID while decoding") try await self.queue.failed(jobId: queuedJob.id, error: error) - Meter( - label: JobMetricsHelper.discardedMeter, + Counter( + label: JobMetricsHelper.discardedCounter, dimensions: [ ("reason", "INVALID_JOB_ID") ] @@ -109,8 +109,8 @@ final class JobQueueHandler: Sendable { } catch { logger.debug("Job failed to decode") try await self.queue.failed(jobId: queuedJob.id, error: JobQueueError.decodeJobFailed) - Meter( - label: JobMetricsHelper.discardedMeter, + Counter( + label: JobMetricsHelper.discardedCounter, dimensions: [ ("reason", "DECODE_FAILED") ] @@ -122,7 +122,7 @@ final class JobQueueHandler: Sendable { // Calculate wait time from queued to processing let jobQueuedDuration = Date.now.timeIntervalSince(job.queuedAt) Timer( - label: "\(JobMetricsHelper.metricsLabel).queued.duration", + label: JobMetricsHelper.queuedTimerLabel, dimensions: [("name", job.name)], preferredDisplayUnit: .seconds ).recordSeconds(jobQueuedDuration) From 85c25a5fa56c57b94d1164710ce1116ccfd12789 Mon Sep 17 00:00:00 2001 From: Adam Fowler Date: Thu, 9 Jan 2025 10:07:15 +0000 Subject: [PATCH 2/2] Fix test --- Tests/JobsTests/MetricsTests.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Tests/JobsTests/MetricsTests.swift b/Tests/JobsTests/MetricsTests.swift index 7adb8f7..ad5b943 100644 --- a/Tests/JobsTests/MetricsTests.swift +++ b/Tests/JobsTests/MetricsTests.swift @@ -346,10 +346,10 @@ final class MetricsTests: XCTestCase { XCTAssertEqual($0, "test") } - let queuedMeter = try XCTUnwrap(Self.testMetrics.meters.withLockedValue { $0 }["swift.jobs.discarded"] as? TestMeter) - XCTAssertEqual(queuedMeter.dimensions.count, 1) - XCTAssertEqual(queuedMeter.dimensions[0].0, "reason") - XCTAssertEqual(queuedMeter.dimensions[0].1, "DECODE_FAILED") + let discardedCounter = try XCTUnwrap(Self.testMetrics.counters.withLockedValue { $0 }["swift.jobs.discarded"] as? TestCounter) + XCTAssertEqual(discardedCounter.dimensions.count, 1) + XCTAssertEqual(discardedCounter.dimensions[0].0, "reason") + XCTAssertEqual(discardedCounter.dimensions[0].1, "DECODE_FAILED") } func testErrorRetryAndThenSucceed() async throws {