wai-middleware-metrics 0.2.1 → 0.2.2
raw patch · 3 files changed
+34/−15 lines, 3 filesdep ~QuickCheckPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: QuickCheck
API changes (from Hackage documentation)
- Network.Wai.Metrics: serverErrorCounter :: WaiMetrics -> Counter
+ Network.Wai.Metrics: statusCode100Counter :: WaiMetrics -> Counter
+ Network.Wai.Metrics: statusCode200Counter :: WaiMetrics -> Counter
+ Network.Wai.Metrics: statusCode300Counter :: WaiMetrics -> Counter
+ Network.Wai.Metrics: statusCode400Counter :: WaiMetrics -> Counter
+ Network.Wai.Metrics: statusCode500Counter :: WaiMetrics -> Counter
- Network.Wai.Metrics: WaiMetrics :: Counter -> Counter -> Distribution -> WaiMetrics
+ Network.Wai.Metrics: WaiMetrics :: Counter -> Distribution -> Counter -> Counter -> Counter -> Counter -> Counter -> WaiMetrics
Files
- Network/Wai/Metrics.hs +28/−11
- tests.hs +1/−1
- wai-middleware-metrics.cabal +5/−3
Network/Wai/Metrics.hs view
@@ -7,7 +7,7 @@ A <http://hackage.haskell.org/package/wai WAI> middleware to collect the following <https://ocharles.org.uk/blog/posts/2012-12-11-24-day-of-hackage-ekg.html EKG> metrics from compatible web servers: * number of requests (counter @wai.request_count@)-* number of server errors (counter @wai.server_error_count@)+* number of response by status code, broken down class (count @wai.response_status_xxx@) * latency distribution (distribution @wai.latency_distribution@) @@ -46,34 +46,46 @@ import Network.Wai import System.Metrics-import Control.Monad (when)+import Control.Applicative import Data.Time.Clock import qualified System.Metrics.Counter as Counter import qualified System.Metrics.Distribution as Distribution-import Network.HTTP.Types.Status (statusIsServerError)+import Network.HTTP.Types.Status (statusCode) {-| The metrics to feed in WAI and register in EKG. -} data WaiMetrics = WaiMetrics { requestCounter :: Counter.Counter- ,serverErrorCounter :: Counter.Counter ,latencyDistribution :: Distribution.Distribution+ ,statusCode100Counter :: Counter.Counter+ ,statusCode200Counter :: Counter.Counter+ ,statusCode300Counter :: Counter.Counter+ ,statusCode400Counter :: Counter.Counter+ ,statusCode500Counter :: Counter.Counter } {-| Register in EKG a number of metrics related to web server activity. * @wai.request_count@-* @wai.server_error_count@+* @wai.response_status_1xx@+* @wai.response_status_2xx@+* @wai.response_status_3xx@+* @wai.response_status_4xx@+* @wai.response_status_5xx@ * @wai.latency_distribution@ -} registerWaiMetrics :: Store -> IO WaiMetrics-registerWaiMetrics store = do- req <- createCounter "wai.request_count" store- err <- createCounter "wai.server_error_count" store- tim <- createDistribution "wai.latency_distribution" store- return $ WaiMetrics req err tim+registerWaiMetrics store =+ WaiMetrics+ <$> createCounter "wai.request_count" store+ <*> createDistribution "wai.latency_distribution" store+ <*> createCounter "wai.response_status_1xx" store+ <*> createCounter "wai.response_status_2xx" store+ <*> createCounter "wai.response_status_3xx" store+ <*> createCounter "wai.response_status_4xx" store+ <*> createCounter "wai.response_status_5xx" store {-| Create a middleware to be added to a WAI-based webserver.@@ -85,7 +97,12 @@ app req (respond' start) where respond' :: UTCTime -> Response -> IO ResponseReceived respond' start res = do- when (statusIsServerError $ responseStatus res) (Counter.inc (serverErrorCounter waiMetrics))+ Counter.inc $ case statusCode $ responseStatus res of+ s | s >= 500 -> statusCode500Counter waiMetrics+ | s >= 400 -> statusCode400Counter waiMetrics+ | s >= 300 -> statusCode300Counter waiMetrics+ | s >= 200 -> statusCode200Counter waiMetrics+ | otherwise -> statusCode100Counter waiMetrics end <- getCurrentTime Distribution.add (latencyDistribution waiMetrics) (realToFrac $ diffUTCTime end start) respond res
tests.hs view
@@ -58,7 +58,7 @@ readErrorCounter :: (Application -> IO a) -> Int -> IO Int64 readErrorCounter action times = do waiMetrics <- testServer action times- Counter.read (serverErrorCounter waiMetrics)+ Counter.read (statusCode500Counter waiMetrics) -- Return the response time distribution after running n times -- an action over a fresh scotty server
wai-middleware-metrics.cabal view
@@ -1,7 +1,7 @@ name: wai-middleware-metrics-version: 0.2.1+version: 0.2.2 synopsis: A WAI middleware to collect EKG request metrics-description: This WAI middleware counts the number of requests, the number of server errors (http status >= 500) and keeps a latency distribution.+description: This WAI middleware counts the number of requests, the number of responses by status code and keeps a latency distribution. . It can be added to any WAI-based webserver, such as Yesod, Scotty, Spock and Servant. .@@ -34,7 +34,7 @@ , tasty >= 0.10.1 , tasty-hunit >= 0.8 , tasty-quickcheck >= 0.8.2- , QuickCheck == 2.7+ , QuickCheck >= 2.7 , scotty >= 0.8.0 , transformers >= 0.3 , bytestring >= 0.10.0.2@@ -44,6 +44,7 @@ type: exitcode-stdio-1.0 main-is: tests.hs default-language: Haskell2010+ other-modules: Network.Wai.Metrics benchmark metrics-bench build-depends: base@@ -60,6 +61,7 @@ main-is: Benchmark.hs default-language: Haskell2010 ghc-options: -Wall -O2+ other-modules: Network.Wai.Metrics source-repository head type: git