module System.Metrics.Prometheus.Http where
import Network.HTTP.Types (hContentType,
methodGet, status200,
status404)
import Network.Wai (Application,
Response, pathInfo,
requestMethod,
responseBuilder,
responseLBS)
import Network.Wai.Handler.Warp (Port, run)
import System.Metrics.Prometheus.Encode (encodeMetrics)
import System.Metrics.Prometheus.GlobalRegistry (GlobalRegistry,
sample)
serveHttpTextMetrics :: Port -> GlobalRegistry -> IO ()
serveHttpTextMetrics port = run port . prometheusApp
prometheusApp :: GlobalRegistry -> Application
prometheusApp globalRegistry request respond
| prometheusRequest = prometheusResponse respond globalRegistry
| otherwise = respond $ responseLBS status404 header404 body404
where
prometheusRequest = requestMethod request == methodGet && pathInfo request == ["metrics"]
header404 = [(hContentType, "text/plain")]
body404 = "404"
prometheusResponse :: (Response -> IO b) -> GlobalRegistry -> IO b
prometheusResponse respond globalRegistry = do
s <- sample globalRegistry
respond . responseBuilder status200 headers $ encodeMetrics s
where
headers = [(hContentType, "text/plain; version=0.0.4")]