mirage-monitoring/src/monitoring_experiments.ml

62 lines
2 KiB
OCaml
Raw Normal View History

2019-11-06 18:28:26 +00:00
open Lwt.Infix
2019-05-12 21:25:25 +00:00
2019-11-06 18:28:26 +00:00
let src = Logs.Src.create "influx" ~doc:"influx metrics reporter"
module Log = (val Logs.src_log src : Logs.LOG)
2019-05-12 21:25:25 +00:00
2019-11-06 18:28:26 +00:00
let vmname = Metrics.field ~doc:"name of the virtual machine" "vm" Metrics.String
2019-05-12 21:25:25 +00:00
2019-11-06 18:28:26 +00:00
module Make (T : Mirage_time.S) (S : Mirage_stack.V4) = struct
2019-05-12 21:25:25 +00:00
2019-11-06 18:28:26 +00:00
let timer conn get host stack dst =
let datas =
2019-11-06 20:43:02 +00:00
Metrics.SM.fold (fun src (tags, data) acc ->
2019-11-06 18:28:26 +00:00
let name = Metrics.Src.name src in
2019-11-06 20:43:02 +00:00
Metrics_influx.encode_line_protocol (host@tags) data name :: acc)
2019-11-06 18:28:26 +00:00
(get ()) []
2019-05-12 21:25:25 +00:00
in
2019-11-06 18:28:26 +00:00
let datas = String.concat "" datas in
let write flow =
Log.debug (fun m -> m "sending measurements");
S.TCPV4.write flow (Cstruct.of_string datas) >|= function
| Ok () -> ()
| Error e ->
Log.err (fun m -> m "error %a writing to metrics" S.TCPV4.pp_write_error e);
conn := None
2019-05-12 21:25:25 +00:00
in
2019-11-06 18:28:26 +00:00
match !conn with
| None ->
begin
Log.debug (fun m -> m "creating connection");
S.TCPV4.create_connection (S.tcpv4 stack) dst >>= function
| Error msg ->
Log.err (fun m -> m "couldn't create connection %a"
S.TCPV4.pp_error msg);
Lwt.return_unit
| Ok flow ->
conn := Some flow;
write flow
end
| Some f -> write f
let timer_loop get host interval stack dst () =
let conn = ref None in
let rec one () =
Lwt.join [
timer conn get host stack dst;
2019-05-12 21:25:25 +00:00
T.sleep_ns (Duration.of_sec interval)
] >>= fun () ->
2019-11-06 18:28:26 +00:00
(one[@tailcall]) ()
in
one ()
2019-11-07 14:42:23 +00:00
let create ?(interval = 10) ?hostname dst ?(port = 8094) stack =
2019-11-06 18:28:26 +00:00
let get_cache, reporter = Metrics.cache_reporter () in
Metrics.set_reporter reporter;
Metrics.enable_all ();
Metrics_lwt.init_periodic (fun () -> T.sleep_ns (Duration.of_sec interval));
Metrics_lwt.periodically (OS.MM.malloc_metrics ~tags:Metrics.Tags.[]);
let host = match hostname with None -> [] | Some host -> [vmname host] in
2019-11-07 14:42:23 +00:00
Lwt.async (timer_loop get_cache host interval stack (dst, port))
2019-05-12 21:25:25 +00:00
end