<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.17 (Ruby 3.0.2) -->
<?rfc docindent="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-08" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.14.2 -->
  <front>
    <title>Main logging schema for qlog</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-main-schema-08"/>
    <author initials="R." surname="Marx" fullname="Robin Marx" role="editor">
      <organization>Akamai</organization>
      <address>
        <email>rmarx@akamai.com</email>
      </address>
    </author>
    <author initials="L." surname="Niccolini" fullname="Luca Niccolini" role="editor">
      <organization>Meta</organization>
      <address>
        <email>lniccolini@meta.com</email>
      </address>
    </author>
    <author initials="M." surname="Seemann" fullname="Marten Seemann" role="editor">
      <organization/>
      <address>
        <email>martenseemann@gmail.com</email>
      </address>
    </author>
    <author initials="L." surname="Pardue" fullname="Lucas Pardue" role="editor">
      <organization>Cloudflare</organization>
      <address>
        <email>lucas@lucaspardue.com</email>
      </address>
    </author>
    <date year="2024" month="March" day="04"/>
    <area>Transport</area>
    <workgroup>QUIC</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>This document defines qlog, an extensible high-level schema for a standardized
logging format. It allows easy sharing of data, benefitting common debug and
analysis methods and tooling. The high-level schema is independent of protocol;
separate documents extend qlog for protocol-specific data. The schema is also
independent of serialization format, allowing logs to be represented in many
ways such as JSON, CSV, or protobuf.</t>
    </abstract>
    <note>
      <name>Note to Readers</name>
      <ul empty="true">
        <li>
          <t>Note to RFC editor: Please remove this section before publication.</t>
        </li>
      </ul>
      <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>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>Endpoint logging is a useful strategy for capturing and understanding how
applications using network protocols are behaving, particularly where protocols
have an encrypted wire image that restricts observers' ability to see what is
happening.</t>
      <t>Many applications implement logging using a custom, non-standard logging format.
This has an effect on the tools and methods that are used to
analyze the logs, for example to perform root cause analysis of an
interoperability failure between distinct implementations. A lack of a common
format impedes the development of common tooling that can be used by all parties
that have access to logs.</t>
      <t>This document defines qlog, an extensible high-level schema and harness that
provides a shareable, aggregatable and structured logging format. This
high-level schema is independent of protocol, with logging entries for specific
protocols and use cases being defined in other documents (see for example
<xref target="QLOG-QUIC"/> for QUIC and <xref target="QLOG-H3"/> for HTTP/3-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, qlog provides versioning, metadata inclusion, log aggregation, event
grouping and log file size reduction techniques.</t>
      <t>The qlog schema can be serialized in many ways (e.g., JSON, CBOR, protobuf,
etc). This document describes only how to employ <xref target="JSON"/>, its subset
<xref target="I-JSON"/>, and its streamable derivative
<xref target="JSON-Text-Sequences"/>.</t>
      <section anchor="data_types">
        <name>Notational Conventions</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <section anchor="schema-definition">
          <name>Schema definition</name>
          <t>To define events and data structures, all qlog documents use the Concise
Data Definition Language <xref target="CDDL"/>. This document uses the basic
syntax, the specific <tt>text</tt>, <tt>uint</tt>, <tt>float32</tt>, <tt>float64</tt>, <tt>bool</tt>, and
<tt>any</tt> types, as well as the <tt>.default</tt>, <tt>.size</tt>, and <tt>.regexp</tt> control
operators, the <tt>~</tt> unwrapping operator, and the <tt>$</tt> extension point
syntax from <xref target="CDDL"/>.</t>
          <t>Additionally, this document defines the following custom types for
clarity:</t>
          <figure anchor="cddl-custom-types-def">
            <name>Additional CDDL type definitions</name>
            <sourcecode type="cddl"><![CDATA[
; CDDL's uint is defined as being 64-bit in size
; but for many protocol fields it is better to be restrictive
; and explicit
uint8 = uint .size 1
uint16 = uint .size 2
uint32 = uint .size 4
uint64 = uint .size 8

; an even-length lowercase string of hexadecimally encoded bytes
; examples: 82dc, 027339, 4cdbfd9bf0
; this is needed because the default CDDL binary string (bytes/bstr)
; is only CBOR and not JSON compatible
hexstring = text .regexp "([0-9a-f]{2})*"
]]></sourcecode>
          </figure>
          <t>All timestamps and time-related values (e.g., offsets) in qlog are
logged as <tt>float64</tt> in the millisecond resolution.</t>
          <t>Other qlog documents can define their own CDDL-compatible (struct) types
(e.g., separately for each Packet type that a protocol supports).</t>
          <ul empty="true">
            <li>
              <t>Note to RFC editor: Please remove the following text in this section before
publication.</t>
            </li>
          </ul>
          <t>The main general CDDL syntax conventions in this document a reader
should be aware of for easy reading comprehension are:</t>
          <ul spacing="normal">
            <li>
              <tt>? obj</tt> : this object is optional</li>
            <li>
              <tt>TypeName1 / TypeName2</tt> : a union of these two types (object can be either type 1 OR
type 2)</li>
            <li>
              <tt>obj: TypeName</tt> : this object has this concrete type</li>
            <li>
              <tt>obj: [* TypeName]</tt> : this object is an array of this type with
minimum size of 0 elements</li>
            <li>
              <tt>obj: [+ TypeName]</tt> : this object is an array of this type with
minimum size of 1 element</li>
            <li>
              <tt>TypeName = ...</tt> : defines a new type</li>
            <li>
              <tt>EnumName = "entry1" / "entry2" / entry3 / ...</tt>: defines an enum</li>
            <li>
              <tt>StructName = { ... }</tt> : defines a new struct type</li>
            <li>
              <tt>;</tt> : single-line comment</li>
            <li>
              <tt>* text =&gt; any</tt> : special syntax to indicate 0 or more fields that
have a string key that maps to any value. Used to indicate a generic
JSON object.</li>
          </ul>
          <t>All timestamps and time-related values (e.g., offsets) in qlog are
logged as <tt>float64</tt> in the millisecond resolution.</t>
          <t>Other qlog documents can define their own CDDL-compatible (struct) types
(e.g., separately for each Packet type that a protocol supports).</t>
        </section>
        <section anchor="serialization-examples">
          <name>Serialization examples</name>
          <t>Serialization examples in this document use JSON (<xref target="JSON"/>) unless
otherwise indicated.</t>
        </section>
      </section>
    </section>
    <section anchor="design-goals">
      <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>A flexible format that can reduce log producer overhead, at the cost of
increased complexity for consumers (e.g. tools)</li>
        <li>Extensible and pragmatic</li>
        <li>Aggregation and transformation friendly (e.g., the top-level element
for the non-streaming format is a container for individual traces,
group_ids can be used to tag events to a particular context)</li>
        <li>Metadata is stored together with event data</li>
      </ul>
    </section>
    <section anchor="qlog-file-schema">
      <name>QlogFile schema</name>
      <t>A qlog using the QlogFile schema can contain several individual traces and logs
from multiple vantage points that are in some way related. The top-level element
in this schema defines only a small set of "header" fields and an array of
component traces, defined in <xref target="qlog-file-def"/> as:</t>
      <figure anchor="qlog-file-def">
        <name>QlogFile definition</name>
        <sourcecode type="cddl"><![CDATA[
QlogFile = {
    qlog_version: text
    ? qlog_format: text .default "JSON"
    ? title: text
    ? description: text
    ? traces: [+ Trace /
                 TraceError]
}
]]></sourcecode>
      </figure>
      <t>The required "qlog_version" field <bcp14>MUST</bcp14> have the value "0.4".</t>
      <t>The optional "qlog_format" field indicates the serialization format. Its value
<bcp14>MUST</bcp14> either be one of the options defined in this document (i.e.,
<xref target="concrete-formats"/>) or the field <bcp14>MUST</bcp14> be omitted entirely. When the field is
omitted the default value of "JSON" applies.</t>
      <t>The optional "title" and "description" fields provide additional free-text
information about the file.</t>
      <t>The optional "traces" field contains an array of qlog traces (<xref target="trace"/>), each
of which contain metadata and an array of qlog events (<xref target="events"/>).</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 <bcp14>SHOULD</bcp14> be in the first 256 characters/bytes of the resulting log file.</t>
      <t>Where a qlog file is serialized to a JSON format, one of the downsides 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. The alternative QlogFileSeq
(<xref target="qlog-file-seq-schema"/>) is better suited to streaming.</t>
      <t>JSON serialization example:</t>
      <figure anchor="qlog-file-ex">
        <name>QlogFile example</name>
        <artwork><![CDATA[
{
    "qlog_version": "0.4",
    "qlog_format": "JSON",
    "title": "Name of this particular qlog file (short)",
    "description": "Description for this group of traces (long)",
    "traces": [...]
}
]]></artwork>
      </figure>
      <section anchor="traces">
        <name>Traces</name>
        <t>It can be advantageous to group several related qlog traces together in a single
file. For example, it is possible to 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>The QlogFile "traces" field is an array that contains a list of individual qlog
traces. When capturing a qlog at a vantage point, it is expected that the traces
field contains a single entry. Files can be aggregated, for example as part of a
post-processing operation, by copying the traces in component to files into the
combined "traces" array of a new, aggregated qlog file.</t>
      </section>
      <section anchor="trace">
        <name>Trace</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. 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>A Trace contains some metadata in addition to qlog events, defined in
<xref target="trace-def"/> as:</t>
        <figure anchor="trace-def">
          <name>Trace definition</name>
          <sourcecode type="cddl"><![CDATA[
Trace = {
    ? title: text
    ? description: text
    ? common_fields: CommonFields
    ? vantage_point: VantagePoint
    events: [* Event]
}
]]></sourcecode>
        </figure>
        <t>The optional "title" and "description" fields provide additional free-text
information about the trace.</t>
        <t>The optional "common_fields" field is described in <xref target="common-fields"/>.</t>
        <t>The optional "vantage_point" field is described in <xref target="vantage-point"/>.</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>
        <t>JSON serialization example:</t>
        <figure anchor="trace-ex">
          <name>Trace example</name>
          <artwork><![CDATA[
{
    "title": "Name of this particular trace (short)",
    "description": "Description for this trace (long)",
    "common_fields": {
        "ODCID": "abcde1234",
        "time_format": "absolute"
    },
    "vantage_point": {
        "name": "backend-67",
        "type": "server"
    },
    "events": [...]
}
]]></artwork>
        </figure>
      </section>
      <section anchor="traceerror">
        <name>TraceError</name>
        <t>A TraceError indicates that an attempt to find/convert a file for inclusion in
the aggregated qlog was made, but there was an error during the process. Rather
than silently dropping the erroneous file, it can be explicitly included in the
qlog file as an entry in the "traces" array, defined in <xref target="trace-error-def"/> as:</t>
        <figure anchor="trace-error-def">
          <name>TraceError definition</name>
          <sourcecode type="cddl"><![CDATA[
TraceError = {
    error_description: text

    ; the original URI used for attempted find of the file
    ? uri: text
    ? vantage_point: VantagePoint
}
]]></sourcecode>
        </figure>
        <t>JSON serialization example:</t>
        <figure anchor="trace-error-ex">
          <name>TraceError example</name>
          <artwork><![CDATA[
{
    "error_description": "File could not be found",
    "uri": "/srv/traces/today/latest.qlog",
    "vantage_point": { type: "server" }
}
]]></artwork>
        </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"/>.</t>
      </section>
    </section>
    <section anchor="qlog-file-seq-schema">
      <name>QlogFileSeq schema</name>
      <t>A qlog file using the QlogFileSeq schema can be serialized to a streamable JSON
format called JSON Text Sequences (JSON-SEQ) (<xref target="RFC7464"/>). The top-level
element in this schema defines only a small set of "header" fields and an array
of component traces, defined in <xref target="qlog-file-def"/> as:</t>
      <figure anchor="qlog-file-seq-def">
        <name>QlogFileSeq definition</name>
        <sourcecode type="cddl"><![CDATA[
QlogFileSeq = {
    qlog_format: "JSON-SEQ"
    qlog_version: text
    ? title: text
    ? description: text
    trace: TraceSeq
}
]]></sourcecode>
      </figure>
      <t>The required "qlog_format" field <bcp14>MUST</bcp14> have the value "JSON-SEQ".</t>
      <t>The required "qlog_version" field <bcp14>MUST</bcp14> have the value "0.4".</t>
      <t>The optional "title" and "description" fields provide additional free-text
information about the file.</t>
      <t>The optional "trace" field contains a singular trace metadata. All qlog events
in the file are related to this trace.</t>
      <t>JSON-SEQ serialization example:</t>
      <figure anchor="json-seq-ex">
        <name>Top-level element</name>
        <artwork><![CDATA[
// list of qlog events, serialized in accordance with RFC 7464,
// starting with a Record Separator character and ending with a
// newline.
// For display purposes, Record Separators are rendered as <RS>

<RS>{
    "qlog_version": "0.4",
    "qlog_format": "JSON-SEQ",
    "title": "Name of JSON Text Sequence qlog file (short)",
    "description": "Description for this trace 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"
      }
    }
}
<RS>{"time": 2, "name": "quic:parameters_set", "data": { ... } }
<RS>{"time": 7, "name": "quic:packet_sent", "data": { ... } }
...
]]></artwork>
      </figure>
      <t>For further information about serialization, see <xref target="format-json-seq"/>.</t>
      <section anchor="traceseq">
        <name>TraceSeq</name>
        <t>TraceSeq is used with QlogFileSeq. It is conceptually similar to a Trace, with
the exception that qlog events are not contained within it, but rather appended
after it in a QlogFileSeq.</t>
        <figure anchor="trace-seq-def">
          <name>TraceSeq definition</name>
          <sourcecode type="cddl"><![CDATA[
TraceSeq = {
    ? title: text
    ? description: text
    ? common_fields: CommonFields
    ? vantage_point: VantagePoint
}
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="vantage-point">
      <name>VantagePoint</name>
      <t>A VantagePoint describes the vantage point from which a trace originates,
defined in <xref target="vantage-point-def"/> as:</t>
      <figure anchor="vantage-point-def">
        <name>VantagePoint definition</name>
        <sourcecode type="cddl"><![CDATA[
VantagePoint = {
    ? name: text
    type: VantagePointType
    ? flow: VantagePointType
}

; client = endpoint which initiates the connection
; server = endpoint which accepts the connection
; network = observer in between client and server
VantagePointType = "client" /
                   "server" /
                   "network" /
                   "unknown"
]]></sourcecode>
      </figure>
      <t>JSON serialization examples:</t>
      <figure anchor="vantage-point-ex">
        <name>VantagePoint example</name>
        <artwork><![CDATA[
{
    "name": "aioquic client",
    "type": "client"
}

{
    "name": "wireshark trace",
    "type": "network",
    "flow": "client"
}
]]></artwork>
      </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 anchor="events">
      <name>Events</name>
      <t>A qlog 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>An Event is defined in <xref target="event-def"/> as:</t>
      <figure anchor="event-def">
        <name>Event definition</name>
        <sourcecode type="cddl"><![CDATA[
Event = {
    time: float64
    name: text
    data: $ProtocolEventData
    ? path: PathID
    ? time_format: TimeFormat
    ? protocol_type: ProtocolType
    ? group_id: GroupID
    ? system_info: SystemInformation

    ; events can contain any amount of custom fields
    * text => any
}
]]></sourcecode>
      </figure>
      <t>Each qlog event <bcp14>MUST</bcp14> contain the mandatory fields: "time"
(<xref target="time-based-fields"/>), "name" (<xref target="name-field"/>), and "data" (<xref target="data-field"/>).</t>
      <t>Each qlog event <bcp14>MAY</bcp14> contain the optional fields: "time_format"
(<xref target="time-based-fields"/>), "protocol_type" (<xref target="protocol-type-field"/>), "trigger"
(<xref target="trigger-field"/>), and "group_id" (<xref target="group-ids"/>).</t>
      <t>Multiple events can appear in a Trace or TraceSeq and they might contain fields
with identical values. It is possible to optimize out this duplication using
"common_fields" (<xref target="common-fields"/>).</t>
      <t>The specific values for each of these fields and their semantics are defined in
separate documents, depending on protocol or use case. For example: event
definitions for QUIC and HTTP/3 can be found in <xref target="QLOG-QUIC"/> and <xref target="QLOG-H3"/>.</t>
      <t>Events are intended to be extended with custom fields, therefore they <bcp14>MAY</bcp14>
contain other fields not defined in this document. Custom fields may be known or
unknown to tools. Tools <bcp14>SHOULD</bcp14> allow for the presence of unknown event fields,
but their semantics depend on the context of the log usage.</t>
      <t>JSON serialization:</t>
      <figure anchor="event-ex">
        <name>Event example</name>
        <artwork><![CDATA[
{
    "time": 1553986553572,

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

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

    "time_format": "absolute",

    "ODCID": "127ecc830d98f9d54a42c4f0842aa87e181a"
}
]]></artwork>
      </figure>
      <section anchor="time-based-fields">
        <name>Timestamps</name>
        <t>An event's "time" field indicates the timestamp at which the event occurred. 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 succinct 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>
        <figure anchor="time-format-def">
          <name>TimeFormat definition</name>
          <sourcecode type="cddl"><![CDATA[
TimeFormat = "absolute" /
             "delta" /
             "relative"
]]></sourcecode>
        </figure>
        <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"/>) 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-format-ex"/>.</t>
        <figure anchor="time-format-ex">
          <name>Three different approaches for logging timestamps</name>
          <artwork><![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 <bcp14>MUST</bcp14>
include a timestamp in the "time" field.</t>
        <t>Events in each individual trace <bcp14>SHOULD</bcp14> be logged in strictly ascending timestamp
order (though not necessarily absolute value, for the "delta" format). Tools <bcp14>MAY</bcp14>
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 post-processor 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 <bcp14>SHOULD NOT</bcp14> 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">
        <name>Names</name>
        <t>Events differ mainly in the type of metadata associated with them. The "name"
field is an identifier that parsers can use to decide how to interpret the event
metadata contained in the "data" field (see <xref target="data-field"/>).</t>
        <t>Event names indicate a category and type. The "name" field <bcp14>MUST</bcp14> contain a
non-empty character sequence representing a category, followed by a colon (':'),
followed by a non-empty character sequence representing a 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 "quic", "h3",
"qpack", and "recovery". Within these categories, the event type provides
additional granularity. For example for QUIC and HTTP/3, within the "quic"
category, there would be "packet_sent" and "packet_received" events.</t>
        <t>JSON serialization example:</t>
        <figure anchor="name-ex">
          <name>An event with category "quic" and type "packet_sent".</name>
          <artwork><![CDATA[
{
    "name": "quic:packet_sent"
}
]]></artwork>
        </figure>
      </section>
      <section anchor="data-field">
        <name>Data</name>
        <t>An event's "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 definitions for QUIC and HTTP/3 can be found in <xref target="QLOG-QUIC"/> and
<xref target="QLOG-H3"/>.</t>
        <t>This field is defined here as a CDDL extension point (a "socket" or
"plug") named <tt>$ProtocolEventData</tt>. Other documents <bcp14>MUST</bcp14> properly extend
this extension point when defining new data field content options to
enable automated validation of aggregated qlog schemas.</t>
        <t>The only common field defined for the data field is the <tt>trigger</tt> field,
which is discussed in <xref target="trigger-field"/>.</t>
        <figure anchor="protocoleventdata-def">
          <name>ProtocolEventData definition</name>
          <sourcecode type="cddl"><![CDATA[
; The ProtocolEventData is any key-value map (e.g., JSON object)
; only the optional trigger field is defined in this document
$ProtocolEventData /= {
    ? trigger: text
    * text => any
}
; event documents are intended to extend this socket by using:
; NewProtocolEventData = EventType1 /
;                        EventType2 /
;                        ... /
;                        EventTypeN
; $ProtocolEventData /= NewProtocolEventData
]]></sourcecode>
        </figure>
        <t>One purely illustrative example for a QUIC "packet_sent" event is shown in
<xref target="data-ex"/>:</t>
        <figure anchor="data-ex">
          <name>Example of the 'data' field for a QUIC packet_sent event</name>
          <artwork><![CDATA[
TransportPacketSent = {
    ? packet_size: uint16
    header: PacketHeader
    ? frames:[* QuicFrame]
    ? trigger: "pto_probe" /
               "retransmit_timeout" /
               "bandwidth_probe"
}

could be serialized as

{
    "packet_size": 1280,
    "header": {
        "packet_type": "1RTT",
        "packet_number": 123
    },
    "frames": [
        {
            "frame_type": "stream",
            "length": 1000,
            "offset": 456
        },
        {
            "frame_type": "padding"
        }
    ]
}
]]></artwork>
        </figure>
      </section>
      <section anchor="path-field">
        <name>Path</name>
        <t>A qlog event can be associated with a single "network path" (usually, but not
always, identified by a 4-tuple of IP addresses and ports). In many cases, the
path will be the same for all events in a given trace, and does not need to be
logged explicitly with each event. In this case, the "path" field can be omitted
(in which case the default value of "" is assumed) or reflected in
"common_fields" instead (see <xref target="common-fields"/>).</t>
        <t>However, in some situations, such as during QUIC's Connection Migration or when
using Multipath features, it is useful to be able to split events across
multiple (concurrent) paths.</t>
        <t>Definition:</t>
        <figure anchor="path-def">
          <name>PathID definition</name>
          <sourcecode type="cddl"><![CDATA[
PathID = text .default ""
]]></sourcecode>
        </figure>
        <t>The "path" field is an identifier that is associated with a single network path.
This document intentionally does not define further how to choose this
identifier's value per-path or how to potentially log other parameters that can
be associated with such a path. This is left for other documents. Implementers
are free to encode path information directly into the PathID or to log
associated info in a separate event. For example, QUIC has the "path_assigned"
event to couple the PathID value to a specific path configuration, see
<xref target="QLOG-QUIC"/>.</t>
      </section>
      <section anchor="protocol-type-field">
        <name>ProtocolType</name>
        <t>An event's "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>
        <figure anchor="protocol-type-def">
          <name>ProtocolType definition</name>
          <sourcecode type="cddl"><![CDATA[
ProtocolType = [+ text]
]]></sourcecode>
        </figure>
        <t>For example, QUIC and HTTP/3 events have the "QUIC" and "HTTP3" protocol_type
entry values, see <xref target="QLOG-QUIC"/> and <xref target="QLOG-H3"/>.</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"/>.</t>
      </section>
      <section anchor="trigger-field">
        <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 occurring, see
<xref target="data-field"/>. 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-ex"/>:</t>
        <figure anchor="trigger-ex">
          <name>Trigger example</name>
          <artwork><![CDATA[
TransportPacketDropped = {
    ? packet_type: PacketType
    ? raw_length: uint16
    ? trigger: "key_unavailable" /
               "unknown_connection_id" /
               "decrypt_error" /
               "unsupported_version"
}
]]></artwork>
        </figure>
      </section>
      <section anchor="group-ids">
        <name>Grouping</name>
        <t>As discussed in <xref target="trace"/>, 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, a method for splitting up events belonging
to separate logical entities is required.</t>
        <t>The simplest way to perform this splitting is by associating a "group id"
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,
the QUIC "Original Destination Connection ID" could be used 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-ex"/>.</t>
        <figure anchor="group-id-def">
          <name>GroupID definition</name>
          <sourcecode type="cddl"><![CDATA[
GroupID = text
]]></sourcecode>
        </figure>
        <t>JSON serialization example for events grouped by four tuples
and QUIC connection IDs:</t>
        <figure anchor="group-id-ex">
          <name>GroupID example</name>
          <artwork><![CDATA[
"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": "quic:packet_received",
        "data": { ... }
    },
    {
        "time": 1553986553581,
        "protocol_type": ["QUIC","HTTP3"],
        "group_id": "127ecc830d98f9d54a42c4f0842aa87e181a",
        "name": "quic:packet_sent",
        "data": { ... }
    }
]
]]></artwork>
        </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"/>.</t>
      </section>
      <section anchor="systeminformation">
        <name>SystemInformation</name>
        <t>The "system_info" field can be used to record system-specific details related to an
event. This is useful, for instance, where an application splits work across
CPUs, processes, or threads and events for a single trace occur on potentially
different combinations thereof. Each field is optional to support deployment
diversity.</t>
        <sourcecode type="cddl"><![CDATA[
SystemInformation = {
  ? processor_id: uint32
  ? process_id: uint32
  ? thread_id: uint32
}
]]></sourcecode>
      </section>
      <section anchor="common-fields">
        <name>CommonFields</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-ex"/>.</t>
        <figure anchor="common-fields-ex">
          <name>CommonFields example</name>
          <artwork><![CDATA[
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": "quic: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 instead
extracted to common_fields:

{
    "common_fields": {
        "group_id": "127ecc830d98f9d54a42c4f0842aa87e181a",
        "protocol_type": ["QUIC","HTTP3"],
        "time_format": "relative",
        "reference_time": 1553986553572
    },
    "events": [
        {
            "time": 2,
            "name": "quic:packet_received",
            "data": { ... }
        },{
            "time": 7,
            "name": "http:frame_parsed",
            "data": { ... }
        }
    ]
}
]]></artwork>
        </figure>
        <t>An event's "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 <bcp14>MUST</bcp14> be disregarded
by the user and tools (i.e., the presence of an unknown 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 shown in the listing
below:</t>
        <figure anchor="common-fields-def">
          <name>CommonFields definition</name>
          <sourcecode type="cddl"><![CDATA[
CommonFields = {
    ? path: PathID
    ? time_format: TimeFormat
    ? reference_time: float64
    ? protocol_type: ProtocolType
    ? group_id: GroupID
    * text => any
}
]]></sourcecode>
        </figure>
        <t>Tools <bcp14>MUST</bcp14> 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 <bcp14>MUST NOT</bcp14> 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 anchor="raw-info">
      <name>Raw packet and frame information</name>
      <t>While qlog is a high-level logging format, it also allows the inclusion of most
raw wire image information, such as byte lengths and byte values. This is useful
when for example investigating or tuning packetization behavior or determining
encoding/framing overheads. However, these fields are not always necessary, can
take up considerable space, and can have a considerable privacy and security
impact (see <xref target="privacy"/>). Where applicable, these fields are grouped in a
separate, optional, field named "raw" of type RawInfo. The exact definition of
entities, headers, trailers and payloads depend on the protocol used.</t>
      <figure anchor="raw-info-def">
        <name>RawInfo definition</name>
        <sourcecode type="cddl"><![CDATA[
RawInfo = {

    ; the full byte length of the entity (e.g., packet or frame),
    ; including possible headers and trailers
    ? length: uint64

    ; the byte length of the entity's payload,
    ; excluding possible headers or trailers
    ? payload_length: uint64

    ; the (potentially truncated) contents of the full entity,
    ; including headers and possibly trailers
    ? data: hexstring
}
]]></sourcecode>
      </figure>
      <t>The RawInfo:data field can be truncated for privacy or security purposes, see
<xref target="truncated-values"/>. In this case, the length and payload_length fields should
still indicate the non-truncated lengths when used for debugging purposes.</t>
      <t>This document does not specify explicit header_length or trailer_length fields.
In protocols without trailers, header_length can be calculated by subtracting
the payload_length from the length. In protocols with trailers (e.g., QUIC's
AEAD tag), event definition documents <bcp14>SHOULD</bcp14> define how to support header_length
calculation.</t>
    </section>
    <section anchor="common-events-and-data-classes">
      <name>Common events and data classes</name>
      <t>There are some event types and data classes that are common across protocols,
applications, and use cases. This section specifies such common definitions.</t>
      <section anchor="generic-events">
        <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">
          <name>error</name>
          <t>Used to log details of an internal error that might not get reflected on the
wire. It has Core importance level; see <xref target="importance"/>.</t>
          <figure anchor="generic-error-def">
            <name>GenericError definition</name>
            <sourcecode type="cddl"><![CDATA[
GenericError = {
    ? code: uint64
    ? message: text
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="warning">
          <name>warning</name>
          <t>Used to log details of an internal warning that might not get reflected on the
wire. It has Base importance level; see <xref target="importance"/>.</t>
          <figure anchor="generic-warning-def">
            <name>GenericWarning definition</name>
            <sourcecode type="cddl"><![CDATA[
GenericWarning = {
    ? code: uint64
    ? message: text
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="info">
          <name>info</name>
          <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. The event
has Extra importance level; see <xref target="importance"/>.</t>
          <figure anchor="generic-info-def">
            <name>GenericInfo definition</name>
            <sourcecode type="cddl"><![CDATA[
GenericInfo = {
    message: text
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="debug">
          <name>debug</name>
          <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. The event
has Extra importance level; see <xref target="importance"/>.</t>
          <figure anchor="generic-debug-def">
            <name>GenericDebug definition</name>
            <sourcecode type="cddl"><![CDATA[
GenericDebug = {
    message: text
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="verbose">
          <name>verbose</name>
          <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. The event
has Extra importance level; see <xref target="importance"/>.</t>
          <figure anchor="generic-verbose-def">
            <name>GenericVerbose definition</name>
            <sourcecode type="cddl"><![CDATA[
GenericVerbose = {
    message: text
}
]]></sourcecode>
          </figure>
        </section>
      </section>
      <section anchor="simulation-events">
        <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">
          <name>scenario</name>
          <t>Used to specify which specific scenario is being tested at this particular
instance. This supports, for example, aggregation of several simulations into
one trace (e.g., split by <tt>group_id</tt>). It has Extra importance level; see
<xref target="importance"/>.</t>
          <figure anchor="simulation-scenario-def">
            <name>SimulationScenario definition</name>
            <sourcecode type="cddl"><![CDATA[
SimulationScenario = {
    ? name: text
    ? details: {* text => any }
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="marker">
          <name>marker</name>
          <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). It has Extra importance level; see <xref target="importance"/>.</t>
          <figure anchor="simulation-marker-def">
            <name>SimulationMarker definition</name>
            <sourcecode type="cddl"><![CDATA[
SimulationMarker = {
    ? type: text
    ? message: text
}
]]></sourcecode>
          </figure>
        </section>
      </section>
    </section>
    <section anchor="event-definition-guidelines">
      <name>Event definition guidelines</name>
      <t>This document defines the main schema for the qlog format together with some
common events, which on their own do not provide much logging utility. It is
expected that logging is extended with specific, per-protocol event definitions
that specify the name (category + type) and data needed for each individual
event. Examples include the QUIC event definitions <xref target="QLOG-QUIC"/> and HTTP/3
event definitions <xref target="QLOG-H3"/>.</t>
      <t>This section defines some basic annotations and concepts that <bcp14>SHOULD</bcp14> be used by
event definition documents. Doing so ensures a measure of consistency that makes
it easier for qlog implementers to support a wide variety of protocols.</t>
      <section anchor="event-design">
        <name>Event design</name>
        <t>There are several ways of defining qlog events. In practice, two main types of
approach have been observed: 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 behaviors 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, when logging additional state change events, those state changes can
often be directly inferred from data on the wire (for example flow control limit
changes). As such, if the implementation is bug-free and spec-compliant, logging
additional events is typically avoided. 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="importance">
        <name>Event importance levels</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, qlog defines three event importance levels, in
decreasing order of importance and expected usage:</t>
        <ul spacing="normal">
          <li>Core</li>
          <li>Base</li>
          <li>Extra</li>
        </ul>
        <t>Events definitions <bcp14>SHOULD</bcp14> assign an importance level.</t>
        <t>Core-level events <bcp14>SHOULD</bcp14> 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 <bcp14>SHOULD</bcp14>
expect and add support for these events, though <bcp14>SHOULD NOT</bcp14> expect all Core events
to be present in each qlog trace.</t>
        <t>Base-level events add additional debugging options and <bcp14>MAY</bcp14> 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 used to help show when decisions are actually made
based on received data. Tool implementers <bcp14>SHOULD</bcp14> at least add support for
showing the contents of these events, if they do not handle them explicitly.</t>
        <t>Extra-level events are considered mostly useful for low-level debugging of the
implementation, rather than the protocol. They allow more fine-grained tracking
of internal behavior. As such, they <bcp14>MAY</bcp14> be present in qlog files and tool
implementers <bcp14>MAY</bcp14> 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 Core-level events due to performance or privacy considerations.
In this case, they <bcp14>SHOULD</bcp14> use (a subset of) relevant Base-level 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, <bcp14>SHOULD</bcp14> 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">
        <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 <bcp14>SHOULD NOT</bcp14> expect non-specialized tools to recognize or visualize
this custom data. However, tools <bcp14>SHOULD</bcp14> make an effort to visualize even unknown
data if possible in the specific tool's context. If they do not, they <bcp14>MUST</bcp14> ignore
these unknown fields.</t>
      </section>
    </section>
    <section anchor="concrete-formats">
      <name>Serializing qlog</name>
      <t>qlog schema definitions in this document are intentionally agnostic to
serialization formats. The choice of format is an implementation decision.</t>
      <t>Other documents related to qlog (for example event definitions for specific
protocols), <bcp14>SHOULD</bcp14> be similarly agnostic to the employed serialization format
and <bcp14>SHOULD</bcp14> clearly indicate this. If not, they <bcp14>MUST</bcp14> include an explanation on
which serialization formats are supported and on how to employ them correctly.</t>
      <t>Serialization formats make certain tradeoffs between usability, flexibility,
interoperability, and efficiency. Implementations should take these into
consideration when choosing a format. Some examples of possible formats are
JSON, CBOR, CSV, protocol buffers, flatbuffers, etc. which each have their own
characteristics. For instance, a textual format like JSON can be more flexible
than a binary format but more verbose, typically making it less efficient than a
binary format. A plaintext readable (yet relatively large) format like JSON is
potentially more usable for users operating on the logs directly, while a more
optimized yet restricted format can better suit the constraints of a large scale
operation. A custom or restricted format could be more efficient for analysis
with custom tooling but might not be interoperable with general-purpose qlog
tools.</t>
      <t>Considering these tradeoffs, JSON-based serialization formats provide features
that make them a good starting point for qlog flexibility and interoperability.
For these reasons, JSON is a recommended default and expanded considerations are
given to how to map qlog to JSON (<xref target="format-json"/>, and its streaming counterpart
JSON Text Sequences (<xref target="format-json-seq"/>. <xref target="json-interop"/> presents
interoperability considerations for both formats, and <xref target="optimizations"/> presents
potential optimizations.</t>
      <t>Serialization formats require appropriate deserializers/parsers. The
"qlog_format" field (<xref target="qlog-file-schema"/>) is used to indicate the chosen
serialization format.</t>
      <section anchor="format-json">
        <name>qlog to JSON mapping</name>
        <t>As described in <xref target="qlog-file-schema"/>, JSON is the default qlog serialization. When
mapping qlog to normal JSON, QlogFile (<xref target="qlog-file-def"/>) is used and the
"qlog_format" field <bcp14>MUST</bcp14> have the value "JSON". The file extension/suffix <bcp14>SHOULD</bcp14>
be ".qlog". The Media Type, if any, <bcp14>SHOULD</bcp14> be "application/qlog+json" per
<xref target="RFC6839"/>.</t>
        <t>In accordance with <xref section="8.1" sectionFormat="of" target="RFC8259"/>, JSON files are required to use
UTF-8 both for the file itself and the string values it contains. In addition,
all qlog field names <bcp14>MUST</bcp14> be lowercase when serialized to JSON.</t>
        <t>In order to serialize CDDL-based qlog event and data structure
definitions to JSON, the official CDDL-to-JSON mapping defined in
<xref section="E" sectionFormat="of" target="CDDL"/> <bcp14>SHOULD</bcp14> be employed.</t>
      </section>
      <section anchor="format-json-seq">
        <name>qlog to JSON Text Sequences mapping</name>
        <t>One of the downsides of using normal JSON is that it is inherently a
non-streamable format. A qlog serializer could work around this by opening a
file, writing the required opening data, streaming qlog events by appending
them, and then finalizing the log by appending appropriate closing tags e.g.,
"]}]}". However, failure to append closing tags, could lead to problems because
most JSON parsers will fail if a document is malformed. Some streaming JSON
parsers are able to handle missing closing tags, however they are not widely
deployed in popular environments (e.g., Web browsers)</t>
        <t>To overcome the issues related to JSON streaming, a qlog mapping to a streamable
JSON format called JSON Text Sequences (JSON-SEQ) (<xref target="RFC7464"/>) is provided.</t>
        <t>JSON Text Sequences are very similar to JSON, except that objects are
serialized as individual records, each prefixed by an ASCII Record Separator
(&lt;RS&gt;, 0x1E), and each ending with an ASCII Line Feed character (\n, 0x0A). Note
that each record can also contain any amount of newlines in its body, as long as
it ends with a newline character before the next &lt;RS&gt; character.</t>
        <t>In order to leverage the streaming capability, each qlog event is serialized and
interpreted as an individual JSON Text Sequence record, that is appended as a
new object to the back of an event stream or log file. Put differently, unlike
default JSON, it does not require a document to be wrapped as a full object with
"{ ... }" or "[... ]".</t>
        <t>This alternative record streaming approach cannot be accommodated by QlogFile
(<xref target="qlog-file-def"/>). Instead, QlogFileSeq is defined in <xref target="qlog-file-seq-def"/>,
which notably includes only a single trace (TraceSeq) and omits an explicit
"events" array. An example is provided in <xref target="json-seq-ex"/>. The "group_id" field
can still be used on a per-event basis to include events from conceptually
different sources in a single JSON-SEQ qlog file.</t>
        <t>When mapping qlog to JSON-SEQ, the "qlog_format" field <bcp14>MUST</bcp14> have the value
"JSON-SEQ". The file extension/suffix <bcp14>SHOULD</bcp14> be ".sqlog" (for "streaming" qlog).
The Media Type, if any, <bcp14>SHOULD</bcp14> be "application/qlog+json-seq" per <xref target="RFC8091"/>.</t>
        <t>While not specifically required by the JSON-SEQ specification, all qlog field
names <bcp14>MUST</bcp14> be lowercase when serialized to JSON-SEQ.</t>
        <t>In order to serialize all other CDDL-based qlog event and data structure
definitions to JSON-SEQ, the official CDDL-to-JSON mapping defined in
<xref section="E" sectionFormat="of" target="CDDL"/> <bcp14>SHOULD</bcp14> be employed.</t>
        <section anchor="supporting-json-text-sequences-in-tooling">
          <name>Supporting JSON Text Sequences in tooling</name>
          <t>Note that JSON Text Sequences are not supported in most default programming
environments (unlike normal JSON). However, several custom JSON-SEQ parsing
libraries exist in most programming languages that can be used and the format is
easy enough to parse with existing implementations (i.e., by splitting the file
into its component records and feeding them to a normal JSON parser individually,
as each record by itself is a valid JSON object).</t>
        </section>
      </section>
      <section anchor="json-interop">
        <name>JSON Interoperability</name>
        <t>Some JSON implementations have issues with the full JSON format, especially those
integrated within a JavaScript environment (e.g., Web browsers, NodeJS). I-JSON
(Internet-JSON) is a subset of JSON for such environments; see
<xref target="I-JSON"/>. One of the key limitations of JavaScript, and thus I-JSON,
is that it cannot represent full 64-bit integers in standard operating mode
(i.e., without using BigInt extensions), instead being limited to the range
-(2<sup>53</sup>)+1 to (2<sup>53</sup>)-1.</t>
        <t>To accommodate such constraints in CDDL, <xref section="E" sectionFormat="of" target="CDDL"/> recommends
defining new CDDL types for int64 and uint64 that limit their values to the
restricted 64-bit integer range. However, some of the protocols that qlog is
intended to support (e.g., QUIC, HTTP/3), can use the full range of uint64
values.</t>
        <t>As such, to support situations where I-JSON is in use, seralizers <bcp14>MAY</bcp14> encode
uint64 values using JSON strings. qlog parsers, therefore, <bcp14>SHOULD</bcp14> support
parsing of uint64 values from JSON strings or JSON numbers unless there is out-of-band
information indicating that neither the serializer nor parser are constrained by
I-JSON.</t>
      </section>
      <section anchor="truncated-values">
        <name>Truncated values</name>
        <t>For some use cases (e.g., limiting file size, privacy), it can be
necessary not to log a full raw blob (using the <tt>hexstring</tt> type) but
instead a truncated value. For example, one might only store 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.</t>
        <t>As such, all qlog schema definitions <bcp14>SHOULD</bcp14> include a separate,
length-indicating field for all fields of type <tt>hexstring</tt> they specify,
see for example <xref target="raw-info"/>. This not only ensures the original length
can always be retrieved, 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 <bcp14>MUST</bcp14>
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.
The main possible permutations are shown by example in
<xref target="truncated-values-ex"/>.</t>
        <figure anchor="truncated-values-ex">
          <name>Example for serializing truncated hexstrings</name>
          <artwork><![CDATA[
// both the content's value and its length are present
// (length is redundant)
{
    "content_length": 5,
    "content": "051428abff"
}

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

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

// both value and length are present, but the lengths
// do not match: the value was truncated to
// the first three bytes.
{
    "content_length": 5,
    "content": "051428"
}
]]></artwork>
        </figure>
      </section>
      <section anchor="optimizations">
        <name>Optimization of serialized data</name>
        <t>Both the JSON and JSON-SEQ 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
JSON(-SEQ) (de)serialization performance is typically (slightly) lower than that
of more optimized and predictable formats. Both aspects present challenges to
large scale setups, though they may still be practical to deploy; see <xref target="ANRW-2020"/>.
JSON and JSON-SEQ compress very well using commonly-available algorithms such as
GZIP or Brotli.</t>
        <t>During the development of qlog, a multitude of alternative formatting
and optimization options were assessed and the results are <eref target="https://github.com/quiclog/internet-drafts/issues/30#issuecomment-617675097">summarized on the qlog
github
repository</eref>.</t>
        <t>Formal definition of additional qlog formats or encodings that use the
optimization techniques described here, or any other optimization technique is
left to future activity that can apply the following guidelines.</t>
        <t>In order to help tools correctly parse and process serialized qlog, it is
<bcp14>RECOMMENDED</bcp14> that new formats also define suitable file extensions and media
types. This provides a clear signal and avoids the need to provide out-of-band
information or to rely on heuristic fallbacks; see <xref target="tooling"/>.</t>
      </section>
    </section>
    <section anchor="methods-of-access-and-generation">
      <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">
        <name>Set file output destination via an environment variable</name>
        <t>To provide users control over where and how qlog files are created, two
environment variables are defined. The first, QLOGFILE, indicates a full path to where an
individual qlog file should be stored. This path <bcp14>MUST</bcp14> include the full file
extension. The second, QLOGDIR, sets a general directory path in which qlog files
should be placed. This path <bcp14>MUST</bcp14> 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"/>) to allow post-hoc
separation of events.</t>
        <t>Implementations <bcp14>SHOULD</bcp14> provide support for QLOGDIR and <bcp14>MAY</bcp14> 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"/>.</t>
        <figure anchor="qlogdir-example">
          <name>Environment variable examples for a QUIC implementation</name>
          <artwork><![CDATA[
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".
]]></artwork>
        </figure>
      </section>
    </section>
    <section anchor="tooling">
      <name>Tooling requirements</name>
      <t>Tools ingestion qlog <bcp14>MUST</bcp14> indicate which qlog version(s), qlog format(s),
compression methods and potentially other input file formats (for example .pcap)
they support. Tools <bcp14>SHOULD</bcp14> at least support .qlog files in the default JSON format
(<xref target="format-json"/>). Additionally, they <bcp14>SHOULD</bcp14> indicate exactly which values for and
properties of the name (category and type) and data fields they look for to
execute their logic. Tools <bcp14>SHOULD</bcp14> 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
<bcp14>SHOULD</bcp14> generate a clear error message to this effect.</t>
      <t>Tools <bcp14>MUST NOT</bcp14> produce breaking errors for any field names and/or values in the
qlog format that they do not recognize. Tools <bcp14>SHOULD</bcp14> indicate even unknown event
occurrences 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">
      <name>Security and privacy considerations</name>
      <t>Protocols such as TLS <xref target="RFC8446"/> and QUIC <xref target="RFC9000"/> offer secure protection
for the wire image <xref target="RFC8546"/>. Logging can reveal aspects of the wire image
that would ordinarily be protected, creating tension between observability,
security and privacy, especially if data can be correlated across data sources.</t>
      <t>Depending on the observability use case any data could be logged or captured. As
per <xref target="RFC6973"/>, operators must be aware that such data could be compromised,
risking the privacy of all participants. Entities that expect protocol
features to ensure data privacy might unknowingly be subject to broader privacy
risks, undermining their ability to assess or respond effectively.</t>
      <section anchor="data-at-risk">
        <name>Data at risk</name>
        <t>qlog operators and implementers need to consider security and privacy risks when
handling qlog data, including logging, storage, usage, and more. The
considerations presented in this section may pose varying risks depending on the
the data itself or its handling.</t>
        <t>The following is a non-exhaustive list of example data types that could contain
sensitive information that might allow identification or correlation of
individual connections, endpoints, users or sessions across qlog or other data
sources (e.g., captures of encrypted packets):</t>
        <ul spacing="normal">
          <li>IP addresses and transport protocol port numbers.</li>
          <li>Session, Connection, or User identifiers e.g., QUIC Connection IDs <xref section="9.5" sectionFormat="of" target="RFC9000"/>).</li>
          <li>System-level information e.g., CPU, process, or thread identifiers.</li>
          <li>Stored State e.g., QUIC address validation and retry tokens, TLS session
tickets, and HTTP cookies.</li>
          <li>TLS decryption keys, passwords, and HTTP-level API access or authorization tokens.</li>
          <li>High-resolution event timestamps or inter-event timings, event counts, packet
sizes, and frame sizes.</li>
          <li>Full or partial raw packet and frame payloads that are encrypted.</li>
          <li>Full or partial raw packet and frame payloads that are plaintext e.g., HTTP Field
values, HTTP response data, or TLS SNI field values.</li>
        </ul>
      </section>
      <section anchor="operational-implications-and-recommendations">
        <name>Operational implications and recommendations</name>
        <t>Operational considerations should focus on authorizing capture and access to logs. Logging of
Internet protocols using qlog can be equivalent to the ability to store or read plaintext
communications. Without a more detailed analysis, all of the security considerations of plaintext access apply.</t>
        <t>It is recommended that qlog capture is subject to access control and auditing.
These controls should support granular levels of information capture based on
role and permissions (e.g., capture of more-sensitive data requires higher
privileges).</t>
        <t>It is recommended that access to stored qlogs is subject to access control and
auditing.</t>
        <t>End users might not understand the implications of qlog to security or privacy,
and their environments might limit access control techniques. Implementations should
make enabling qlog conspicuous (e.g., requiring clear and explicit actions to
start a capture) and resistant to social engineering, automation, or drive-by
attacks; for example, isolation or sandboxing of capture from other activities
in the same process or component.</t>
        <t>It is recommended that data retention policies are defined for the storage of
qlog files.</t>
        <t>It is recommended that qlog files are encrypted in transit and at rest.</t>
      </section>
      <section anchor="data-minimization-or-anonymization">
        <name>Data minimization or anonymization</name>
        <t>Applying data minimization or anonymization techniques to qlog might help
address some security and privacy risks. However, removing or anonymizing data
without sufficient care might not enhance privacy or security and
could diminish the utility of qlog data.</t>
        <t>Operators and implementers should balance the value of logged data with the
potential risks of (involuntary) disclosure, which can depend on use cases
(e.g., research datasets might have different requirements to live operational
troubleshooting).</t>
        <t>The most extreme form of minimization or anonymization is deleting a field,
equivalent to not logging it. qlog implementations should offer fine-grained
control for this on a per-use-case or per-connection basis.</t>
        <t>Data can undergo anonymization, pseudonymization, permutation, truncation,
re-encryption, or aggregation; see <xref section="B" sectionFormat="of" target="DNS-PRIVACY"/> for
techniques, especially regarding IP addresses. However, operators should be
cautious because many anonymization methods have been shown to be insufficient to safeguard
user privacy or identity, particularly with large or easily correlated data sets.</t>
        <t>Operators should consider end user rights and preferences. Active user participation (as
indicated by <xref target="RFC6973"/>) on a per-qlog basis is challenging but aligning qlog
capture, storage, and removal with existing user preference and privacy controls
is crucial. Operators should consider agressive approaches to deletion or
aggregation.</t>
        <t>The most sensitive data in qlog is typically contained in RawInfo type fields
(see <xref target="raw-info"/>). Therefore, qlog users should exercise caution and limit the
inclusion of such fields for all but the most stringent use cases.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>There are no IANA considerations.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="JSON">
          <front>
            <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <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="I-JSON">
          <front>
            <title>The I-JSON Message Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="March" year="2015"/>
            <abstract>
              <t>I-JSON (short for "Internet JSON") is a restricted profile of JSON designed to maximize interoperability and increase confidence that software can process it successfully with predictable results.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7493"/>
          <seriesInfo name="DOI" value="10.17487/RFC7493"/>
        </reference>
        <reference anchor="JSON-Text-Sequences">
          <front>
            <title>JavaScript Object Notation (JSON) Text Sequences</title>
            <author fullname="N. Williams" initials="N." surname="Williams"/>
            <date month="February" year="2015"/>
            <abstract>
              <t>This document describes the JavaScript Object Notation (JSON) text sequence format and associated media type "application/json-seq". A JSON text sequence consists of any number of JSON texts, all encoded in UTF-8, each prefixed by an ASCII Record Separator (0x1E), and each ending with an ASCII Line Feed character (0x0A).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7464"/>
          <seriesInfo name="DOI" value="10.17487/RFC7464"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <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="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="CDDL">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="C. Vigano" initials="C." surname="Vigano"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2019"/>
            <abstract>
              <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <reference anchor="RFC7464">
          <front>
            <title>JavaScript Object Notation (JSON) Text Sequences</title>
            <author fullname="N. Williams" initials="N." surname="Williams"/>
            <date month="February" year="2015"/>
            <abstract>
              <t>This document describes the JavaScript Object Notation (JSON) text sequence format and associated media type "application/json-seq". A JSON text sequence consists of any number of JSON texts, all encoded in UTF-8, each prefixed by an ASCII Record Separator (0x1E), and each ending with an ASCII Line Feed character (0x0A).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7464"/>
          <seriesInfo name="DOI" value="10.17487/RFC7464"/>
        </reference>
        <reference anchor="RFC6839">
          <front>
            <title>Additional Media Type Structured Syntax Suffixes</title>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <author fullname="A. Melnikov" initials="A." surname="Melnikov"/>
            <date month="January" year="2013"/>
            <abstract>
              <t>A content media type name sometimes includes partitioned meta- information distinguished by a structured syntax to permit noting an attribute of the media as a suffix to the name. This document defines several structured syntax suffixes for use with media type registrations. In particular, it defines and registers the "+json", "+ber", "+der", "+fastinfoset", "+wbxml" and "+zip" structured syntax suffixes, and provides a media type structured syntax suffix registration form for the "+xml" structured syntax suffix. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6839"/>
          <seriesInfo name="DOI" value="10.17487/RFC6839"/>
        </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"/>
            <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="RFC8091">
          <front>
            <title>A Media Type Structured Syntax Suffix for JSON Text Sequences</title>
            <author fullname="E. Wilde" initials="E." surname="Wilde"/>
            <date month="February" year="2017"/>
            <abstract>
              <t>Structured syntax suffixes for media types allow other media types to build on them and make it explicit that they are built on an existing media type as their foundation. This specification defines and registers "+json-seq" as a structured syntax suffix for JSON text sequences.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8091"/>
          <seriesInfo name="DOI" value="10.17487/RFC8091"/>
        </reference>
        <reference anchor="RFC9000">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="RFC6973">
          <front>
            <title>Privacy Considerations for Internet Protocols</title>
            <author fullname="A. Cooper" initials="A." surname="Cooper"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <author fullname="B. Aboba" initials="B." surname="Aboba"/>
            <author fullname="J. Peterson" initials="J." surname="Peterson"/>
            <author fullname="J. Morris" initials="J." surname="Morris"/>
            <author fullname="M. Hansen" initials="M." surname="Hansen"/>
            <author fullname="R. Smith" initials="R." surname="Smith"/>
            <date month="July" year="2013"/>
            <abstract>
              <t>This document offers guidance for developing privacy considerations for inclusion in protocol specifications. It aims to make designers, implementers, and users of Internet protocols aware of privacy-related design choices. It suggests that whether any individual RFC warrants a specific privacy considerations section will depend on the document's content.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6973"/>
          <seriesInfo name="DOI" value="10.17487/RFC6973"/>
        </reference>
        <reference anchor="DNS-PRIVACY">
          <front>
            <title>Recommendations for DNS Privacy Service Operators</title>
            <author fullname="S. Dickinson" initials="S." surname="Dickinson"/>
            <author fullname="B. Overeinder" initials="B." surname="Overeinder"/>
            <author fullname="R. van Rijswijk-Deij" initials="R." surname="van Rijswijk-Deij"/>
            <author fullname="A. Mankin" initials="A." surname="Mankin"/>
            <date month="October" year="2020"/>
            <abstract>
              <t>This document presents operational, policy, and security considerations for DNS recursive resolver operators who choose to offer DNS privacy services. With these recommendations, the operator can make deliberate decisions regarding which services to provide, as well as understanding how those decisions and the alternatives impact the privacy of users.</t>
              <t>This document also presents a non-normative framework to assist writers of a Recursive operator Privacy Statement, analogous to DNS Security Extensions (DNSSEC) Policies and DNSSEC Practice Statements described in RFC 6841.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="232"/>
          <seriesInfo name="RFC" value="8932"/>
          <seriesInfo name="DOI" value="10.17487/RFC8932"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="QLOG-QUIC">
          <front>
            <title>QUIC event definitions for qlog</title>
            <author fullname="Robin Marx" initials="R." surname="Marx">
              <organization>Akamai</organization>
            </author>
            <author fullname="Luca Niccolini" initials="L." surname="Niccolini">
              <organization>Meta</organization>
            </author>
            <author fullname="Marten Seemann" initials="M." surname="Seemann">
              <organization>Protocol Labs</organization>
            </author>
            <author fullname="Lucas Pardue" initials="L." surname="Pardue">
              <organization>Cloudflare</organization>
            </author>
            <date day="23" month="October" year="2023"/>
            <abstract>
              <t>   This document describes concrete qlog event definitions and their
   metadata for QUIC events.  These events can then be embedded in the
   higher level schema defined in [QLOG-MAIN].

Note to Readers

      Note to RFC editor: Please remove this section before publication.

   Feedback and discussion are welcome at https://github.com/quicwg/qlog
   (https://github.com/quicwg/qlog).  Readers are advised to refer to
   the "editor's draft" at that URL for an up-to-date version of this
   document.

   Concrete examples of integrations of this schema in various
   programming languages can be found at https://github.com/quiclog/
   qlog/ (https://github.com/quiclog/qlog/).

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-quic-events-06"/>
        </reference>
        <reference anchor="QLOG-H3">
          <front>
            <title>HTTP/3 qlog event definitions</title>
            <author fullname="Robin Marx" initials="R." surname="Marx">
              <organization>Akamai</organization>
            </author>
            <author fullname="Luca Niccolini" initials="L." surname="Niccolini">
              <organization>Meta</organization>
            </author>
            <author fullname="Marten Seemann" initials="M." surname="Seemann">
              <organization>Protocol Labs</organization>
            </author>
            <author fullname="Lucas Pardue" initials="L." surname="Pardue">
              <organization>Cloudflare</organization>
            </author>
            <date day="5" month="January" year="2024"/>
            <abstract>
              <t>   This document describes concrete qlog event definitions and their
   metadata for HTTP/3-related events.  These events can then be
   embedded in the higher level schema defined in [QLOG-MAIN].

Note to Readers

      Note to RFC editor: Please remove this section before publication.

   Feedback and discussion are welcome at https://github.com/quicwg/qlog
   (https://github.com/quicwg/qlog).  Readers are advised to refer to
   the "editor's draft" at that URL for an up-to-date version of this
   document.

   Concrete examples of integrations of this schema in various
   programming languages can be found at https://github.com/quiclog/
   qlog/ (https://github.com/quiclog/qlog/).

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-h3-events-06"/>
        </reference>
        <reference anchor="ANRW-2020" target="https://qlog.edm.uhasselt.be/anrw/">
          <front>
            <title>Debugging QUIC and HTTP/3 with qlog and qvis</title>
            <author initials="R." surname="Marx" fullname="Robin Marx">
              <organization/>
            </author>
            <author initials="M." surname="Piraux" fullname="Maxime Piraux">
              <organization/>
            </author>
            <author initials="P." surname="Quax" fullname="Peter Quax">
              <organization/>
            </author>
            <author initials="W." surname="Lamotte" fullname="Wim Lamotte">
              <organization/>
            </author>
            <date year="2020" month="September"/>
          </front>
        </reference>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="RFC8546">
          <front>
            <title>The Wire Image of a Network Protocol</title>
            <author fullname="B. Trammell" initials="B." surname="Trammell"/>
            <author fullname="M. Kuehlewind" initials="M." surname="Kuehlewind"/>
            <date month="April" year="2019"/>
            <abstract>
              <t>This document defines the wire image, an abstraction of the information available to an on-path non-participant in a networking protocol. This abstraction is intended to shed light on the implications that increased encryption has for network functions that use the wire image.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8546"/>
          <seriesInfo name="DOI" value="10.17487/RFC8546"/>
        </reference>
      </references>
    </references>
    <section numbered="false" anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>Much of the initial work by Robin Marx was done at the Hasselt and KU Leuven
Universities.</t>
      <t>Thanks to Jana Iyengar, Brian Trammell, Dmitri Tikhonov, Stephen Petrides, Jari
Arkko, Marcus Ihlar, Victor Vasiliev, Mirja Kuehlewind, and Jeremy Laine for
their feedback and suggestions.</t>
    </section>
    <section numbered="false" removeInRFC="true" anchor="change-log">
      <name>Change Log</name>
      <section numbered="false" anchor="since-draft-ietf-quic-qlog-main-schema-07">
        <name>Since draft-ietf-quic-qlog-main-schema-07:</name>
        <ul spacing="normal">
          <li>Added path and PathID (#336)</li>
          <li>Removed custom definition of uint64 type (#360, #388)</li>
          <li>ProtocolEventBody is now called ProtocolEventData (#352)</li>
          <li>Editorial changes (#364, #289, #353, #361, #362)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-quic-qlog-main-schema-06">
        <name>Since draft-ietf-quic-qlog-main-schema-06:</name>
        <ul spacing="normal">
          <li>Editorial reworking of the document (#331, #332)</li>
          <li>Updated IANA considerations section (#333)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-quic-qlog-main-schema-05">
        <name>Since draft-ietf-quic-qlog-main-schema-05:</name>
        <ul spacing="normal">
          <li>Updated qlog_version to 0.4 (due to breaking changes) (#314)</li>
          <li>Renamed 'transport' category to 'quic' (#302)</li>
          <li>Added 'system_info' field (#305)</li>
          <li>Removed 'summary' and 'configuration' fields (#308)</li>
          <li>Editorial and formatting changes (#298, #303, #304, #316, #320, #321, #322, #326, #328)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-quic-qlog-main-schema-04">
        <name>Since draft-ietf-quic-qlog-main-schema-04:</name>
        <ul spacing="normal">
          <li>Updated RawInfo definition and guidance (#243)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-quic-qlog-main-schema-03">
        <name>Since draft-ietf-quic-qlog-main-schema-03:</name>
        <ul spacing="normal">
          <li>Added security and privacy considerations discussion (#252)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-quic-qlog-main-schema-02">
        <name>Since draft-ietf-quic-qlog-main-schema-02:</name>
        <ul spacing="normal">
          <li>No changes - new draft to prevent expiration</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-quic-qlog-main-schema-01">
        <name>Since draft-ietf-quic-qlog-main-schema-01:</name>
        <ul spacing="normal">
          <li>Change the data definition language from TypeScript to CDDL (#143)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-quic-qlog-main-schema-00">
        <name>Since draft-ietf-quic-qlog-main-schema-00:</name>
        <ul spacing="normal">
          <li>Changed the streaming serialization format from NDJSON to JSON Text Sequences
(#172)</li>
          <li>Added Media Type definitions for various qlog formats (#158)</li>
          <li>Changed to semantic versioning</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-marx-qlog-main-schema-draft-02">
        <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 numbered="false" anchor="since-draft-marx-qlog-main-schema-01">
        <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 numbered="false" anchor="since-draft-marx-qlog-main-schema-00">
        <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>
  </back>
  <!-- ##markdown-source:
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
VoxXeDRtMt5DHKDjbWMOWVYIG9xEASONRVz4UpNaI0+H76tZXyvAIfqdcGHv
5ujmft+lP33N8Lxg5x74TYgKkXO5sqJWi7gvrkXnp1i2KkIVNmULsvnuZe3Y
PPodT4zuD1HLE6tbwXo39JSLE1SD+gUauNWDqkkgIlK50TQwOT+2wdg4/UiX
ZKSz0mIuimo6r0nhk8I3ieVm95Iv/Uy6NheORcNk/dpjc0HsVnvj3WoKwq9I
DLvWHhGZTvkiBnnDFHE1CNn5/o3H+FvPYyt9Ew34t95QNX0uxSRVwfz1jpX7
+MKU2/4Ftvj5wC9WeAibZEVJbmfZNhy8qF6PXSa5BNWYVRsadnI6OANdliQS
za+2v7nU/vZKUhR9UL+sT7IyAQMu1tKp3ESCQNYjSkcgBm9xvdV8fU7sA+c1
zd5um/nfDjMpIRGqRzD9WHEVShQlYlufYwLenQzFy3TbXCP0Uv1/PhCPLSwq
SbaVKyQpMl+31cKKYpTT3GcXdSLEJRbUJxpLqgwnuckMBhKTuaLJSy2bpTbq
t2q6cBpF0XSjazu27GFSngqzbwFOWMUG5UMGcv6LfBXX7VPcRHklXnpiotf5
to+3awl120eWHUThOzJO5M/pOjt+awUT/Pl2Dbpa4ljCbxl1QNlZbBvR68+K
y+0lfCtuKXh1jrIDeuqa//mnjj/1FAybXzLIM3pmNzx2LdITKzOVMiCYxkRW
oe3hUuMQtKLVGhm7GWlxay6kC5kqJuG53PWUGgfXKBfvYwWVJ4dmGpuIfel8
qbNyFrvv/pDZmOW/kh4odcn4FwmCHmlxlh+lGpO8MkNcXjP66ZvsT0R+v8df
P3fxpbdqqzeQ9rcNbWyy4LzNRdmyhkqK+K6nxkSzLstpe6EDISLGs9Uo0jVv
fKRMtBuYw4/vHaqZWmO602BMedjCZ45evnoVBy/qz2J35dFOkowYAQOCOP07
V8ke5Ak/vqgz0Qz8jFRvw/CHh4ed36SKD/126/Yd/8vH/pdNt4KAsDzvhRf5
01bqjuKMN5Qr3qkn4iZ+vql0JMLFCBUFE5XTwpNLnBZu3cBpY6+iqYIdedkn
M/TiBONetrdu1lIOEE4UUrycBCn0gxCtguKtQbvWhcehNVLLRkoIIVmTS/px
1VZx6mMay6oPNoSZ6CiRuphz7MNSlA4R36aILhGF3VxXVmMpCizaMts9TtQV
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
WSTV2LPO/T/Ok/wbOg0BAA==

-->

</rfc>
