You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
2.3 KiB
69 lines
2.3 KiB
(*
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*)
|
|
|
|
open! IStd
|
|
module SMap = Map.Make (String)
|
|
|
|
type table = InferEvents
|
|
|
|
type sample =
|
|
{ int_section: int SMap.t (** All integer type fields and their values *)
|
|
; normal_section: string SMap.t
|
|
(** All string (normal in Scuba terminology) type fields and their values *)
|
|
; tagset_section: string list SMap.t
|
|
(** All sets of strings (tagsets in Scuba terminology) type fields and their values *) }
|
|
|
|
let new_sample ~time =
|
|
let time = match time with Some time -> time | None -> int_of_float (Unix.time ()) in
|
|
{ (* time is a single mandatory field in scuba. without it,
|
|
scuba disregards all samples *)
|
|
int_section= SMap.singleton "time" time
|
|
; normal_section= SMap.empty
|
|
; tagset_section= SMap.empty }
|
|
|
|
|
|
let add_int ~name ~value sample =
|
|
let int_section = SMap.set sample.int_section ~key:name ~data:value in
|
|
{sample with int_section}
|
|
|
|
|
|
let add_normal ~name ~value sample =
|
|
let normal_section = SMap.set sample.normal_section ~key:name ~data:value in
|
|
{sample with normal_section}
|
|
|
|
|
|
let add_tagset ~name ~value sample =
|
|
let tagset_section = SMap.set sample.tagset_section ~key:name ~data:value in
|
|
{sample with tagset_section}
|
|
|
|
|
|
let sample_to_json sample =
|
|
let map_to_assoc value_to_json key_value_map =
|
|
let pairs = SMap.to_alist key_value_map in
|
|
let assocs = List.map pairs ~f:(fun (name, data) -> (name, value_to_json data)) in
|
|
`Assoc assocs
|
|
in
|
|
let ints_to_assoc = map_to_assoc (fun data -> `Int data) in
|
|
let normals_to_assoc = map_to_assoc (fun data -> `String data) in
|
|
let tags_to_assoc = map_to_assoc (fun data -> `List (List.map data ~f:(fun d -> `String d))) in
|
|
`Assoc
|
|
[ ("int", ints_to_assoc sample.int_section)
|
|
; ("normal", normals_to_assoc sample.normal_section)
|
|
; ("tags", tags_to_assoc sample.tagset_section) ]
|
|
|
|
|
|
let sample_to_json_string sample = sample |> sample_to_json |> Yojson.Basic.to_string
|
|
|
|
let table_to_scribe_category = function InferEvents -> Scribe.InferEvents
|
|
|
|
let log table samples =
|
|
let category = table_to_scribe_category table in
|
|
Scribe.log category (List.map samples ~f:sample_to_json_string)
|
|
|
|
|
|
let log = if Config.scuba_logging then log else fun _ _ -> ()
|