diff --git a/Sources/XCMetricsBackendLib/UploadMetrics/Jobs/ProcessMetricsJob.swift b/Sources/XCMetricsBackendLib/UploadMetrics/Jobs/ProcessMetricsJob.swift index a269395..c1b4174 100644 --- a/Sources/XCMetricsBackendLib/UploadMetrics/Jobs/ProcessMetricsJob.swift +++ b/Sources/XCMetricsBackendLib/UploadMetrics/Jobs/ProcessMetricsJob.swift @@ -59,31 +59,38 @@ class ProcessMetricsJob: Job { defer { self.semaphore.signal() } - + let localURL: URL + let buildMetrics: BuildMetrics do { logWithTimestamp(context.logger, msg: "[ProcessMetricsJob] fetching log from \(payload.logURL)") - let localURL = try self.logFileRepository.get(logURL: payload.logURL) - + localURL = try self.logFileRepository.get(logURL: payload.logURL) logWithTimestamp(context.logger, msg: "[ProcessMetricsJob] log fetched to \(localURL)") - let buildMetrics = try MetricsProcessor.process(metricsRequest: payload, + buildMetrics = try MetricsProcessor.process(metricsRequest: payload, logURL: localURL, redactUserData: self.redactUserData) - let metricsWithRequestData = self.addBuildRequest(buildMetrics: buildMetrics, payload: payload) - logWithTimestamp(context.logger, msg: "[ProcessMetricsJob] log parsed \(payload.logURL)") - _ = self.metricsRepository.insertBuildMetrics(metricsWithRequestData, using: eventLoop) - .flatMap { _ -> EventLoopFuture in - context.logger.info("[ProcessMetricsJob] metrics inserted for \(payload.logURL)") - return self.removeLocalLog(from: localURL, using: eventLoop) - } - .map { _ -> Void in - context.logger.info("[ProcessMetricsJob] finished processing \(payload.logURL)") - promise.succeed(()) - return () - } } catch { - context.logger.error("[ProcessMetricsJob] error processing \(payload.logURL) \(error)") + context.logger.error("[ProcessMetricsJob] error processing log from \(payload.logURL): \(error)") promise.fail(error) + return } + + let metricsWithRequestData = self.addBuildRequest(buildMetrics: buildMetrics, payload: payload) + logWithTimestamp(context.logger, msg: "[ProcessMetricsJob] log parsed \(payload.logURL)") + _ = self.metricsRepository.insertBuildMetrics(metricsWithRequestData, using: eventLoop) + .flatMapAlways({ (result) -> EventLoopFuture in + switch result { + case .failure(let error): + context.logger.error("[ProcessMetricsJob] error inserting log from \(payload.logURL): \(error)") + promise.fail(error) + case .success: + promise.succeed(()) + } + return self.removeLocalLog(from: localURL, using: eventLoop, context) + }) + .map { _ -> Void in + context.logger.info("[ProcessMetricsJob] finished processing \(payload.logURL)") + return () + } } return promise.futureResult } @@ -97,9 +104,14 @@ class ProcessMetricsJob: Job { .withXcodeVersion(payload.xcodeVersion?.withBuildIdentifier(buildIdentifier)) } - private func removeLocalLog(from url: URL, using eventLoop: EventLoop) -> EventLoopFuture { + private func removeLocalLog(from url: URL, using eventLoop: EventLoop, _ context: QueueContext) -> EventLoopFuture { return eventLoop.submit { () -> Void in - try? FileManager.default.removeItem(at: url) + context.logger.error("[ProcessMetricsJob] removing log from \(url)") + do { + try FileManager.default.removeItem(at: url) + } catch { + context.logger.error("[ProcessMetricsJob] Error removing log from \(url): \(error)") + } } } } diff --git a/Sources/XCMetricsBackendLib/UploadMetrics/Repository/LogFileRepository.swift b/Sources/XCMetricsBackendLib/UploadMetrics/Repository/LogFileRepository.swift index ac6347a..f1c6934 100644 --- a/Sources/XCMetricsBackendLib/UploadMetrics/Repository/LogFileRepository.swift +++ b/Sources/XCMetricsBackendLib/UploadMetrics/Repository/LogFileRepository.swift @@ -49,7 +49,9 @@ struct LocalLogFileRepository: LogFileRepository { } func get(logURL: URL) throws -> URL { - return logURL + let tmp = try TemporaryFile(creatingTempDirectoryForFilename: "\(UUID().uuidString).xcactivitylog") + try FileManager.default.copyItem(atPath: logURL.path, toPath: tmp.fileURL.path) + return tmp.fileURL } }