fix prometheus

This commit is contained in:
Simon Cruanes 2024-02-26 14:00:58 -05:00
parent 04be73ee00
commit 0d750cd86c
No known key found for this signature in database
GPG key ID: EBFFF6F283F3A2B4
10 changed files with 83 additions and 24 deletions

View file

@ -6,6 +6,8 @@ module Html = Tiny_httpd_html
module IO = Tiny_httpd_core.IO
module Pool = Tiny_httpd_core.Pool
module Log = Tiny_httpd_core.Log
module Server = Tiny_httpd_core.Server
include Server
open struct
let get_max_connection_ ?(max_connections = 64) () : int =

View file

@ -108,6 +108,63 @@ module Pool = Tiny_httpd_core.Pool
module Dir = Tiny_httpd_unix.Dir
(** {2 HTML combinators} *)
module Html = Tiny_httpd_html
(** Alias to {!Tiny_httpd_html}
@since 0.12 *)
(** {2 Main server types} *)
module Server = Tiny_httpd_core.Server
include module type of struct
include Server
end
val create :
?masksigpipe:bool ->
?max_connections:int ->
?timeout:float ->
?buf_size:int ->
?get_time_s:(unit -> float) ->
?new_thread:((unit -> unit) -> unit) ->
?addr:string ->
?port:int ->
?sock:Unix.file_descr ->
?middlewares:([ `Encoding | `Stage of int ] * Middleware.t) list ->
unit ->
t
(** Create a new webserver using UNIX abstractions.
The server will not do anything until {!run} is called on it.
Before starting the server, one can use {!add_path_handler} and
{!set_top_handler} to specify how to handle incoming requests.
@param masksigpipe if true, block the signal {!Sys.sigpipe} which otherwise
tends to kill client threads when they try to write on broken sockets. Default: [true].
@param buf_size size for buffers (since 0.11)
@param new_thread a function used to spawn a new thread to handle a
new client connection. By default it is {!Thread.create} but one
could use a thread pool instead.
See for example {{: https://github.com/c-cube/tiny-httpd-moonpool-bench/blob/0dcbbffb4fe34ea4ad79d46343ad0cebb69ca69f/examples/t1.ml#L31}
this use of moonpool}.
@param middlewares see {!add_middleware} for more details.
@param max_connections maximum number of simultaneous connections.
@param timeout connection is closed if the socket does not do read or
write for the amount of second. Default: 0.0 which means no timeout.
timeout is not recommended when using proxy.
@param addr address (IPv4 or IPv6) to listen on. Default ["127.0.0.1"].
@param port to listen on. Default [8080].
@param sock an existing socket given to the server to listen on, e.g. by
systemd on Linux (or launchd on macOS). If passed in, this socket will be
used instead of the [addr] and [port]. If not passed in, those will be
used. This parameter exists since 0.10.
@param get_time_s obtain the current timestamp in seconds.
This parameter exists since 0.11.
*)

View file

@ -1,6 +1,6 @@
module S = Tiny_httpd
module U = Tiny_httpd_util
module D = Tiny_httpd_dir
module U = Tiny_httpd.Util
module D = Tiny_httpd.Dir
module Pf = Printf
module Log = Tiny_httpd.Log

View file

@ -2,14 +2,14 @@
(library
(name tiny_httpd_core)
(public_name tiny_httpd.core)
(private_modules parse_)
(private_modules parse_ common_)
(libraries threads seq hmap iostream
(select log.ml from
(logs -> log.logs.ml)
(-> log.default.ml))))
(rule
(targets Tiny_httpd_atomic_.ml)
(targets Atomic_.ml)
(deps
(:bin ./gen/mkshims.exe))
(action

View file

@ -1,4 +1,4 @@
module A = Tiny_httpd_atomic_
module A = Atomic_
type 'a list_ = Nil | Cons of int * 'a * 'a list_

View file

@ -1,3 +0,0 @@
module A = Tiny_httpd_atomic_
let spf = Printf.sprintf

View file

@ -0,0 +1,3 @@
module A = Tiny_httpd_core.Atomic_
let spf = Printf.sprintf

View file

@ -4,9 +4,10 @@
(name tiny_httpd_prometheus)
(public_name tiny_httpd.prometheus)
(synopsis "Metrics using prometheus")
(private_modules common_ time_)
(private_modules common_p_ time_)
(flags :standard -open Tiny_httpd_core)
(libraries
tiny_httpd unix
tiny_httpd.core unix
(select time_.ml from
(mtime mtime.clock.os -> time_.mtime.ml)
(-> time_.default.ml))))

View file

@ -2,7 +2,7 @@
https://prometheus.io/docs/instrumenting/exposition_formats/#text-based-format
*)
open Common_
open Common_p_
let bpf = Printf.bprintf
@ -175,9 +175,7 @@ end
let global = Registry.create ()
module H = Tiny_httpd
let http_middleware (reg : Registry.t) : H.Middleware.t =
let http_middleware (reg : Registry.t) : Server.Middleware.t =
let c_req =
Counter.create reg "tiny_httpd_requests" ~descr:"number of HTTP requests"
in
@ -189,11 +187,11 @@ let http_middleware (reg : Registry.t) : H.Middleware.t =
~buckets:[ 0.001; 0.01; 0.1; 0.5; 1.; 5.; 10. ]
in
fun h : H.Middleware.handler ->
fun h : Server.Middleware.handler ->
fun req ~resp : unit ->
let start = Time_.now_us () in
Counter.incr c_req;
h req ~resp:(fun (response : H.Response.t) ->
h req ~resp:(fun (response : Response.t) ->
let code = response.code in
let elapsed_us = Time_.now_us () -. start in
@ -203,13 +201,14 @@ let http_middleware (reg : Registry.t) : H.Middleware.t =
if code < 200 || code >= 400 then Counter.incr c_err;
resp response)
let add_route_to_server (server : H.t) (reg : registry) : unit =
H.add_route_handler server H.Route.(exact "metrics" @/ return) @@ fun _req ->
let add_route_to_server (server : Server.t) (reg : registry) : unit =
Server.add_route_handler server Route.(exact "metrics" @/ return)
@@ fun _req ->
let str = Registry.emit_str reg in
H.Response.make_string @@ Ok str
Response.make_string @@ Ok str
let instrument_server (server : H.t) reg : unit =
H.add_middleware ~stage:(`Stage 1) server (http_middleware reg);
let instrument_server (server : Server.t) reg : unit =
Server.add_middleware ~stage:(`Stage 1) server (http_middleware reg);
add_route_to_server server reg
module GC_metrics = struct

View file

@ -77,13 +77,13 @@ end
end
*)
val http_middleware : Registry.t -> Tiny_httpd.Middleware.t
val http_middleware : Registry.t -> Server.Middleware.t
(** Middleware to get basic metrics about HTTP requests *)
val add_route_to_server : Tiny_httpd.t -> Registry.t -> unit
val add_route_to_server : Server.t -> Registry.t -> unit
(** Add a "/metrics" route to the server *)
val instrument_server : Tiny_httpd.t -> Registry.t -> unit
val instrument_server : Server.t -> Registry.t -> unit
(** Add middleware and route *)
module GC_metrics : sig