From 2dced818e9efed440a9c0cd0f40d6c7058f6f497 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vale=CC=81rian=20Buyck?= Date: Mon, 16 May 2022 15:08:31 +0200 Subject: [PATCH] Add flag to enable/disable metrics --- Sources/Vapor/HTTP/Server/HTTPServer.swift | 9 +++++- .../Responder/Application+Responder.swift | 3 +- .../Vapor/Responder/DefaultResponder.swift | 16 ++++++---- Tests/VaporTests/MetricsTests.swift | 31 +++++++++++++++++++ 4 files changed, 51 insertions(+), 8 deletions(-) diff --git a/Sources/Vapor/HTTP/Server/HTTPServer.swift b/Sources/Vapor/HTTP/Server/HTTPServer.swift index 84616410ba..dfacd88063 100644 --- a/Sources/Vapor/HTTP/Server/HTTPServer.swift +++ b/Sources/Vapor/HTTP/Server/HTTPServer.swift @@ -143,7 +143,10 @@ public final class HTTPServer: Server { /// If set, this name will be serialized as the `Server` header in outgoing responses. public var serverName: String? - + + /// When `true`, report http metrics through `swift-metrics` + public var reportMetrics: Bool + /// Any uncaught server or responder errors will go here. public var logger: Logger @@ -162,6 +165,7 @@ public final class HTTPServer: Server { supportVersions: Set? = nil, tlsConfiguration: TLSConfiguration? = nil, serverName: String? = nil, + reportMetrics: Bool = true, logger: Logger? = nil, shutdownTimeout: TimeAmount = .seconds(10) ) { @@ -176,6 +180,7 @@ public final class HTTPServer: Server { supportVersions: supportVersions, tlsConfiguration: tlsConfiguration, serverName: serverName, + reportMetrics: reportMetrics, logger: logger, shutdownTimeout: shutdownTimeout ) @@ -192,6 +197,7 @@ public final class HTTPServer: Server { supportVersions: Set? = nil, tlsConfiguration: TLSConfiguration? = nil, serverName: String? = nil, + reportMetrics: Bool = true, logger: Logger? = nil, shutdownTimeout: TimeAmount = .seconds(10) ) { @@ -209,6 +215,7 @@ public final class HTTPServer: Server { } self.tlsConfiguration = tlsConfiguration self.serverName = serverName + self.reportMetrics = reportMetrics self.logger = logger ?? Logger(label: "codes.vapor.http-server") self.shutdownTimeout = shutdownTimeout } diff --git a/Sources/Vapor/Responder/Application+Responder.swift b/Sources/Vapor/Responder/Application+Responder.swift index dc9c506040..04e02ebcaa 100644 --- a/Sources/Vapor/Responder/Application+Responder.swift +++ b/Sources/Vapor/Responder/Application+Responder.swift @@ -39,7 +39,8 @@ extension Application { public var `default`: Vapor.Responder { DefaultResponder( routes: self.application.routes, - middleware: self.application.middleware.resolve() + middleware: self.application.middleware.resolve(), + reportMetrics: self.application.http.server.configuration.reportMetrics ) } diff --git a/Sources/Vapor/Responder/DefaultResponder.swift b/Sources/Vapor/Responder/DefaultResponder.swift index 8c6cc2b2b4..ffff371cd0 100644 --- a/Sources/Vapor/Responder/DefaultResponder.swift +++ b/Sources/Vapor/Responder/DefaultResponder.swift @@ -4,6 +4,7 @@ import Metrics internal struct DefaultResponder: Responder { private let router: TrieRouter private let notFoundResponder: Responder + private let reportMetrics: Bool private struct CachedRoute { let route: Route @@ -11,7 +12,7 @@ internal struct DefaultResponder: Responder { } /// Creates a new `ApplicationResponder` - public init(routes: Routes, middleware: [Middleware] = []) { + public init(routes: Routes, middleware: [Middleware] = [], reportMetrics: Bool = true) { let options = routes.caseInsensitive ? Set(arrayLiteral: TrieRouter.ConfigurationOption.caseInsensitive) : [] let router = TrieRouter(CachedRoute.self, options: options) @@ -56,6 +57,7 @@ internal struct DefaultResponder: Responder { } self.router = router self.notFoundResponder = middleware.makeResponder(chainingTo: NotFoundResponder()) + self.reportMetrics = reportMetrics } /// See `Responder` @@ -76,11 +78,13 @@ internal struct DefaultResponder: Responder { case .failure: status = .internalServerError } - self.updateMetrics( - for: request, - startTime: startTime, - statusCode: status.code - ) + if self.reportMetrics { + self.updateMetrics( + for: request, + startTime: startTime, + statusCode: status.code + ) + } } } diff --git a/Tests/VaporTests/MetricsTests.swift b/Tests/VaporTests/MetricsTests.swift index 81181b6f9b..2159af402d 100644 --- a/Tests/VaporTests/MetricsTests.swift +++ b/Tests/VaporTests/MetricsTests.swift @@ -122,5 +122,36 @@ class MetricsTests: XCTestCase { XCTAssertNil(timer.dimensions.first(where: { $0.1 == "200" })) }) } + + func testMetricsDisabled() { + let metrics = CapturingMetricsSystem() + MetricsSystem.bootstrapInternal(metrics) + + let app = Application(.testing) + app.http.server.configuration.reportMetrics = false + defer { app.shutdown() } + + struct User: Content { + let id: Int + let name: String + } + + app.routes.get("users", ":userID") { req -> User in + let userID = try req.parameters.require("userID", as: Int.self) + if userID == 1 { + return User(id: 1, name: "Tim") + } else { + throw Abort(.notFound) + } + } + + XCTAssertNoThrow(try app.testable().test(.GET, "/users/1") { res in + XCTAssertEqual(res.status, .ok) + let resData = try res.content.decode(User.self) + XCTAssertEqual(resData.id, 1) + XCTAssertEqual(metrics.counters.count, 0) + XCTAssertNil(metrics.timers["http_request_duration_seconds"]) + }) + } }