<?xml version='1.0' encoding='utf-8'?>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.4.15 -->
<!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent">
<?rfc toc="yes"?>
<?rfc docindent="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>
<?rfc strict="yes"?>
<?rfc compact="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-quic-qlog-main-schema-00" category="std" obsoletes="" updates="" submissionType="IETF" xml:lang="en" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.8.0 -->
  <front>
    <title>Main logging schema for qlog</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-main-schema-00"/>
    <author initials="R." surname="Marx" fullname="Robin Marx" role="editor">
      <organization>KU Leuven</organization>
      <address>
        <email>robin.marx@kuleuven.be</email>
      </address>
    </author>
    <author initials="L." surname="Niccolini" fullname="Luca Niccolini" role="editor">
      <organization>Facebook</organization>
      <address>
        <email>lniccolini@fb.com</email>
      </address>
    </author>
    <author initials="M." surname="Seemann" fullname="Marten Seemann" role="editor">
      <organization>Protocol Labs</organization>
      <address>
        <email>marten@protocol.ai</email>
      </address>
    </author>
    <date year="2021" month="June" day="10"/>
    <area>Transport</area>
    <workgroup>QUIC</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>This document describes a high-level schema for a standardized logging format
called qlog.  This format allows easy sharing of data and the creation of reusable
visualization and debugging tools. The high-level schema in this document is
intended to be protocol-agnostic. Separate documents specify how the format should
be used for specific protocol data. The schema is also format-agnostic, and can be
represented in for example JSON, csv or protobuf.</t>
    </abstract>
  </front>
  <middle>
    <section anchor="introduction" numbered="true" toc="default">
      <name>Introduction</name>
      <t>There is currently a lack of an easily usable, standardized endpoint logging
format. Especially for the use case of debugging and evaluating modern Web
protocols and their performance, it is often difficult to obtain structured logs
that provide adequate information for tasks like problem root cause analysis.</t>
      <t>This document aims to provide a high-level schema and harness that describes the
general layout of an easily usable, shareable, aggregatable and structured logging
format. This high-level schema is protocol agnostic, with logging entries for
specific protocols and use cases being defined in other documents (see for example
<xref target="QLOG-QUIC" format="default"/> for QUIC and <xref target="QLOG-H3" format="default"/> for HTTP/3 and QPACK-related event
definitions).</t>
      <t>The goal of this high-level schema is to provide amenities and default
characteristics that each logging file should contain (or should be able to
contain), such that generic and reusable toolsets can be created that can deal
with logs from a variety of different protocols and use cases.</t>
      <t>As such, this document contains concepts such as versioning, metadata inclusion,
log aggregation, event grouping and log file size reduction techniques.</t>
      <t>Feedback and discussion are welcome at
<eref target="https://github.com/quicwg/qlog">https://github.com/quicwg/qlog</eref>.
Readers are advised to refer to the "editor's draft" at that URL for an up-to-date
version of this document.</t>
      <t>Concrete examples of integrations of this schema in
various programming languages can be found at
<eref target="https://github.com/quiclog/qlog/">https://github.com/quiclog/qlog/</eref>.</t>
      <section anchor="data_types" numbered="true" toc="default">
        <name>Notational Conventions</name>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
interpreted as described in <xref target="RFC2119" format="default"/>.</t>
        <t>While the qlog schema's are format-agnostic, for readability the qlog documents
will use a JSON-inspired format (<xref target="RFC8259" format="default"/>) for examples and definitions.</t>
        <t>As qlog can be serialized both textually but also in binary, we employ a custom
datatype definition language, inspired loosely by the <eref target="https://www.typescriptlang.org/">"TypeScript"
language</eref>.</t>
        <t>This document describes how to employ JSON and NDJSON as textual serializations
for qlog in <xref target="concrete-formats" format="default"/>. Other documents will describe how to utilize
other concrete serialization options, though tips and requirements for these are
also listed in this document (<xref target="concrete-formats" format="default"/>).</t>
        <t>The main general conventions in this document a reader should be aware of are:</t>
        <ul spacing="normal">
          <li>obj? : this object is optional</li>
          <li>type1 | type2 : a union of these two types (object can be either type1 OR
type2)</li>
          <li>obj:type : this object has this concrete type</li>
          <li>obj:array&lt;type&gt; : this object is an array of this type</li>
          <li>class : defines a new type</li>
          <li>// : single-line comment</li>
        </ul>
        <t>The main data types are:</t>
        <ul spacing="normal">
          <li>int8 : signed 8-bit integer</li>
          <li>int16 : signed 16-bit integer</li>
          <li>int32 : signed 32-bit integer</li>
          <li>int64 : signed 64-bit integer</li>
          <li>uint8 : unsigned 8-bit integer</li>
          <li>uint16 : unsigned 16-bit integer</li>
          <li>uint32 : unsigned 32-bit integer</li>
          <li>uint64 : unsigned 64-bit integer</li>
          <li>float : 32-bit floating point value</li>
          <li>double : 64-bit floating point value</li>
          <li>byte : an individual raw byte (8-bit) value (use array&lt;byte&gt; or the
shorthand "bytes" to specify a binary blob)</li>
          <li>string : list of Unicode (typically UTF-8) encoded characters</li>
          <li>boolean : boolean</li>
          <li>enum: fixed list of values (Unless explicity defined, the value of an enum entry
is the string version of its name (e.g., initial = "initial"))</li>
          <li>any : represents any object type. Mainly used here as a placeholder for more
concrete types defined in related documents (e.g., specific event types)</li>
        </ul>
        <t>All timestamps and time-related values (e.g., offsets) in qlog are logged as
doubles in the millisecond resolution.</t>
        <t>Other qlog documents can define their own data types (e.g., separately for each
Packet type that a protocol supports).</t>
      </section>
    </section>
    <section anchor="design-goals" numbered="true" toc="default">
      <name>Design goals</name>
      <t>The main tenets for the qlog schema design are:</t>
      <ul spacing="normal">
        <li>Streamable, event-based logging</li>
        <li>Flexibility in the format, complexity in the tooling (e.g., few components are a
MUST, tools need to deal with this)</li>
        <li>Extensible and pragmatic (e.g., no complex fixed schema with extension points)</li>
        <li>Aggregation and transformation friendly (e.g., the top-level element is a
container for individual traces, group_id can be used to tag events to a
particular context)</li>
        <li>Metadata is stored together with event data</li>
      </ul>
    </section>
    <section anchor="top-level" numbered="true" toc="default">
      <name>The high level qlog schema</name>
      <t>A qlog file should be able to contain several indivdual traces and logs from
multiple vantage points that are in some way related. To that end, the top-level
element in the qlog schema defines only a small set of "header" fields and an
array of component traces. For this document, the required "qlog_version" field
MUST have a value of "qlog-03-WIP".</t>
      <dl>
        <dt>
Note:  </dt>
        <dd>
          <t>there have been several previously broadly deployed qlog versions based on older
drafts of this document (see draft-marx-qlog-main-schema). The old values for the
"qlog_version" field were "draft-00", "draft-01" and "draft-02". When qlog was
moved to the QUIC working group, we decided to increment the existing counter,
rather than reverting back to -00. As such, any numbering indicating in the
"qlog_version" field is explicitly not tied to a particular version of the draft
documents.</t>
        </dd>
      </dl>
      <t>As qlog can be serialized in a variety of ways, the "qlog_format" field is used to
indicate which serialization option was chosen. Its value MUST either be one of
the options defined in this document (e.g., <xref target="concrete-formats" format="default"/>) or the field
must be omitted entirely, in which case it assumes the default value of "JSON".</t>
      <t>In order to make it easier to parse and identify qlog files and their
serialization format, the "qlog_version" and "qlog_format" fields and their values
SHOULD be in the first 256 characters/bytes of the resulting log file.</t>
      <t>An example of the qlog file's top-level structure is shown in <xref target="top-element" format="default"/>.</t>
      <figure anchor="top-element">
        <name>Top-level element</name>
        <sourcecode type="json">
Definition:

class QlogFile {
    qlog_version:string,
    qlog_format?:string,
    title?:string,
    description?:string,
    summary?: Summary,
    traces: array&lt;Trace|TraceError&gt;
}

JSON serialization:

{
    "qlog_version": "draft-03-WIP",
    "qlog_format": "JSON",
    "title": "Name of this particular qlog file (short)",
    "description": "Description for this group of traces (long)",
    "summary": {
        ...
    },
    "traces": [...]
}
</sourcecode>
      </figure>
      <section anchor="summary" numbered="true" toc="default">
        <name>summary</name>
        <t>In a real-life deployment with a large amount of generated logs, it can be useful
to sort and filter logs based on some basic summarized or aggregated data (e.g.,
log length, packet loss rate, log location, presence of error events, ...). The
summary field (if present) SHOULD be on top of the qlog file, as this allows for
the file to be processed in a streaming fashion (i.e., the implementation could
just read up to and including the summary field and then only load the full logs
that are deemed interesting by the user).</t>
        <t>As the summary field is highly deployment-specific, this document does not specify
any default fields or their semantics. Some examples of potential entries are
shown in <xref target="summary-example" format="default"/>.</t>
        <figure anchor="summary-example">
          <name>Summary example definition</name>
          <sourcecode type="json">
Definition (purely illustrative example):

class Summary {
    "trace_count":uint32, // amount of traces in this file
    "max_duration":uint64, // time duration of the longest trace in ms
    "max_outgoing_loss_rate":float, // highest loss rate for outgoing packets over all traces
    "total_event_count":uint64, // total number of events across all traces,
    "error_count":uint64 // total number of error events in this trace
}

JSON serialization:

{
    "trace_count": 1,
    "max_duration": 5006,
    "max_outgoing_loss_rate": 0.013,
    "total_event_count": 568,
    "error_count": 2
}
</sourcecode>
        </figure>
      </section>
      <section anchor="traces" numbered="true" toc="default">
        <name>traces</name>
        <t>It is often advantageous to group several related qlog traces together in a single
file. For example, we can simultaneously perform logging on the client, on the
server and on a single point on their common network path. For analysis, it is
useful to aggregate these three individual traces together into a single file, so
it can be uniquely stored, transferred and annotated.</t>
        <t>As such, the "traces" array contains a list of individual qlog traces. Typical
qlogs will only contain a single trace in this array. These can later be combined
into a single qlog file by taking the "traces" entry/entries for each qlog file
individually and copying them to the "traces" array of a new, aggregated qlog
file. This is typically done in a post-processing step.</t>
        <t>The "traces" array can thus contain both normal traces (for the definition of the
Trace type, see <xref target="trace" format="default"/>), but also "error" entries. These indicate that we tried
to find/convert a file for inclusion in the aggregated qlog, but there was an
error during the process. Rather than silently dropping the erroneous file, we can
opt to explicitly include it in the qlog file as an entry in the "traces" array,
as shown in <xref target="trace-error" format="default"/>.</t>
        <figure anchor="trace-error">
          <name>TraceError definition</name>
          <sourcecode type="json">
Definition:

class TraceError {
    error_description: string, // A description of the error
    uri?: string, // the original URI at which we attempted to find the file
    vantage_point?: VantagePoint // see {{vantage_point}}: the vantage point we were expecting to include here
}

JSON serialization:

{
    "error_description": "File could not be found",
    "uri": "/srv/traces/today/latest.qlog",
    "vantage_point": { type: "server" }
}
</sourcecode>
        </figure>
        <t>Note that another way to combine events of different traces in a single qlog file
is through the use of the "group_id" field, discussed in <xref target="group-ids" format="default"/>.</t>
      </section>
      <section anchor="trace" numbered="true" toc="default">
        <name>Individual Trace containers</name>
        <t>The exact conceptual definition of a Trace can be fluid. For example, a trace
could contain all events for a single connection, for a single endpoint, for a
single measurement interval, for a single protocol, etc. As such, a Trace
container contains some metadata in addition to the logged events, see
<xref target="trace-container" format="default"/>.</t>
        <t>In the normal use case however, a trace is a log of a single data flow collected
at a single location or vantage point. For example, for QUIC, a single trace only
contains events for a single logical QUIC connection for either the client or the
server.</t>
        <t>The semantics and context of the trace can mainly be deduced from the entries in
the "common_fields" list and "vantage_point" field.</t>
        <figure anchor="trace-container">
          <name>Trace container definition</name>
          <sourcecode type="json">
Definition:

class Trace {
    title?: string,
    description?: string,
    configuration?: Configuration,
    common_fields?: CommonFields,
    vantage_point: VantagePoint,
    events: array&lt;Event&gt;
}

JSON serialization:

{
    "title": "Name of this particular trace (short)",
    "description": "Description for this trace (long)",
    "configuration": {
        "time_offset": 150
    },
    "common_fields": {
        "ODCID": "abcde1234",
        "time_format": "absolute"
    },
    "vantage_point": {
        "name": "backend-67",
        "type": "server"
    },
    "events": [...]
}
</sourcecode>
        </figure>
        <section anchor="configuration" numbered="true" toc="default">
          <name>configuration</name>
          <t>We take into account that a qlog file is usually not used in isolation, but by
means of various tools. Especially when aggregating various traces together or
preparing traces for a demonstration, one might wish to persist certain tool-based
settings inside the qlog file itself. For this, the configuration field is used.</t>
          <t>The configuration field can be viewed as a generic metadata field that tools can
fill with their own fields, based on per-tool logic. It is best practice for tools
to prefix each added field with their tool name to prevent collisions across
tools. This document only defines two optional, standard, tool-independent
configuration settings: "time_offset" and "original_uris".</t>
          <figure anchor="configuration_example">
            <name>Configuration definition</name>
            <sourcecode type="json">
Definition:

class Configuration {
    time_offset:double, // in ms,
    original_uris: array&lt;string&gt;,

    // list of fields with any type
}

JSON serialization:

{
    "time_offset": 150, // starts 150ms after the first timestamp indicates
    "original_uris": [
        "https://example.org/trace1.qlog",
        "https://example.org/trace2.qlog"
    ]
}
</sourcecode>
          </figure>
          <section anchor="timeoffset" numbered="true" toc="default">
            <name>time_offset</name>
            <t>The time_offset field indicates by how many milliseconds the starting time of the current
trace should be offset. This is useful when comparing logs taken from various
systems, where clocks might not be perfectly synchronous. Users could use manual
tools or automated logic to align traces in time and the found optimal offsets can
be stored in this field for future usage. The default value is 0.</t>
          </section>
          <section anchor="originaluris" numbered="true" toc="default">
            <name>original_uris</name>
            <t>The original_uris field is used when merging multiple individual qlog files or
other source files (e.g., when converting .pcaps to qlog). It allows to keep
better track where certain data came from. It is a simple array of strings. It is
an array instead of a single string, since a single qlog trace can be made up out
of an aggregation of multiple component qlog traces as well. The default value is
an empty array.</t>
          </section>
          <section anchor="custom-fields" numbered="true" toc="default">
            <name>custom fields</name>
            <t>Tools can add optional custom metadata to the "configuration" field to store state
and make it easier to share specific data viewpoints and view configurations.</t>
            <t>Two examples from the <eref target="https://qvis.edm.uhasselt.be">qvis toolset</eref> are shown in
<xref target="qvis-config" format="default"/>.</t>
            <figure anchor="qvis-config">
              <name>Custom configuration fields example</name>
              <artwork name="" type="" align="left" alt=""><![CDATA[
{
    "configuration" : {
        "qvis" : {
            // when loaded into the qvis toolsuite's congestion graph tool
            // zoom in on the period between 1s and 2s and select the 124th event defined in this trace
            "congestion_graph": {
                "startX": 1000,
                "endX": 2000,
                "focusOnEventIndex": 124
            }


            // when loaded into the qvis toolsuite's sequence diagram tool
            // automatically scroll down the timeline to the 555th event defined in this trace
            "sequence_diagram" : {
                "focusOnEventIndex": 555
            }
        }
    }
}
]]></artwork>
            </figure>
          </section>
        </section>
        <section anchor="vantage-point" numbered="true" toc="default">
          <name>vantage_point</name>
          <t>The vantage_point field describes the vantage point from which the trace
originates, see <xref target="vantage-point-example" format="default"/>. Each trace can have only a single vantage_point
and thus all events in a trace MUST BE from the perspective of this vantage_point.
To include events from multiple vantage_points, implementers can for example
include multiple traces, split by vantage_point, in a single qlog file.</t>
          <figure anchor="vantage-point-example">
            <name>VantagePoint definition</name>
            <sourcecode type="json">
Definition:

class VantagePoint {
    name?: string,
    type: VantagePointType,
    flow?: VantagePointType
}

class VantagePointType {
    server, // endpoint which initiates the connection.
    client, // endpoint which accepts the connection.
    network, // observer in between client and server.
    unknown
}

JSON serialization examples:

{
    "name": "aioquic client",
    "type": "client",
}

{
    "name": "wireshark trace",
    "type": "network",
    "flow": "client"
}
</sourcecode>
          </figure>
          <t>The flow field is only required if the type is "network" (for example, the trace
is generated from a packet capture). It is used to disambiguate events like
"packet sent" and "packet received". This is indicated explicitly because for
multiple reasons (e.g., privacy) data from which the flow direction can be
otherwise inferred (e.g., IP addresses) might not be present in the logs.</t>
          <t>Meaning of the different values for the flow field:
  * "client" indicates that this vantage point follows client data flow semantics (a
    "packet sent" event goes in the direction of the server).
  * "server" indicates that this vantage point follow server data flow semantics (a
    "packet sent" event goes in the direction of the client).
  * "unknown" indicates that the flow's direction is unknown.</t>
          <t>Depending on the context, tools confronted with "unknown" values in the
vantage_point can either try to heuristically infer the semantics from
protocol-level domain knowledge (e.g., in QUIC, the client always sends the first
packet) or give the user the option to switch between client and server
perspectives manually.</t>
        </section>
      </section>
      <section anchor="field-name-semantics" numbered="true" toc="default">
        <name>Field name semantics</name>
        <t>Inside of the "events" field of a qlog trace is a list of events logged by the
endpoint. Each event is specified as a generic object with a number of member
fields and their associated data. Depending on the protocol and use case, the
exact member field names and their formats can differ across implementations. This
section lists the main, pre-defined and reserved field names with specific
semantics and expected corresponding value formats.</t>
        <t>Each qlog event at minimum requires the "time" (<xref target="time-based-fields" format="default"/>), "name"
(<xref target="name-field" format="default"/>) and "data" (<xref target="data-field" format="default"/>) fields. Other typical fields are
"time_format" (<xref target="time-based-fields" format="default"/>), "protocol_type" (<xref target="protocol-type-field" format="default"/>),
"trigger" (<xref target="trigger-field" format="default"/>), and "group_id" <xref target="group-ids" format="default"/>. As especially these
later fields typically have identical values across individual event instances,
they are normally logged separately in the "common_fields" (<xref target="common-fields" format="default"/>).</t>
        <t>The specific values for each of these fields and their semantics are defined in
separate documents, specific per protocol or use case. For example: event
definitions for QUIC, HTTP/3 and QPACK can be found in <xref target="QLOG-QUIC" format="default"/> and <xref target="QLOG-H3" format="default"/>.</t>
        <t>Other fields are explicitly allowed by the qlog approach, and tools SHOULD allow
for the presence of unknown event fields, but their semantics depend on the
context of the log usage (e.g., for QUIC, the ODCID field is used), see
<xref target="QLOG-QUIC" format="default"/>.</t>
        <t>An example of a qlog event with its component fields is shown in
<xref target="event-definition" format="default"/>.</t>
        <figure anchor="event-definition">
          <name>Event fields definition</name>
          <sourcecode type="json">
Definition:

class Event {
    time: double,
    name: string,
    data: any,

    protocol_type?: Array&lt;string&gt;,
    group_id?: string|uint32,

    time_format?: "absolute"|"delta"|"relative",

    // list of fields with any type
}

JSON serialization:

{
    time: 1553986553572,

    name: "transport:packet_sent",
    data: { ... }

    protocol_type:  ["QUIC","HTTP3"],
    group_id: "127ecc830d98f9d54a42c4f0842aa87e181a",

    time_format: "absolute",

    ODCID: "127ecc830d98f9d54a42c4f0842aa87e181a", // QUIC specific
}
</sourcecode>
        </figure>
        <section anchor="time-based-fields" numbered="true" toc="default">
          <name>timestamps</name>
          <t>The "time" field indicates the timestamp at which the event occured. Its value is
typically the Unix timestamp since the 1970 epoch (number of milliseconds since
midnight UTC, January 1, 1970, ignoring leap seconds). However, qlog supports two
more succint timestamps formats to allow reducing file size. The employed format
is indicated in the "time_format" field, which allows one of three values:
"absolute", "delta" or "relative":</t>
          <ul spacing="normal">
            <li>Absolute: Include the full absolute timestamp with each event. This approach
uses the largest amount of characters. This is also the default value of the
"time_format" field.</li>
            <li>Delta: Delta-encode each time value on the previously logged value. The first
event in a trace typically logs the full absolute timestamp. This approach uses
the least amount of characters.</li>
            <li>Relative: Specify a full "reference_time" timestamp (typically this is done
up-front in "common_fields", see <xref target="common-fields" format="default"/>) and include only
relatively-encoded values based on this reference_time with each event. The
"reference_time" value is typically the first absolute timestamp. This approach
uses a medium amount of characters.</li>
          </ul>
          <t>The first option is good for stateless loggers, the second and third for stateful
loggers. The third option is generally preferred, since it produces smaller files
while being easier to reason about. An example for each option can be seen in
<xref target="time-examples" format="default"/>.</t>
          <figure anchor="time-examples">
            <name>Three different approaches for logging timestamps</name>
            <artwork name="" type="" align="left" alt=""><![CDATA[
The absolute approach will use:
1500, 1505, 1522, 1588

The delta approach will use:
1500, 5, 17, 66

The relative approach will:
- set the reference_time to 1500 in "common_fields"
- use: 0, 5, 22, 88

]]></artwork>
          </figure>
          <t>One of these options is typically chosen for the entire trace (put differently:
each event has the same value for the "time_format" field). Each event MUST
include a timestamp in the "time" field.</t>
          <t>Events in each individual trace SHOULD be logged in strictly ascending timestamp
order (though not necessarily absolute value, for the "delta" format). Tools CAN
sort all events on the timestamp before processing them, though are not required
to (as this could impose a significant processing overhead). This can be a problem
especially for multi-threaded and/or streaming loggers, who could consider using a
separate postprocesser to order qlog events in time if a tool do not provide this
feature.</t>
          <t>Timestamps do not have to use the UNIX epoch timestamp as their reference. For
example for privacy considerations, any initial reference timestamps (for example
"endpoint uptime in ms" or "time since connection start in ms") can be chosen.
Tools SHOULD NOT assume the ability to derive the absolute Unix timestamp from
qlog traces, nor allow on them to relatively order events across two or more
separate traces (in this case, clock drift should also be taken into account).</t>
        </section>
        <section anchor="name-field" numbered="true" toc="default">
          <name>category and event</name>
          <t>Events differ mainly in the type of metadata associated with them. To help
identify a given event and how to interpret its metadata in the "data" field (see
<xref target="data-field" format="default"/>), each event has an associated "name" field. This can be considered
as a concatenation of two other fields, namely event "category" and event "type".</t>
          <t>Category allows a higher-level grouping of events per specific event type. For
example for QUIC and HTTP/3, the different categories could be "transport",
"http", "qpack", and "recovery". Within these categories, the event Type provides
additional granularity. For example for QUIC and HTTP/3, within the "transport"
Category, there would be "packet_sent" and "packet_received" events.</t>
          <t>Logging category and type separately conceptually allows for fast and high-level
filtering based on category and the re-use of event types across categories.
However, it also considerably inflates the log size and this flexibility is not
used extensively in practice at the time of writing.</t>
          <t>As such, the default approach in qlog is to concatenate both field values using
the ":" character in the "name" field, as can be seen in <xref target="name-example" format="default"/>. As
such, qlog category and type names MUST NOT include this character.</t>
          <figure anchor="name-example">
            <name>Ways of logging category, type and name of an event.</name>
            <artwork name="" type="" align="left" alt=""><![CDATA[
JSON serialization using separate fields:
{
    category: "transport",
    type: "packet_sent"
}

JSON serialization using ":" concatenated field:
{
    name: "transport:packet_sent"
}
]]></artwork>
          </figure>
          <t>Certain serializations CAN emit category and type as separate fields, and qlog
tools SHOULD be able to deal with both the concatenated "name" field, and the
separate "category" and "type" fields. Text-based serializations however are
encouraged to employ the concatenated "name" field for efficiency.</t>
        </section>
        <section anchor="data-field" numbered="true" toc="default">
          <name>data</name>
          <t>The data field is a generic object. It contains the per-event metadata and its
form and semantics are defined per specific sort of event. For example, data field
value definitons for QUIC and HTTP/3 can be found in <xref target="QLOG-QUIC" format="default"/> and <xref target="QLOG-H3" format="default"/>.</t>
          <t>One purely illustrative example for a QUIC "packet_sent" event is shown in
<xref target="data-example" format="default"/>.</t>
          <figure anchor="data-example">
            <name>Example of the 'data' field for a QUIC packet_sent event</name>
            <sourcecode type="json">
Definition:

class TransportPacketSentEvent {
    packet_size?:uint32,
    header:PacketHeader,
    frames?:Array&lt;QuicFrame&gt;
}

JSON serialization:

{
    packet_size: 1280,
    header: {
        packet_type: "1RTT",
        packet_number: 123
    },
    frames: [
        {
            frame_type: "stream",
            length: 1000,
            offset: 456
        },
        {
            frame_type: "padding"
        }
    ]
}
</sourcecode>
          </figure>
        </section>
        <section anchor="protocol-type-field" numbered="true" toc="default">
          <name>protocol_type</name>
          <t>The "protocol_type" array field indicates to which protocols (or protocol
"stacks") this event belongs. This allows a single qlog file to aggregate traces
of different protocols (e.g., a web server offering both TCP+HTTP/2 and
QUIC+HTTP/3 connections).</t>
          <t>For example, QUIC and HTTP/3 events have the "QUIC" and "HTTP3" protocol_type
entry values, see <xref target="QLOG-QUIC" format="default"/> and <xref target="QLOG-H3" format="default"/>.</t>
          <t>Typically however, all events in a single trace are of the same few protocols, and
this array field is logged once in "common_fields", see <xref target="common-fields" format="default"/>.</t>
        </section>
        <section anchor="trigger-field" numbered="true" toc="default">
          <name>triggers</name>
          <t>Sometimes, additional information is needed in the case where a single event can
be caused by a variety of other events. In the normal case, the context of the
surrounding log messages gives a hint as to which of these other events was the
cause. However, in highly-parallel and optimized implementations, corresponding
log messages might separated in time. Another option is to explicitly indicate
these "triggers" in a high-level way per-event to get more fine-grained
information without much additional overhead.</t>
          <t>In qlog, the optional "trigger" field contains a string value describing the
reason (if any) for this event instance occuring. While this "trigger" field could
be a property of the qlog Event itself, it is instead a property of the "data"
field instead. This choice was made because many event types do not include a
trigger value, and having the field at the Event-level would cause overhead in
some serializations. Additional information on the trigger can be added in the
form of additional member fields of the "data" field value, yet this is highly
implementation-specific, as are the trigger field's string values.</t>
          <t>One purely illustrative example of some potential triggers for QUIC's
"packet_dropped" event is shown in <xref target="trigger-example" format="default"/>.</t>
          <figure anchor="trigger-example">
            <name>Trigger example</name>
            <sourcecode type="json">
Definition:

class QuicPacketDroppedEvent {
    packet_type?:PacketType,
    raw_length?:uint32,

    trigger?: "key_unavailable" | "unknown_connection_id" | "decrypt_error" | "unsupported_version"
}
</sourcecode>
          </figure>
        </section>
        <section anchor="group-ids" numbered="true" toc="default">
          <name>group_id</name>
          <t>As discussed in <xref target="trace" format="default"/>, a single qlog file can contain several traces taken
from different vantage points. However, a single trace from one endpoint can also
contain events from a variety of sources. For example, a server implementation
might choose to log events for all incoming connections in a single large
(streamed) qlog file. As such, we need a method for splitting up events belonging
to separate logical entities.</t>
          <t>The simplest way to perform this splitting is by associating a "group identifier"
to each event that indicates to which conceptual "group" each event belongs. A
post-processing step can then extract events per group. However, this group
identifier can be highly protocol and context-specific. In the example above, we
might use QUIC's "Original Destination Connection ID" to uniquely identify a
connection. As such, they might add a "ODCID" field to each event. However, a
middlebox logging IP or TCP traffic might rather use four-tuples to identify
connections, and add a "four_tuple" field.</t>
          <t>As such, to provide consistency and ease of tooling in cross-protocol and
cross-context setups, qlog instead defines the common "group_id" field, which
contains a string value. Implementations are free to use their preferred string
serialization for this field, so long as it contains a unique value per logical
group. Some examples can be seen in <xref target="group-id-example" format="default"/>.</t>
          <figure anchor="group-id-example">
            <name>Example of group_id usage</name>
            <sourcecode type="json">
JSON serialization for events grouped by four tuples and QUIC connection IDs:

events: [
    {
        time: 1553986553579,
        protocol_type: ["TCP", "TLS", "HTTP2"],
        group_id: "ip1=2001:67c:1232:144:9498:6df6:f450:110b,ip2=2001:67c:2b0:1c1::198,port1=59105,port2=80",
        name: "transport:packet_received",
        data: { ... },
    },
    {
        time: 1553986553581,
        protocol_type: ["QUIC","HTTP3"],
        group_id: "127ecc830d98f9d54a42c4f0842aa87e181a",
        name: "transport:packet_sent",
        data: { ... },
    }
]
</sourcecode>
          </figure>
          <t>Note that in some contexts (for example a Multipath transport protocol) it might
make sense to add additional contextual per-event fields (for example "path_id"),
rather than use the group_id field for that purpose.</t>
          <t>Note also that, typically, a single trace only contains events belonging to a
single logical group (for example, an individual QUIC connection). As such,
instead of logging the "group_id" field with an identical value for each event
instance, this field is typically logged once in "common_fields", see
<xref target="common-fields" format="default"/>.</t>
        </section>
        <section anchor="common-fields" numbered="true" toc="default">
          <name>common_fields</name>
          <t>As discussed in the previous sections, information for a typical qlog event varies
in three main fields: "time", "name" and associated data. Additionally, there are
also several more advanced fields that allow mixing events from different
protocols and contexts inside of the same trace (for example "protocol_type" and
"group_id"). In most "normal" use cases however, the values of these advanced
fields are consistent for each event instance (for example, a single trace
contains events for a single QUIC connection).</t>
          <t>To reduce file size and making logging easier, qlog uses the "common_fields" list
to indicate those fields and their values that are shared by all events in this
component trace. This prevents these fields from being logged for each individual
event. An example of this is shown in <xref target="common-fields-example" format="default"/>.</t>
          <figure anchor="common-fields-example">
            <name>Example of common_fields usage</name>
            <sourcecode type="json">
JSON serialization with repeated field values per-event instance:

{
    events: [{
            group_id: "127ecc830d98f9d54a42c4f0842aa87e181a",
            protocol_type: ["QUIC","HTTP3"],
            time_format: "relative",
            reference_time: "1553986553572",

            time: 2,
            name: "transport:packet_received",
            data: { ... }
        },{
            group_id: "127ecc830d98f9d54a42c4f0842aa87e181a",
            protocol_type: ["QUIC","HTTP3"],
            time_format: "relative",
            reference_time: "1553986553572",

            time: 7,
            name: "http:frame_parsed",
            data: { ... }
        }
    ]
}

JSON serialization with repeated field values extracted to common_fields:

{
    common_fields: {
        group_id: "127ecc830d98f9d54a42c4f0842aa87e181a",
        protocol_type: ["QUIC","HTTP3"],
        time_format: "relative",
        reference_time: "1553986553572"
    },
    events: [
        {
            time: 2,
            name: "transport:packet_received",
            data: { ... }
        },{
            7,
            name: "http:frame_parsed",
            data: { ... }
        }
    ]
}
</sourcecode>
          </figure>
          <t>The "common_fields" field is a generic dictionary of key-value pairs, where the
key is always a string and the value can be of any type, but is typically also a
string or number. As such, unknown entries in this dictionary MUST be disregarded
by the user and tools (i.e., the presence of an uknown field is explicitly NOT an
error).</t>
          <t>The list of default qlog fields that are typically logged in common_fields (as
opposed to as individual fields per event instance) are:</t>
          <ul spacing="normal">
            <li>time_format</li>
            <li>reference_time</li>
            <li>protocol_type</li>
            <li>group_id</li>
          </ul>
          <t>Tools MUST be able to deal with these fields being defined either on each event
individually or combined in common_fields. Note that if at least one event in a
trace has a different value for a given field, this field MUST NOT be added to
common_fields but instead defined on each event individually. Good example of such
fields are "time" and "data", who are divergent by nature.</t>
        </section>
      </section>
    </section>
    <section anchor="guidelines-for-event-definition-documents" numbered="true" toc="default">
      <name>Guidelines for event definition documents</name>
      <t>This document only defines the main schema for the qlog format. This is intended
to be used together with specific, per-protocol event definitions that specify the
name (category + type) and data needed for each individual event. This is with the
intent to allow the qlog main schema to be easily re-used for several protocols.
Examples include the QUIC event definitions <xref target="QLOG-QUIC" format="default"/> and HTTP/3 and QPACK
event definitions <xref target="QLOG-H3" format="default"/>.</t>
      <t>This section defines some basic annotations and concepts the creators of event
definition documents SHOULD follow to ensure a measure of consistency, making it
easier for qlog implementers to extrapolate from one protocol to another.</t>
      <section anchor="event-design-guidelines" numbered="true" toc="default">
        <name>Event design guidelines</name>
        <t>TODO: pending QUIC working group discussion. This text reflects the initial (qlog
draft 01 and 02) setup.</t>
        <t>There are several ways of defining qlog events. In practice, we have seen two main
types used so far: a) those that map directly to concepts seen in the protocols
(e.g., <tt>packet_sent</tt>) and b) those that act as aggregating events that combine
data from several possible protocol behaviours or code paths into one (e.g.,
<tt>parameters_set</tt>). The latter are typically used as a means to reduce the amount
of unique event definitions, as reflecting each possible protocol event as a
separate qlog entity would cause an explosion of event types.</t>
        <t>Additionally, logging duplicate data is typically prevented as much as possible.
For example, packet header values that remain consistent across many packets are
split into separate events (for example <tt>spin_bit_updated</tt> or
<tt>connection_id_updated</tt> for QUIC).</t>
        <t>Finally, we have typically refrained from adding additional state change events if
those state changes can be directly inferred from data on the wire (for example
flow control limit changes) if the implementation is bug-free and spec-compliant.
Exceptions have been made for common events that benefit from being easily
identifiable or individually logged (for example <tt>packets_acked</tt>).</t>
      </section>
      <section anchor="event-importance-indicators" numbered="true" toc="default">
        <name>Event importance indicators</name>
        <t>Depending on how events are designed, it may be that several events allow the
logging of similar or overlapping data. For example the separate QUIC
<tt>connection_started</tt> event overlaps with the more generic
<tt>connection_state_updated</tt>. In these cases, it is not always clear which event
should be logged or used, and which event should take precedence if e.g., both are
present and provide conflicting information.</t>
        <t>To aid in this decision making, we recommend that each event SHOULD have an
"importance indicator" with one of three values, in decreasing order of importance
and exptected usage:</t>
        <ul spacing="normal">
          <li>Core</li>
          <li>Base</li>
          <li>Extra</li>
        </ul>
        <t>The "Core" events are the events that SHOULD be present in all qlog files for a
given protocol. These are typically tied to basic packet and frame parsing and
creation, as well as listing basic internal metrics. Tool implementers SHOULD
expect and add support for these events, though SHOULD NOT expect all Core events
to be present in each qlog trace.</t>
        <t>The "Base" events add additional debugging options and CAN be present in qlog
files. Most of these can be implicitly inferred from data in Core events (if those
contain all their properties), but for many it is better to log the events
explicitly as well, making it clearer how the implementation behaves. These events
are for example tied to passing data around in buffers, to how internal state
machines change and help show when decisions are actually made based on received
data. Tool implementers SHOULD at least add support for showing the contents of
these events, if they do not handle them explicitly.</t>
        <t>The "Extra" events are considered mostly useful for low-level debugging of the
implementation, rather than the protocol. They allow more fine-grained tracking of
internal behaviour. As such, they CAN be present in qlog files and tool
implementers CAN add support for these, but they are not required to.</t>
        <t>Note that in some cases, implementers might not want to log for example data
content details in the "Core" events due to performance or privacy considerations.
In this case, they SHOULD use (a subset of) relevant "Base" events instead to
ensure usability of the qlog output. As an example, implementations that do not
log QUIC <tt>packet_received</tt> events and thus also not which (if any) ACK frames the
packet contains, SHOULD log <tt>packets_acked</tt> events instead.</t>
        <t>Finally, for event types whose data (partially) overlap with other event types'
definitions, where necessary the event definition document should include explicit
guidance on which to use in specific situations.</t>
      </section>
      <section anchor="custom-fields-1" numbered="true" toc="default">
        <name>Custom fields</name>
        <t>Event definition documents are free to define new category and event types,
top-level fields (e.g., a per-event field indicating its privacy properties or
path_id in multipath protocols), as well as values for the "trigger" property
within the "data" field, or other member fields of the "data" field, as they see
fit.</t>
        <t>They however SHOULD NOT expect non-specialized tools to recognize or visualize
this custom data. However, tools SHOULD make an effort to visualize even unknown
data if possible in the specific tool's context. If they do not, they MUST ignore
these unknown fields.</t>
      </section>
    </section>
    <section anchor="generic-events-and-data-classes" numbered="true" toc="default">
      <name>Generic events and data classes</name>
      <t>There are some event types and data classes that are common across protocols,
applications and use cases that benefit from being defined in a single location.
This section specifies such common definitions.</t>
      <section anchor="raw-packet-and-frame-information" numbered="true" toc="default">
        <name>Raw packet and frame information</name>
        <t>While qlog is a more high-level logging format, it also allows the inclusion of
most raw wire image information, such as byte lengths and even raw byte values.
This can be useful when for example investigating or tuning packetization
behaviour or determining encoding/framing overheads. However, these fields are not
always necessary and can take up considerable space if logged for each packet or
frame. They can also have a considerable privacy and security impact. As such,
they are grouped in a separate optional field called "raw" of type RawInfo (where
applicable).</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
class RawInfo {
    length?:uint64; // the full byte length of the entity (e.g., packet or frame) including headers and trailers
    payload_length?:uint64; // the byte length of the entity's payload, without headers or trailers

    data?:bytes; // the contents of the full entity, including headers and trailers
}
]]></artwork>
        <dl>
          <dt>
Note:  </dt>
          <dd>
            <t>The RawInfo:data field can be truncated for privacy or security purposes
(for example excluding payload data). In this case, the length properties should
still indicate the non-truncated lengths.</t>
          </dd>
          <dt>
Note:  </dt>
          <dd>
            <t>We do not specify explicit header_length or trailer_length fields. In
most protocols, header_length can be calculated by subtracing the payload_length
from the length (e.g., if trailer_length is always 0). In protocols with trailers
(e.g., QUIC's AEAD tag), event definitions documents SHOULD define other ways of
logging the trailer_length to make the header_length calculation possible.</t>
          </dd>
          <dt/>
          <dd>
            <t>The exact definitions entities, headers, trailers and payloads depend on the
protocol used. If this is non-trivial, event definitions documents SHOULD include
a clear explanation of how entities are mapped into the RawInfo structure.</t>
          </dd>
          <dt>
Note:  </dt>
          <dd>
            <t>Relatedly, many modern protocols use Variable-Length Integer Encoded (VLIE) values
in their headers, which are of a dynamic length. Because of this, we cannot
deterministally reconstruct the header encoding/length from non-RawInfo qlog data,
as implementations might not necessarily employ the most efficient VLIE scheme for
all values. As such, to make exact size-analysis possible, implementers should use
explicit lengths in RawInfo rather than reconstructing them from other qlog data.
Similarly, tool developers should only utilize RawInfo (and related information)
in such tools to prevent errors.</t>
          </dd>
        </dl>
      </section>
      <section anchor="generic-events" numbered="true" toc="default">
        <name>Generic events</name>
        <t>In typical logging setups, users utilize a discrete number of well-defined logging
categories, levels or severities to log freeform (string) data. This generic
events category replicates this approach to allow implementations to fully replace
their existing text-based logging by qlog. This is done by providing events to log
generic strings for the typical well-known logging levels (error, warning, info,
debug, verbose).</t>
        <t>For the events defined below, the "category" is "generic" and their "type" is the
name of the heading in lowercase (e.g., the "name" of the error event is
"generic:error").</t>
        <section anchor="error" numbered="true" toc="default">
          <name>error</name>
          <t>Importance: Core</t>
          <t>Used to log details of an internal error that might not get reflected on the wire.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    code?:uint32,
    message?:string
}
]]></artwork>
        </section>
        <section anchor="warning" numbered="true" toc="default">
          <name>warning</name>
          <t>Importance: Base</t>
          <t>Used to log details of an internal warning that might not get reflected on the
wire.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    code?:uint32,
    message?:string
}
]]></artwork>
        </section>
        <section anchor="info" numbered="true" toc="default">
          <name>info</name>
          <t>Importance: Extra</t>
          <t>Used mainly for implementations that want to use qlog as their one and only
logging format but still want to support unstructured string messages.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    message:string
}
]]></artwork>
        </section>
        <section anchor="debug" numbered="true" toc="default">
          <name>debug</name>
          <t>Importance: Extra</t>
          <t>Used mainly for implementations that want to use qlog as their one and only
logging format but still want to support unstructured string messages.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    message:string
}
]]></artwork>
        </section>
        <section anchor="verbose" numbered="true" toc="default">
          <name>verbose</name>
          <t>Importance: Extra</t>
          <t>Used mainly for implementations that want to use qlog as their one and only
logging format but still want to support unstructured string messages.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    message:string
}
]]></artwork>
        </section>
      </section>
      <section anchor="simulation-events" numbered="true" toc="default">
        <name>Simulation events</name>
        <t>When evaluating a protocol implementation, one typically sets up a series of
interoperability or benchmarking tests, in which the test situations can change
over time. For example, the network bandwidth or latency can vary during the test,
or the network can be fully disable for a short time. In these setups, it is
useful to know when exactly these conditions are triggered, to allow for proper
correlation with other events.</t>
        <t>For the events defined below, the "category" is "simulation" and their "type" is
the name of the heading in lowercase (e.g., the "name" of the scenario event is
"simulation:scenario").</t>
        <section anchor="scenario" numbered="true" toc="default">
          <name>scenario</name>
          <t>Importance: Extra</t>
          <t>Used to specify which specific scenario is being tested at this particular
instance. This could also be reflected in the top-level qlog's <tt>summary</tt> or
<tt>configuration</tt> fields, but having a separate event allows easier aggregation of
several simulations into one trace (e.g., split by <tt>group_id</tt>).</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    name?:string,
    details?:any
}
]]></artwork>
        </section>
        <section anchor="marker" numbered="true" toc="default">
          <name>marker</name>
          <t>Importance: Extra</t>
          <t>Used to indicate when specific emulation conditions are triggered at set times
(e.g., at 3 seconds in 2% packet loss is introduced, at 10s a NAT rebind is
triggered).</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    type?:string,
    message?:string
}
]]></artwork>
        </section>
      </section>
    </section>
    <section anchor="concrete-formats" numbered="true" toc="default">
      <name>Serializing qlog</name>
      <t>This document and other related qlog schema definitions are intentionally
serialization-format agnostic. This means that implementers themselves can choose
how to represent and serialize qlog data practically on disk or on the wire. Some
examples of possible formats are JSON, CBOR, CSV, protocol buffers, flatbuffers,
etc.</t>
      <t>All these formats make certain tradeoffs between flexibility and efficiency, with
textual formats like JSON typically being more flexible but also less efficient
than binary formats like protocol buffers. The format choice will depend on the
practical use case of the qlog user. For example, for use in day to day debugging,
a plaintext readable (yet relatively large) format like JSON is probably
preferred. However, for use in production, a more optimized yet restricted format
can be better. In this latter case, it will be more difficult to achieve
interoperability between qlog implementations of various protocol stacks, as some
custom or tweaked events from one might not be compatible with the format of the
other. This will also reflect in tooling: not all tools will support all formats.</t>
      <t>This being said, the authors prefer JSON as the basis for storing qlog, as it
retains full flexibility and maximum interoperability. Storage overhead can be
managed well in practice by employing compression. For this reason, this document
details both how to practically transform qlog schema definitions to JSON and to
the streamable NDJSON. We discuss concrete options to bring down JSON size and
processing overheads in <xref target="optimizations" format="default"/>.</t>
      <t>As depending on the employed format different deserializers/parsers should be
used, the "qlog_format" field is used to indicate the chosen serialization
approach. This field is always a string, but can be made hierarchical by the use
of the "." separator between entries. For example, a value of "JSON.optimizationA"
can indicate that a default JSON format is being used, but that a certain
optimization of type A was applied to the file as well (see also
<xref target="optimizations" format="default"/>).</t>
      <section anchor="format-json" numbered="true" toc="default">
        <name>qlog to JSON mapping</name>
        <t>When mapping qlog to normal JSON, the "qlog_format" field MUST have the value
"JSON". This is also the default qlog serialization and default value of this field.</t>
        <t>To facilitate this mapping, the qlog documents employ a format that is close to
pure JSON for its examples and data definitions. Still, as JSON is not a typed
format, there are some practical peculiarities to observe.</t>
        <section anchor="numbers" numbered="true" toc="default">
          <name>numbers</name>
          <t>While JSON has built-in support for integers up to 64 bits in size, not all JSON
parsers do. For example, none of the major Web browsers support full 64-bit
integers at this time, as all numerical values (both floating-point numbers and
integers) are internally represented as floating point <eref target="https://en.wikipedia.org/wiki/Floating-point_arithmetic">IEEE
754</eref> values. In practice,
this limits their integers to a maximum value of 2^53-1. Integers larger than that
are either truncated or produce a JSON parsing error. While this is expected to
improve in the future (as <eref target="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt">"BigInt"
support</eref>
has been introduced in most Browsers, though not yet integrated into JSON
parsers), we still need to deal with it here.</t>
          <t>When transforming an int64, uint64 or double from qlog to JSON, the implementer
can thus choose to either log them as JSON numbers (taking the risk of truncation
or un-parseability) or to log them as strings instead. Logging as strings should
however only be practically needed if the value is likely to exceed 2^53-1. In
practice, even though protocols such as QUIC allow 64-bit values for for example
stream identifiers, these high numbers are unlikely to be reached for the
overwhelming majority of cases. As such, it is probably a valid trade-off to take
the risk and log 64-bit values as JSON numbers instead of strings.</t>
          <t>Tools processing JSON-based qlog SHOULD however be able to deal with 64-bit fields
being serialized as either strings or numbers.</t>
        </section>
        <section anchor="bytes" numbered="true" toc="default">
          <name>bytes</name>
          <t>Unlike most binary formats, JSON does not allow the logging of raw binary blobs
directly. As such, when serializing a byte or array&lt;byte&gt;, a scheme needs to
be chosen.</t>
          <t>To represent qlog bytes in JSON, they MUST be serialized to their lowercase
hexadecimal equivalents (with 0 prefix for values lower than 10). All values are
directly appended to each other, without delimiters. The full value is not
prefixed with 0x (as is sometimes common). An example is given in
<xref target="json-bytes-example" format="default"/>.</t>
          <figure anchor="json-bytes-example">
            <name>Example for serializing bytes</name>
            <sourcecode type="json">
For the five raw unsigned byte input values of: 5 20 40 171 255, the JSON serialization is:

{
    raw: "051428abff"
}
</sourcecode>
          </figure>
          <t>As such, the resulting string will always have an even amount of characters and
the original byte-size can be retrieved by dividing the string length by 2.</t>
          <section anchor="truncated-values" numbered="true" toc="default">
            <name>Truncated values</name>
            <t>In some cases, it can be interesting not to log a full raw blob but instead a
truncated value (for example, only the first 100 bytes of an HTTP response body to
be able to discern which file it actually contained). In these cases, the original
byte-size length cannot be obtained from the serialized value directly. As such,
all qlog schema definitions SHOULD include a separate, length-indicating field for
all fields of type array&lt;byte&gt; they specify. This allows always retrieving
the original length, but also allows the omission of any raw value bytes of the
field completely (e.g., out of privacy or security considerations).</t>
            <t>To reduce overhead however and in the case the full raw value is logged, the extra
length-indicating field can be left out. As such, tools MUST be able to deal with
this situation and derive the length of the field from the raw value if no
separate length-indicating field is present. All possible permutations are shown
by example in <xref target="json-bytes-example-two" format="default"/>.</t>
            <figure anchor="json-bytes-example-two">
              <name>Example for serializing truncated bytes</name>
              <sourcecode type="json">
// both the full raw value and its length are present (length is redundant)
{
    "raw_length": 5,
    "raw": "051428abff"
}

// only the raw value is present, indicating it represents the fields full value
// the byte length is obtained by calculating raw.length / 2
{
    "raw": "051428abff"
}

// only the length field is present, meaning the value was omitted
{
    "raw_length": 5,
}

// both fields are present and the lengths do not match: the value was truncated to the first three bytes.
{
    "raw_length": 5,
    "raw": "051428"
}

</sourcecode>
            </figure>
          </section>
        </section>
        <section anchor="summarizing-table" numbered="true" toc="default">
          <name>Summarizing table</name>
          <t>By definition, JSON strings are serialized surrounded by quotes. Numbers without.</t>
          <table align="center">
            <thead>
              <tr>
                <th align="left">qlog type</th>
                <th align="left">JSON type</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">int8</td>
                <td align="left">number</td>
              </tr>
              <tr>
                <td align="left">int16</td>
                <td align="left">number</td>
              </tr>
              <tr>
                <td align="left">int32</td>
                <td align="left">number</td>
              </tr>
              <tr>
                <td align="left">uint8</td>
                <td align="left">number</td>
              </tr>
              <tr>
                <td align="left">uint16</td>
                <td align="left">number</td>
              </tr>
              <tr>
                <td align="left">uint32</td>
                <td align="left">number</td>
              </tr>
              <tr>
                <td align="left">float</td>
                <td align="left">number</td>
              </tr>
              <tr>
                <td align="left">int64</td>
                <td align="left">number or string</td>
              </tr>
              <tr>
                <td align="left">uint64</td>
                <td align="left">number or string</td>
              </tr>
              <tr>
                <td align="left">double</td>
                <td align="left">number or string</td>
              </tr>
              <tr>
                <td align="left">bytes</td>
                <td align="left">string (lowercase hex value)</td>
              </tr>
              <tr>
                <td align="left">string</td>
                <td align="left">string</td>
              </tr>
              <tr>
                <td align="left">boolean</td>
                <td align="left">string ("true" or "false")</td>
              </tr>
              <tr>
                <td align="left">enum</td>
                <td align="left">string (full value/name, not index)</td>
              </tr>
              <tr>
                <td align="left">any</td>
                <td align="left">object  ( {...} )</td>
              </tr>
              <tr>
                <td align="left">array</td>
                <td align="left">array   ( [...] )</td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="other-json-specifics" numbered="true" toc="default">
          <name>Other JSON specifics</name>
          <t>JSON files by definition (<xref target="RFC8259" format="default"/>) MUST utilize the UTF-8 encoding, both for
the file itself and the string values.</t>
          <t>Most JSON parsers strictly follow the JSON specification. This includes the rule
that trailing comma's are not allowed. As it is frequently annoying to remove
these trailing comma's when logging events in a streaming fashion, tool
implementers SHOULD allow the last event entry of a qlog trace to be an empty
object. This allows loggers to simply close the qlog file by appending "{}]}]}"
after their last added event.</t>
          <t>Finally, while not specifically required by the JSON specification, all qlog field
names in a JSON serialization MUST be lowercase.</t>
        </section>
      </section>
      <section anchor="format-ndjson" numbered="true" toc="default">
        <name>qlog to NDJSON mapping</name>
        <t>One of the downsides of using pure JSON is that it is inherently a non-streamable
format. Put differently, it is not possible to simply append new qlog events to a
log file without "closing" this file at the end by appending "]}]}". Without these
closing tags, most JSON parsers will be unable to parse the file entirely. As most
platforms do not provide a standard streaming JSON parser (which would be able to
deal with this problem), this document also provides a qlog mapping to a
streamable JSON format called <eref target="http://ndjson.org/">Newline-Delimited JSON
(NDJSON)</eref>.</t>
        <t>When mapping qlog to NDJSON, the "qlog_format" field MUST have the value "NDJSON".</t>
        <t>NDJSON is very similar to JSON, except that it interprets each line in a file as a
fully separate JSON object. Put differently, unlike default JSON, it does not
require a file to be wrapped as a full object with "{ ... }" or "[ ... ]". Using
this setup, qlog events can simply be appended as individually serialized lines at
the back of a streamed logging file.</t>
        <t>For this to work, some qlog definitions have to be adjusted however. Mainly,
events are no longer part of the "events" array in the Trace object, but are
instead logged separately from the qlog "file header" (QlogFile class in
<xref target="top-level" format="default"/>). Additionally, qlog's NDJSON mapping does not allow logging
multiple individual traces in a single qlog file. As such, the QlogFile:traces
field is replaced by the singular "trace" field, which simply contains the Trace
data directly. An example can be seen in <xref target="ndjson-example" format="default"/>. Note that the
"group_id" field can still be used on a per-event basis to include events from
conceptually different sources in a single NDJSON qlog file.</t>
        <t>Note as well from <xref target="ndjson-example" format="default"/> that the file's header (QlogFileNDJSON) also
needs to be fully serialized on a single line to be NDJSON compatible.</t>
        <figure anchor="ndjson-example">
          <name>Top-level element</name>
          <sourcecode type="json">
Definition:

class QlogFileNDJSON {
    qlog_format: "NDJSON",

    qlog_version:string,
    title?:string,
    description?:string,
    summary?: Summary,
    trace: Trace
}
// list of qlog events, separated by newlines

NDJSON serialization:

{"qlog_format":"NDJSON","qlog_version":"draft-03-WIP","title":"Name of this particular NDJSON qlog file (short)","description":"Description for this NDJSON qlog file (long)","trace":{"common_fields":{"protocol_type": ["QUIC","HTTP3"],"group_id":"127ecc830d98f9d54a42c4f0842aa87e181a","time_format":"relative","reference_time":"1553986553572"},"vantage_point":{"name":"backend-67","type":"server"}}}
{"time": 2, "name": "transport:packet_received", "data": { ... } }
{"time": 7, "name": "http:frame_parsed", "data": { ... } }
</sourcecode>
        </figure>
        <t>Finally, while not specifically required by the NDJSON specification, all qlog
field names in a NDJSON serialization MUST be lowercase.</t>
        <section anchor="supporting-ndjson-in-tooling" numbered="true" toc="default">
          <name>Supporting NDJSON in tooling</name>
          <t>Note that NDJSON is not supported in most default programming environments (unlike
normal JSON). However, several <eref target="http://ndjson.org/libraries.html">custom NDJSON parsing libraries
exist</eref> that can be used and the format is easy
enough to parse with existing implementations (i.e., by splitting the file into
its component lines and feeding them to a normal JSON parser individually, as each
line by itself is a valid JSON object).</t>
        </section>
      </section>
      <section anchor="optimizations" numbered="true" toc="default">
        <name>Other optimizated formatting options</name>
        <t>Both the JSON and NDJSON formatting options described above are serviceable in
general small to medium scale (debugging) setups. However, these approaches tend
to be relatively verbose, leading to larger file sizes. Additionally, generalized
(ND)JSON (de)serialization performance is typically (slightly) lower than that of
more optimized and predictable formats. Both aspects make these formats more
challenging (<eref target="https://qlog.edm.uhasselt.be/anrw/">though still practical</eref>) to use
in large scale setups.</t>
        <t>During the development of qlog, we compared a multitude of alternative formatting
and optimization options. The results of this study are <eref target="https://github.com/quiclog/internet-drafts/issues/30#issuecomment-617675097">summarized on the qlog
github
repository</eref>.
The rest of this section discusses some of these approaches implementations could
choose and the expected gains and tradeoffs inherent therein. Tools SHOULD support
mainly the compression options listed in <xref target="compression" format="default"/>, as they provide the
largest wins for the least cost overall.</t>
        <t>Over time, specific qlog formats and encodings can be created that more formally
define and combine some of the discussed optimizations or add new ones. We choose
to define these schemes in separate documents to keep the main qlog definition
clean and generalizable, as not all contexts require the same performance or
flexibility as others and qlog is intended to be a broadly usable and extensible
format (for example more flexibility is needed in earlier stages of protocol
development, while more performance is typically needed in later stages). This is
also the main reason why the general qlog format is the less optimized JSON
instead of a more performant option.</t>
        <t>To be able to easily distinguish between these options in qlog compatible tooling
(without the need to have the user provide out-of-band information or to
(heuristically) parse and process files in a multitude of ways, see also
<xref target="tooling" format="default"/>), we recommend using explicit file extensions to indicate specific
formats. As there are no standards in place for this type of extension to format
mapping, we employ a commonly used scheme here. Our approach is to list the
applied optimizations in the extension in ascending order of application (e.g., if
a qlog file is first optimized with technique A and then compressed with technique
B, the resulting file would have the extension ".qlog.A.B"). This allows tooling
to start at the back of the extension to "undo" applied optimizations to finally
arrive at the expected qlog representation.</t>
        <section anchor="structure-optimizations" numbered="true" toc="default">
          <name>Data structure optimizations</name>
          <t>The first general category of optimizations is to alter the representation of data
within an (ND)JSON qlog file to reduce file size.</t>
          <t>The first option is to employ a scheme similar to the CSV (comma separated value
<xref target="rfc4180" format="default"/>) format, which utilizes the concept of column "headers" to prevent
repeating field names for each datapoint instance. Concretely for JSON qlog,
several field names are repeated with each event (i.e., time, name, data). These
names could be extracted into a separate list, after which qlog events could be
serialized as an array of values, as opposed to a full object. This approach was a
key part of the original qlog format (prior to draft 02) using the "event_fields"
field. However, tests showed that this optimization only provided a mean file size
reduction of 5% (100MB to 95MB) while significantly increasing the implementation
complexity, and this approach was abandoned in favor of the default JSON setup.
Implementations using this format should not employ a separate file extension (as
it still uses JSON), but rather employ a new value of "JSON.namedheaders" (or
"NDJSON.namedheaders") for the "qlog_format" field (see <xref target="top-level" format="default"/>).</t>
          <t>The second option is to replace field values and/or names with indices into a
(dynamic) lookup table. This is a common compression technique and can provide
significant file size reductions (up to 50% in our tests, 100MB to 50MB). However,
this approach is even more difficult to implement efficiently and requires either
including the (dynamic) table in the resulting file (an approach taken by for
example <eref target="https://www.chromium.org/developers/design-documents/network-stack/netlog">Chromium's NetLog
format</eref>)
or defining a (static) table up-front and sharing this between implementations.
Implementations using this approach should not employ a separate file extension
(as it still uses JSON), but rather employ a new value of "JSON.dictionary" (or
"NDJSON.dictionary") for the "qlog_format" field (see <xref target="top-level" format="default"/>).</t>
          <t>As both options either proved difficult to implement, reduced qlog file
readability, and provided too little improvement compared to other more
straightforward options (for example <xref target="compression" format="default"/>), these schemes are not
inherently part of qlog.</t>
        </section>
        <section anchor="compression" numbered="true" toc="default">
          <name>Compression</name>
          <t>The second general category of optimizations is to utilize a (generic) compression
scheme for textual data. As qlog in the (ND)JSON format typically contains a large
amount of repetition, off-the-shelf (text) compression techniques typically
succeed very well in bringing down file sizes (regularly with up to two orders of
magnitude in our tests, even for "fast" compression levels). As such, utilizing
compression is recommended before attempting other optimization options, even
though this might (somewhat) increase processing costs due to the additional
compression step.</t>
          <t>The first option is to use GZIP compression (<xref target="RFC1952" format="default"/>). This generic
compression scheme provides multiple compression levels (providing a trade-off
between compression speed and size reduction). Utilized at level 6 (a medium
setting thought to be applicable for streaming compression of a qlog stream in
commodity devices), gzip compresses qlog JSON files to 7% of their initial size on
average (100MB to 7MB). For this option, the file extension .qlog.gz SHOULD BE
used.  The "qlog_format" field should still reflect the original JSON formatting
of the qlog data (e.g., "JSON" or "NDJSON").</t>
          <t>The second option is to use Brotli compression (<xref target="RFC7932" format="default"/>). While similar to
gzip, this more recent compression scheme provides a better efficiency. It also
allows multiple compression levels. Utilized at level 4 (a medium setting thought
to be applicable for streaming compression of a qlog stream in commodity devices),
brotli compresses qlog JSON files to 7% of their initial size on average (100MB to
7MB). For this option, the file extension .qlog.br SHOULD BE used. The
"qlog_format" field should still reflect the original JSON formatting of the qlog
data (e.g., "JSON" or "NDJSON").</t>
          <t>Other compression algorithms of course exist (for example xz, zstd, and lz4). We
mainly recommend gzip and brotli because of their tweakable behaviour and wide
support in web-based environments, which we envision as the main tooling ecosystem
(see also <xref target="tooling" format="default"/>).</t>
        </section>
        <section anchor="binary" numbered="true" toc="default">
          <name>Binary formats</name>
          <t>The third general category of optimizations is to use a more optimized (often
binary) format instead of the textual JSON format. This approach inherently
produces smaller files and often has better (de)serialization performance.
However, the resultant files are no longer human readable and some formats require
hard tradeoffs between flexibility for performance.</t>
          <t>The first option is to use the CBOR (Concise Binary Object Representation
<xref target="rfc7049" format="default"/>) format. For our purposes, CBOR can be viewed as a straighforward
binary variant of JSON. As such, existing JSON qlog files can be trivially
converted to and from CBOR (though slightly more work is needed for NDJSON qlogs).
While CBOR thus does retain the full qlog flexibility, it only provides a 25% file
size reduction (100MB to 75MB) compared to textual (ND)JSON. As CBOR support in
programming environments is not as widespread as that of textual JSON and the
format lacks human readability, CBOR was not chosen as the default qlog format.
For this option, the file extension .qlog.cbor SHOULD BE used. The "qlog_format"
field should still reflect the original JSON formatting of the qlog data (e.g.,
"JSON" or "NDJSON").</t>
          <t>A second option is to use a more specialized binary format, such as <eref target="https://developers.google.com/protocol-buffers">Protocol
Buffers</eref> (protobuf). This format
is battle-tested, has support for optional fields and has libraries in most
programming languages. Still, it is significantly less flexible than textual JSON
or CBOR, as it relies on a separate, pre-defined schema (a .proto file). As such,
it it not possible to (easily) log new event types in protobuf files without
adjusting this schema as well, which has its own practical challenges. As qlog is
intended to be a flexible, general purpose format, this type of format was not
chosen as its basic serialization. The lower flexibility does lead to
significantly reduced file sizes. Our straightforward mapping of the qlog main
schema and QUIC/HTTP3 event types to protobuf created qlog files 24% as large as
the raw JSON equivalents (100MB to 24MB). For this option, the file extension
.qlog.protobuf SHOULD BE used. The "qlog_format" field should reflect the
different internal format, for example: "qlog_format": "protobuf".</t>
          <t>Note that binary formats can (and should) also be used in conjunction with
compression (see <xref target="compression" format="default"/>). For example, CBOR compresses well (to about 6%
of the original textual JSON size (100MB to 6MB) for both gzip and brotli) and so
does protobuf (5% (gzip) to 3% (brotli)). However, these gains are similar to the
ones achieved by simply compression the textual JSON equivalents directly (7%, see
<xref target="compression" format="default"/>). As such, since compression is still needed to achieve optimal
file size reductions event with binary formats, we feel the more flexible
compressed textual JSON options are a better default for the qlog format in
general.</t>
          <t/>
        </section>
        <section anchor="format-summary" numbered="true" toc="default">
          <name>Overview and summary</name>
          <t>In summary, textual JSON was chosen as the main qlog format due to its high
flexibility and because its inefficiencies can be largely solved by the
utilization of compression techniques (which are needed to achieve optimal results
with other formats as well).</t>
          <t>Still, qlog implementers are free to define other qlog formats depending on their
needs and context of use. These formats should be described in their own
documents, the discussion in this document mainly acting as inspiration and
high-level guidance. Implementers are encouraged to add concrete qlog formats and
definitions to <eref target="https://github.com/quiclog/qlog">the designated public
repository</eref>.</t>
          <t>The following table provides an overview of all the discussed qlog formatting
options with examples:</t>
          <table align="center">
            <thead>
              <tr>
                <th align="left">format</th>
                <th align="left">qlog_format</th>
                <th align="left">extension</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">JSON <xref target="format-json" format="default"/></td>
                <td align="left">JSON</td>
                <td align="left">.qlog</td>
              </tr>
              <tr>
                <td align="left">NDJSON  <xref target="format-ndjson" format="default"/></td>
                <td align="left">NDJSON</td>
                <td align="left">.qlog</td>
              </tr>
              <tr>
                <td align="left">named headers <xref target="structure-optimizations" format="default"/></td>
                <td align="left">(ND)JSON.namedheaders</td>
                <td align="left">.qlog</td>
              </tr>
              <tr>
                <td align="left">dictionary <xref target="structure-optimizations" format="default"/></td>
                <td align="left">(ND)JSON.dictionary</td>
                <td align="left">.qlog</td>
              </tr>
              <tr>
                <td align="left">CBOR <xref target="binary" format="default"/></td>
                <td align="left">(ND)JSON</td>
                <td align="left">.qlog.cbor</td>
              </tr>
              <tr>
                <td align="left">protobuf <xref target="binary" format="default"/></td>
                <td align="left">protobuf</td>
                <td align="left">.qlog.protobuf</td>
              </tr>
              <tr>
                <td align="left">&nbsp;</td>
                <td align="left">&nbsp;</td>
                <td align="left">&nbsp;</td>
              </tr>
              <tr>
                <td align="left">gzip <xref target="compression" format="default"/></td>
                <td align="left">no change</td>
                <td align="left">.gz suffix</td>
              </tr>
              <tr>
                <td align="left">brotli <xref target="compression" format="default"/></td>
                <td align="left">no change</td>
                <td align="left">.br suffix</td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
      <section anchor="conversion" numbered="true" toc="default">
        <name>Conversion between formats</name>
        <t>As discussed in the previous sections, a qlog file can be serialized in a
multitude of formats, each of which can conceivably be transformed into or from
one another without loss of information. For example, a number of NDJSON streamed
qlogs could be combined into a JSON formatted qlog for later processing.
Similarly, a captured binary qlog could be transformed to JSON for easier
interpretation and sharing.</t>
        <t>Secondly, we can also consider other structured logging approaches that contain
similar (though typically not identical) data to qlog, like raw packet capture
files (for example .pcap files from tcpdump) or endpoint-specific logging formats
(for example the NetLog format in Google Chrome). These are sometimes the only
options, if an implementation cannot or will not support direct qlog output for
any reason, but does provide other internal or external (e.g., SSLKEYLOGFILE
export to allow decryption of packet captures) logging options For this second
category, a (partial) transformation from/to qlog can also be defined.</t>
        <t>As such, when defining a new qlog serialization format or wanting to utilize
qlog-compatible tools with existing codebases lacking qlog support, it is
recommended to define and provide a concrete mapping from one format to default
JSON-serialized qlog. Several of such mappings exist. Firstly,
[pcap2qlog]((https://github.com/quiclog/pcap2qlog) transforms QUIC and HTTP/3
packet capture files to qlog. Secondly,
<eref target="https://github.com/quiclog/qvis/tree/master/visualizations/src/components/filemanager/netlogconverter">netlog2qlog</eref>
converts chromium's internal dictionary-encoded JSON format to qlog. Finally,
<eref target="https://github.com/quiclog/quictrace2qlog">quictrace2qlog</eref> converts the older
quictrace format to JSON qlog. Tools can then easily integrate with these
converters (either by incorporating them directly or for example using them as a
(web-based) API) so users can provide different file types with ease. For example,
the <eref target="https://qvis.edm.uhasselt.be">qvis</eref> toolsuite supports a multitude of formats
and qlog serializations.</t>
      </section>
    </section>
    <section anchor="methods-of-access-and-generation" numbered="true" toc="default">
      <name>Methods of access and generation</name>
      <t>Different implementations will have different ways of generating and storing
qlogs. However, there is still value in defining a few default ways in which to
steer this generation and access of the results.</t>
      <section anchor="set-file-output-destination-via-an-environment-variable" numbered="true" toc="default">
        <name>Set file output destination via an environment variable</name>
        <t>To provide users control over where and how qlog files are created, we define two
environment variables. The first, QLOGFILE, indicates a full path to where an
individual qlog file should be stored. This path MUST include the full file
extension. The second, QLOGDIR, sets a general directory path in which qlog files
should be placed. This path MUST include the directory separator character at the
end.</t>
        <t>In general, QLOGDIR should be preferred over QLOGFILE if an endpoint is prone to
generate multiple qlog files. This can for example be the case for a QUIC server
implementation that logs each QUIC connection in a separate qlog file. An
alternative that uses QLOGFILE would be a QUIC server that logs all connections in
a single file and uses the "group_id" field (<xref target="group-ids" format="default"/>) to allow post-hoc
separation of events.</t>
        <t>Implementations SHOULD provide support for QLOGDIR and MAY provide support for
QLOGFILE.</t>
        <t>When using QLOGDIR, it is up to the implementation to choose an appropriate naming
scheme for the qlog files themselves. The chosen scheme will typically depend on
the context or protocols used. For example, for QUIC, it is recommended to use the
Original Destination Connection ID (ODCID), followed by the vantage point type of
the logging endpoint. Examples of all options for QUIC are shown in
<xref target="qlogdir-example" format="default"/>.</t>
        <figure anchor="qlogdir-example">
          <name>Environment variable examples for a QUIC implementation</name>
          <sourcecode type="json">
Command: QLOGFILE=/srv/qlogs/client.qlog quicclientbinary

Should result in the the quicclientbinary executable logging a single qlog file named client.qlog in the /srv/qlogs directory.
This is for example useful in tests when the client sets up just a single connection and then exits.

Command: QLOGDIR=/srv/qlogs/ quicserverbinary

Should result in the quicserverbinary executable generating several logs files, one for each QUIC connection.
Given two QUIC connections, with ODCID values "abcde" and "12345" respectively, this would result in two files:
/srv/qlogs/abcde_server.qlog
/srv/qlogs/12345_server.qlog

Command: QLOGFILE=/srv/qlogs/server.qlog quicserverbinary

Should result in the the quicserverbinary executable logging a single qlog file named server.qlog in the /srv/qlogs directory.
Given that the server handled two QUIC connections before it was shut down, with ODCID values "abcde" and "12345" respectively,
this would result in event instances in the qlog file being tagged with the "group_id" field with values "abcde" and "12345".
</sourcecode>
        </figure>
      </section>
      <section anchor="access-logs-via-a-well-known-endpoint" numbered="true" toc="default">
        <name>Access logs via a well-known endpoint</name>
        <t>After generation, qlog implementers MAY make available generated logs and traces
on an endpoint (typically the server) via the following .well-known URI:</t>
        <ul empty="true" spacing="normal">
          <li>.well-known/qlog/IDENTIFIER.extension</li>
        </ul>
        <t>The IDENTIFIER variable depends on the context and the protocol. For example for
QUIC, the lowercase Original Destination Connection ID (ODCID) is recommended, as
it can uniquely identify a connection. Additionally, the extension depends on the
chosen format (see <xref target="format-summary" format="default"/>). For example, for a QUIC connection with
ODCID "abcde", the endpoint for fetching its default JSON-formatted .qlog file
would be:</t>
        <ul empty="true" spacing="normal">
          <li>.well-known/qlog/abcde.qlog</li>
        </ul>
        <t>Implementers SHOULD allow users to fetch logs for a given connection on a 2nd,
separate connection. This helps prevent pollution of the logs by fetching them
over the same connection that one wishes to observe through the log. Ideally, for
the QUIC use case, the logs should also be approachable via an HTTP/2 or HTTP/1.1
endpoint (i.e., on TCP port 443), to for example aid debugging in the case where
QUIC/UDP is blocked on the network.</t>
        <t>qlog implementers SHOULD NOT enable this .well-known endpoint in typical
production settings to prevent (malicious) users from downloading logs from other
connections. Implementers are advised to disable this endpoint by default and
require specific actions from the end users to enable it (and potentially qlog
itself). Implementers MUST also take into account the general privacy and security
guidelines discussed in <xref target="privacy" format="default"/> before exposing qlogs to outside actors.</t>
      </section>
    </section>
    <section anchor="tooling" numbered="true" toc="default">
      <name>Tooling requirements</name>
      <t>Tools ingestion qlog MUST indicate which qlog version(s), qlog format(s),
compression methods and potentially other input file formats (for example .pcap)
they support. Tools SHOULD at least support .qlog files in the default JSON format
(<xref target="format-json" format="default"/>). Additionally, they SHOULD indicate exactly which values for and
properties of the name (category and type) and data fields they look for to
execute their logic. Tools SHOULD perform a (high-level) check if an input qlog
file adheres to the expected qlog schema. If a tool determines a qlog file does
not contain enough supported information to correctly execute the tool's logic, it
SHOULD generate a clear error message to this effect.</t>
      <t>Tools MUST NOT produce breaking errors for any field names and/or values in the
qlog format that they do not recognize. Tools SHOULD indicate even unknown event
occurences within their context (e.g., marking unknown events on a timeline for
manual interpretation by the user).</t>
      <t>Tool authors should be aware that, depending on the logging implementation, some
events will not always be present in all traces. For example, using a circular
logging buffer of a fixed size, it could be that the earliest events (e.g.,
connection setup events) are later overwritten by "newer" events. Alternatively,
some events can be intentionally omitted out of privacy or file size
considerations. Tool authors are encouraged to make their tools robust enough to
still provide adequate output for incomplete logs.</t>
    </section>
    <section anchor="privacy" numbered="true" toc="default">
      <name>Security and privacy considerations</name>
      <t>TODO : discuss privacy and security considerations (e.g., what NOT to log, what to
strip out of a log before sharing, ...)</t>
      <t>TODO: strip out/don't log IPs, ports, specific CIDs, raw user data, exact times,
HTTP HEADERS (or at least :path), SNI values</t>
      <t>TODO: see if there is merit in encrypting the logs and having the server choose an
encryption key (e.g., sent in transport parameters)</t>
      <t>Good initial reference: <eref target="https://huitema.wordpress.com/2020/07/21/scrubbing-quic-logs-for-privacy/">Christian Huitema's
blogpost</eref></t>
    </section>
    <section anchor="iana-considerations" numbered="true" toc="default">
      <name>IANA Considerations</name>
      <t>TODO: primarily the .well-known URI</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="QLOG-QUIC">
          <front>
            <title>QUIC event definitions for qlog</title>
            <author initials="R." surname="Marx" fullname="Robin Marx" role="editor">
              <organization>KU Leuven</organization>
            </author>
            <author initials="L." surname="Niccolini" fullname="Luca Niccolini" role="editor">
              <organization>Facebook</organization>
            </author>
            <author initials="M." surname="Seemann" fullname="Marten Seemann" role="editor">
              <organization>Protocol Labs</organization>
            </author>
            <date/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-quic-events-00"/>
        </reference>
        <reference anchor="QLOG-H3">
          <front>
            <title>HTTP/3 and QPACK event definitions for qlog</title>
            <author initials="R." surname="Marx" fullname="Robin Marx" role="editor">
              <organization>KU Leuven</organization>
            </author>
            <author initials="L." surname="Niccolini" fullname="Luca Niccolini" role="editor">
              <organization>Facebook</organization>
            </author>
            <author initials="M." surname="Seemann" fullname="Marten Seemann" role="editor">
              <organization>Protocol Labs</organization>
            </author>
            <date/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-h3-events-00"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner">
              <organization/>
            </author>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8259">
          <front>
            <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray">
              <organization/>
            </author>
            <date month="December" year="2017"/>
            <abstract>
              <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format.  It was derived from the ECMAScript Programming Language Standard.  JSON defines a small set of formatting rules for the portable representation of structured data.</t>
              <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="90"/>
          <seriesInfo name="RFC" value="8259"/>
          <seriesInfo name="DOI" value="10.17487/RFC8259"/>
        </reference>
        <reference anchor="rfc4180">
          <front>
            <title>Common Format and MIME Type for Comma-Separated Values (CSV) Files</title>
            <author fullname="Y. Shafranovich" initials="Y." surname="Shafranovich">
              <organization/>
            </author>
            <date month="October" year="2005"/>
            <abstract>
              <t>This RFC documents the format used for Comma-Separated Values (CSV) files and registers the associated MIME type "text/csv".  This memo provides information for the Internet community.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4180"/>
          <seriesInfo name="DOI" value="10.17487/RFC4180"/>
        </reference>
        <reference anchor="RFC1952">
          <front>
            <title>GZIP file format specification version 4.3</title>
            <author fullname="P. Deutsch" initials="P." surname="Deutsch">
              <organization/>
            </author>
            <date month="May" year="1996"/>
            <abstract>
              <t>This specification defines a lossless compressed data format that is compatible with the widely used GZIP utility.  This memo provides information for the Internet community.  This memo does not specify an Internet standard of any kind.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="1952"/>
          <seriesInfo name="DOI" value="10.17487/RFC1952"/>
        </reference>
        <reference anchor="RFC7932">
          <front>
            <title>Brotli Compressed Data Format</title>
            <author fullname="J. Alakuijala" initials="J." surname="Alakuijala">
              <organization/>
            </author>
            <author fullname="Z. Szabadka" initials="Z." surname="Szabadka">
              <organization/>
            </author>
            <date month="July" year="2016"/>
            <abstract>
              <t>This specification defines a lossless compressed data format that compresses data using a combination of the LZ77 algorithm and Huffman coding, with efficiency comparable to the best currently available general-purpose compression methods.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7932"/>
          <seriesInfo name="DOI" value="10.17487/RFC7932"/>
        </reference>
        <reference anchor="rfc7049">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman">
              <organization/>
            </author>
            <date month="October" year="2013"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation.  These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7049"/>
          <seriesInfo name="DOI" value="10.17487/RFC7049"/>
        </reference>
      </references>
    </references>
    <section anchor="change-log" numbered="true" toc="default">
      <name>Change Log</name>
      <section anchor="since-draft-marx-qlog-main-schema-draft-02" numbered="true" toc="default">
        <name>Since draft-marx-qlog-main-schema-draft-02:</name>
        <ul spacing="normal">
          <li>These changes were done in preparation of the adoption of the drafts by the QUIC
working group (#137)</li>
          <li>Moved RawInfo, Importance, Generic events and Simulation events to this document.</li>
          <li>Added basic event definition guidelines</li>
          <li>Made protocol_type an array instead of a string (#146)</li>
        </ul>
      </section>
      <section anchor="since-draft-marx-qlog-main-schema-01" numbered="true" toc="default">
        <name>Since draft-marx-qlog-main-schema-01:</name>
        <ul spacing="normal">
          <li>
            <t>Decoupled qlog from the JSON format and described a mapping instead (#89)
            </t>
            <ul spacing="normal">
              <li>Data types are now specified in this document and proper definitions for
fields were added in this format</li>
              <li>64-bit numbers can now be either strings or numbers, with a preference for
numbers (#10)</li>
              <li>binary blobs are now logged as lowercase hex strings (#39, #36)</li>
              <li>added guidance to add length-specifiers for binary blobs (#102)</li>
            </ul>
          </li>
          <li>Removed "time_units" from Configuration. All times are now in ms instead (#95)</li>
          <li>Removed the "event_fields" setup for a more straightforward JSON format
(#101,#89)</li>
          <li>Added a streaming option using the NDJSON format (#109,#2,#106)</li>
          <li>Described optional optimization options for implementers (#30)</li>
          <li>Added QLOGDIR and QLOGFILE environment variables, clarified the .well-known URL
usage (#26,#33,#51)</li>
          <li>Overall tightened up the text and added more examples</li>
        </ul>
      </section>
      <section anchor="since-draft-marx-qlog-main-schema-00" numbered="true" toc="default">
        <name>Since draft-marx-qlog-main-schema-00:</name>
        <ul spacing="normal">
          <li>All field names are now lowercase (e.g., category instead of CATEGORY)</li>
          <li>Triggers are now properties on the "data" field value, instead of separate field
types (#23)</li>
          <li>group_ids in common_fields is now just also group_id</li>
        </ul>
      </section>
    </section>
    <section anchor="design-variations" numbered="true" toc="default">
      <name>Design Variations</name>
      <ul spacing="normal">
        <li>
          <eref target="https://github.com/google/quic-trace">Quic-trace</eref> takes a slightly different
approach based on protocolbuffers.</li>
        <li>
          <eref target="https://github.com/EricssonResearch/spindump">Spindump</eref> also defines a custom
text-based format for in-network measurements</li>
        <li>
          <eref target="https://www.wireshark.org/">Wireshark</eref> also has a QUIC dissector and its
results can be transformed into a json output format using tshark.</li>
      </ul>
      <t>The idea is that qlog is able to encompass the use cases for both of these
alternate designs and that all tooling converges on the qlog standard.</t>
    </section>
    <section anchor="acknowledgements" numbered="true" toc="default">
      <name>Acknowledgements</name>
      <t>Much of the initial work by Robin Marx was done at Hasselt University.</t>
      <t>Thanks to Jana Iyengar, Brian Trammell, Dmitri Tikhonov, Stephen Petrides, Jari
Arkko, Marcus Ihlar, Victor Vasiliev, Mirja Kuehlewind, Jeremy Laine and Lucas
Pardue for their feedback and suggestions.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAG8iwmAAA+296ZYb2ZEm+P8+hR/wSBlQAYiFOzSqrEiSmQoVM0lxUXYN
K4fpADwiXATcIXdHBCMj2e/T79D/+sXa7DOzuzgQXHI0M+fUGdUpiQHf7mLX
1s/MxuOx68puWUyz7/Oyypb12VlZnWXt/LxY5dlp3WT/oN/cop5X+YruWjT5
aTcui+50/I9NOR/z1fGKHh3LI+ODAzfPu+Ksbq6mWdstnCvXzTTrmk3bHR0c
PDw4cnlT5NPsVZNX7bpuOndZN+/OmnqznmZ/fX3yyL0rruinxTQ7qbqiqYpu
/Ji/6lzb5dXibb6sKxrJVdG6dTnN3nT1fJTRAMtqUVTdKGvpnU1x2tK/rlb6
j64p53RpXq/Wuf5jRTfTpbJallXxk3P5pjuvm6nLsjH9f0YX2mn2YkLr0rzH
D7IAL+oZrZP/sW7Optm/v86eFpuLosJPtArlcpo1fONkRTf+27vNEpcnswJ3
NDUveLEou7pJv/d0kv1Qzuc1jamMPvp0M897F/Dhb/N5Mavrd/F3l5Xd92+n
swlN9BOf/H6SvSzo2aqKPkjz64oquYAPPm9qWu56mT3NZ2381RUe+Le1Xp/k
5fZnXVU3q7wrLwpe5b8+ffbdmPd7ijuVCgf8S1bQYnXZojilWXRlXbWeEge4
eUEUNs2uHx+/evIBP7RFUxZtWZ3W8rasRzs3EC7+hY+1TLj8XCAD/s9Y/3cH
OdxIEjeQxY5d2PGFLQL4KBHsJoTP+1Jv3z+69x/Z/+1d1q398+10Y//86tXz
/dsZneDsr8+PH/37/2ubfH77/9/if/IW8x74o+zG43FG93YNsVbnXp2XLbPj
zUq2t5035axoszw7L8/Ox0vai2UsX/IMbD1vFuUvxcJLIPkAyZLlkn7ljZxk
Gd4tVzK6UF+2WZG3V1l7njf8UH3KVJODyLrzIpuTpGHS4gtNsWnz2bJwF2W7
yZflL3KFb10Us418tavrZTuh7xQ7RksU0CWTK1taCVrIBY2wq7NZkRn/G+dn
Vd125Zx3YJ03RMr+sTZr18W8PL3KzutLDFNn1J7Xm+XC0Ws2Lb2RF0fuLOf+
xZifDNBGRUu7bGt9if/wCDOb5xUNyzXFuila+ja9lmbBby7e56v1ssj+8vLZ
DyQP2wvaffnKbHM6kU1dlYsFLZi7xQetqRebOS8Zb3HRFPzh+aZp6K3LK9rF
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

-->

</rfc>
