Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CP-52744: Thread TraceContext as JSON inside debug_info #6230

Open
wants to merge 2 commits into
base: feature/perf
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions dune-project
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,11 @@
dune
(alcotest :with-test)
(fmt :with-test)
ppx_deriving_rpc
re
rpclib
result
rresult
uri
(uuid :with-test)
(xapi-log (= :version))
Expand Down
13 changes: 12 additions & 1 deletion ocaml/libs/tracing/dune
Original file line number Diff line number Diff line change
@@ -1,7 +1,18 @@
(library
(name tracing)
(modules tracing)
(libraries re uri xapi-log xapi-stdext-threads threads.posix)
(libraries
re
rpclib.core
rpclib.json
result
rresult
uri
xapi-log
xapi-stdext-threads
threads.posix)
(preprocess
(pps ppx_deriving_rpc))
(public_name xapi-tracing))

(library
Expand Down
24 changes: 19 additions & 5 deletions ocaml/libs/tracing/tracing.ml
Original file line number Diff line number Diff line change
Expand Up @@ -211,11 +211,12 @@ end

(* The context of a trace that can be propagated across service boundaries. *)
module TraceContext = struct
type traceparent = string
type traceparent = string [@@deriving rpcty]

type baggage = (string * string) list
type baggage = (string * string) list [@@deriving rpcty]

type t = {traceparent: traceparent option; baggage: baggage option}
[@@deriving rpcty]

let empty = {traceparent= None; baggage= None}

Expand All @@ -226,6 +227,15 @@ module TraceContext = struct
let traceparent_of ctx = ctx.traceparent

let baggage_of ctx = ctx.baggage

let to_json_string trace_context =
Rpcmarshal.marshal t.Rpc.Types.ty trace_context |> Jsonrpc.to_string

let of_json_string s =
s
|> Jsonrpc.of_string
|> Rpcmarshal.unmarshal t.Rpc.Types.ty
|> Rresult.R.get_ok
end

module SpanContext = struct
Expand Down Expand Up @@ -297,6 +307,8 @@ module Span = struct

let get_context t = t.context

let get_trace_context t = t.context |> SpanContext.context_of_span_context

let start ?(attributes = Attributes.empty)
?(trace_context : TraceContext.t option) ~name ~parent ~span_kind () =
let trace_id, extra_context =
Expand All @@ -310,11 +322,13 @@ module Span = struct
let context : SpanContext.t =
{trace_id; span_id; trace_context= extra_context}
in
let traceparent = context |> SpanContext.to_traceparent in
let context =
(* If trace_context is provided to the call, override any inherited trace context. *)
Option.fold ~none:context
~some:(Fun.flip SpanContext.with_trace_context context)
trace_context
trace_context
|> Option.map (TraceContext.with_traceparent (Some traceparent))
|> Option.fold ~none:context
~some:(Fun.flip SpanContext.with_trace_context context)
in
(* Using gettimeofday over Mtime as it is better for sharing timestamps between the systems *)
let begin_time = Unix.gettimeofday () in
Expand Down
6 changes: 6 additions & 0 deletions ocaml/libs/tracing/tracing.mli
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,10 @@ module TraceContext : sig
val traceparent_of : t -> traceparent option

val baggage_of : t -> baggage option

val to_json_string : t -> string

val of_json_string : string -> t
end

module SpanContext : sig
Expand All @@ -119,6 +123,8 @@ module Span : sig

val get_context : t -> SpanContext.t

val get_trace_context : t -> TraceContext.t

val add_link : t -> SpanContext.t -> (string * string) list -> t

val add_event : t -> string -> (string * string) list -> t
Expand Down
31 changes: 24 additions & 7 deletions ocaml/xapi-idl/lib/debug_info.ml
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,14 @@ let of_string s =
let open Tracing in
match String.split_on_char separator s with
| [log; traceparent] ->
let spancontext = SpanContext.of_traceparent traceparent in
let trace_context =
try Tracing.TraceContext.of_json_string traceparent
with _ ->
TraceContext.empty |> TraceContext.with_traceparent (Some traceparent)
in
let spancontext = Tracing.SpanContext.of_trace_context trace_context in
let tracing =
Option.map (fun tp -> Tracer.span_of_span_context tp log) spancontext
Option.map (Fun.flip Tracer.span_of_span_context log) spancontext
in
{log; tracing}
| _ ->
Expand All @@ -37,11 +42,18 @@ let filter_separator = Astring.String.filter (( <> ) separator)
let to_string t =
Option.fold ~none:t.log
~some:(fun span ->
let traceparent =
Tracing.Span.get_context span |> Tracing.SpanContext.to_traceparent
let trace_context =
let traceparent =
span |> Tracing.Span.get_context |> Tracing.SpanContext.to_traceparent
in
span
|> Tracing.Span.get_context
|> Tracing.SpanContext.context_of_span_context
|> Tracing.TraceContext.with_traceparent (Some traceparent)
|> Tracing.TraceContext.to_json_string
in
Printf.sprintf "%s%c%s" (filter_separator t.log) separator
(filter_separator traceparent)
(filter_separator trace_context)
)
t.tracing

Expand All @@ -68,7 +80,12 @@ let with_dbg ?(with_thread = false) ~module_name ~name ~dbg f =

let traceparent_of_dbg dbg =
match String.split_on_char separator dbg with
| [_; traceparent] ->
Some traceparent
| [_; traceparent] -> (
try
traceparent
|> Tracing.TraceContext.of_json_string
|> Tracing.TraceContext.traceparent_of
with _ -> Some traceparent
)
| _ ->
None
4 changes: 4 additions & 0 deletions xapi-tracing.opam
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,11 @@ depends: [
"dune" {>= "3.15"}
"alcotest" {with-test}
"fmt" {with-test}
"ppx_deriving_rpc"
"re"
"rpclib"
"result"
"rresult"
"uri"
"uuid" {with-test}
"xapi-log" {= version}
Expand Down
Loading