-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | A WAI middleware to collect EKG request metrics
--   
--   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.
--   
--   The counters are EKG Counters from ekg-core.
--   <a>https://ocharles.org.uk/blog/posts/2012-12-11-24-day-of-hackage-ekg.html</a>
@package wai-middleware-metrics
@version 0.2.4


-- | A <a>WAI</a> middleware to collect the following <a>EKG</a> metrics
--   from compatible web servers:
--   
--   <ul>
--   <li>number of requests (counter <tt>wai.request_count</tt>)</li>
--   <li>number of response by status code, broken down class (count
--   <tt>wai.response_status_xxx</tt>)</li>
--   <li>latency distribution (distribution
--   <tt>wai.latency_distribution</tt>)</li>
--   </ul>
--   
--   Here's an example of reading these metrics from a Scotty server, and
--   displaying them with EKG.
--   
--   <pre>
--   -- Compile with GHC option `-with-rtsopts=-T` for GC metrics
--   import Web.Scotty
--   import Control.Applicative
--   import System.Remote.Monitoring (serverMetricStore, forkServer)
--   import Network.Wai.Metrics
--   
--   main :: IO()
--   main = do
--     store &lt;- serverMetricStore &lt;$&gt; forkServer "localhost" 8000
--     waiMetrics &lt;- registerWaiMetrics store
--     scotty 3000 $ do
--       middleware (metrics waiMetrics)
--       get "/" $ html "Ping"
--   </pre>
--   
--   Now have a look at <a>your local EKG instance</a> and display the
--   request count by clicking on 'wai.request_count'.
--   
--   WAI metrics can also be stored in a bare EKG store, with no UI and no
--   GC metrics. Use ekg-core's newStore function.
--   
--   Compatible web servers include the following:
--   
--   <ul>
--   <li>Yesod</li>
--   <li>Scotty</li>
--   <li>Spock</li>
--   <li>Servant</li>
--   <li>Warp</li>
--   </ul>
module Network.Wai.Metrics

-- | Register in EKG a number of metrics related to web server activity
--   using empty namespace.
--   
--   <ul>
--   <li><pre>wai.request_count</pre></li>
--   <li><pre>wai.response_status_1xx</pre></li>
--   <li><pre>wai.response_status_2xx</pre></li>
--   <li><pre>wai.response_status_3xx</pre></li>
--   <li><pre>wai.response_status_4xx</pre></li>
--   <li><pre>wai.response_status_5xx</pre></li>
--   <li><pre>wai.latency_distribution</pre></li>
--   </ul>
registerWaiMetrics :: Store -> IO WaiMetrics

-- | Register in EKG a number of metrics related to web server activity
--   with a namespace.
--   
--   <ul>
--   <li><pre><a>namespace</a>.wai.request_count</pre></li>
--   <li><pre><a>namespace</a>.wai.response_status_1xx</pre></li>
--   <li><pre><a>namespace</a>.wai.response_status_2xx</pre></li>
--   <li><pre><a>namespace</a>.wai.response_status_3xx</pre></li>
--   <li><pre><a>namespace</a>.wai.response_status_4xx</pre></li>
--   <li><pre><a>namespace</a>.wai.response_status_5xx</pre></li>
--   <li><pre><a>namespace</a>.wai.latency_distribution</pre></li>
--   </ul>
registerNamedWaiMetrics :: Text -> Store -> IO WaiMetrics

-- | The metrics to feed in WAI and register in EKG.
data WaiMetrics
WaiMetrics :: Counter -> Distribution -> Counter -> Counter -> Counter -> Counter -> Counter -> WaiMetrics
[requestCounter] :: WaiMetrics -> Counter
[latencyDistribution] :: WaiMetrics -> Distribution
[statusCode100Counter] :: WaiMetrics -> Counter
[statusCode200Counter] :: WaiMetrics -> Counter
[statusCode300Counter] :: WaiMetrics -> Counter
[statusCode400Counter] :: WaiMetrics -> Counter
[statusCode500Counter] :: WaiMetrics -> Counter

-- | Create a middleware to be added to a WAI-based webserver.
metrics :: WaiMetrics -> Middleware
