<?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.7.1 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-kll-yang-label-tsdb-00" category="std" consensus="true" submissionType="IETF" xml:lang="en" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.18.2 -->
  <front>
    <title abbrev="yang-label-tsdb">Mapping YANG Data to Label-Set Time Series</title>
    <seriesInfo name="Internet-Draft" value="draft-kll-yang-label-tsdb-00"/>
    <author initials="K." surname="Larsson" fullname="Kristian Larsson">
      <organization>Deutsche Telekom</organization>
      <address>
        <email>kristian@spritelink.net</email>
      </address>
    </author>
    <date year="2023" month="October" day="18"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 30?>

<t>This document proposes a standardized approach for representing YANG-modeled configuration and state data, for storage in Time Series Databases (TSDBs) that identify time series using a label-set. It outlines procedures for translating YANG data representations to fit within the label-centric structures of TSDBs and vice versa. This mapping ensures clear and efficient storage and querying of YANG-modeled data in TSDBs.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/plajjan/draft-kll-yang-label-tsdb"/>.</t>
    </note>
  </front>
  <middle>
    <?line 34?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The aim of this document is to define rules for representing configuration and state data defined using the YANG data modeling language <xref target="RFC7950"/> as time series using a label-centric model.</t>
      <t>The majority of modern Time Series Databases (TSDBs) employ a label-centric model. In this structure, time series are identified by a set of labels, each consisting of a key-value pair. These labels facilitate efficient querying, aggregation, and filtering of data over time intervals. Such a model contrasts with the hierarchical nature of YANG-modeled data. The challenge, therefore, lies in ensuring that YANG-defined data, with its inherent structure and depth, can be seamlessly integrated into the flat, label-based structure of most contemporary TSDBs.</t>
      <t>This document seeks to bridge this structural gap, laying out rules and guidelines to ensure that YANG-modeled configuration and state data can be effectively stored, queried, and analyzed within label-centric TSDBs.</t>
    </section>
    <section anchor="specification-of-the-mapping-procedure">
      <name>Specification of the Mapping Procedure</name>
      <t>Instances of YANG data nodes are mapped to metrics. Only nodes that carry a value are mapped. This includes leafs and presence containers. The hierarchical path to a value, including non-presence containers and lists, form the path that is used as the name of the metric. The path is formed by joining YANG data nodes using <tt>_</tt>. Special symbols, e.g. <tt>-</tt>, in node names are replaced with <tt>_</tt>.</t>
      <t>List keys are mapped into labels. The path to the list key is transformed in the same way as the primary name of the metric. Compound keys have each key part as a separate label.</t>
      <section anchor="example-packet-counters-in-ietf-interfaces-model">
        <name>Example: Packet Counters in IETF Interfaces Model</name>
        <t>Consider the <tt>in-unicast-pkts</tt> leaf from the IETF interfaces model that captures the number of incoming unicast packets on an interface:</t>
        <t>Original YANG Instance-Identifier:
<tt>yang
/interfaces/interface[name='eth0']/statistics/in-unicast-pkts
</tt></t>
        <t>Following the mapping rules defined:</t>
        <ol spacing="normal" type="1"><li>
            <t>The path components, including containers and list names, are transformed into the metric name by joining the node names with <tt>_</tt>. Special symbols, e.g. <tt>-</tt> are replaced with <tt>_</tt>.</t>
          </li>
        </ol>
        <t>Resulting Metric Name:
<tt>
interfaces_interface_statistics_in_unicast_pkts
</tt></t>
        <ol spacing="normal" type="1"><li>
            <t>The list key "predicate", which in this case is the interface name (<tt>eth0</tt>), is extracted and stored as a separate label. The label key represents the complete path to the key.</t>
          </li>
        </ol>
        <t>Resulting Label:
<tt>
interfaces_interface_name = eth0
</tt></t>
        <ol spacing="normal" type="1"><li>
            <t>The leaf value, which represents the actual packet counter, remains unchanged and is directly mapped to the value in the time series database.</t>
          </li>
        </ol>
        <t>For instance, if the packet counter reads <tt>5,432,100</tt> packets:</t>
        <t>Value:
<tt>
5432100
</tt></t>
        <ol spacing="normal" type="1"><li>
            <t>As part of the standard labels, a server identification string is also included. A typical choice of identifier might be the hostname. For this example, let's assume the device name is <tt>router-01</tt>:</t>
          </li>
        </ol>
        <t>Label:
<tt>
host = router-01
</tt></t>
        <t>Final Mapping in the TSDB:</t>
        <ul spacing="normal">
          <li>
            <t>Metric: <tt>interfaces_interface_statistics_in_unicast_pkts</tt></t>
          </li>
          <li>
            <t>Value: <tt>5432100</tt></t>
          </li>
          <li>
            <t>Labels:
            </t>
            <ul spacing="normal">
              <li>
                <t><tt>host</tt> = <tt>router-01</tt></t>
              </li>
              <li>
                <t><tt>interfaces_interface_name</tt> = <tt>eth0</tt></t>
              </li>
            </ul>
          </li>
        </ul>
      </section>
      <section anchor="mapping-values">
        <name>Mapping values</name>
        <t>Leaf values are mapped based on their intrinsic type:</t>
        <ul spacing="normal">
          <li>
            <t>All integer types are mapped to integers and retain their native representation
            </t>
            <ul spacing="normal">
              <li>
                <t>some implementations only support floats for numeric values</t>
              </li>
            </ul>
          </li>
          <li>
            <t>decimal64 values are mapped to floats and the value should be rounded and truncated as to minimize the loss of information</t>
          </li>
          <li>
            <t>Enumeration types are mapped using their string representation.</t>
          </li>
          <li>
            <t>String types remain unchanged.</t>
          </li>
        </ul>
      </section>
      <section anchor="choice">
        <name>Choice</name>
        <t>Choice constructs from YANG are disregarded and not enforced during the mapping process. Given the temporal nature of TSDBs, where data spans across time, different choice branches could be active in a single data set, rendering validation and storage restrictions impractical.</t>
      </section>
      <section anchor="host-device-name">
        <name>Host / device name</name>
        <t>There is an implicit <tt>host</tt> label identifying the server, typically set to the name of the host originating the time series data.</t>
        <t>Instance data retrieved from YANG-based servers do not generally identify the server it originates from. As a time series database is likely going to contain data from multiple servers, the <tt>host</tt> label is used to identify the source of the data.</t>
      </section>
    </section>
    <section anchor="querying-yang-modeled-time-series-data">
      <name>Querying YANG modeled time series data</name>
      <t>The process of storing YANG-modeled data in label-centric TSDBs, as defined in the previous sections, inherently structures the data in a way that leverages the querying capabilities of modern TSDBs. This chapter provides guidelines on how to construct queries to retrieve this data effectively.</t>
      <section anchor="basic-queries">
        <name>1. <strong>Basic Queries</strong></name>
        <t>To retrieve all data points related to incoming unicast packets from the IETF interfaces model:</t>
        <ul spacing="normal">
          <li>
            <t><strong>InfluxQL</strong>:
<tt>sql
SELECT * FROM interfaces_interface_statistics_in_unicast_pkts
</tt></t>
          </li>
          <li>
            <t><strong>PromQL</strong>:
<tt>promql
interfaces_interface_statistics_in_unicast_pkts
</tt></t>
          </li>
        </ul>
      </section>
      <section anchor="filtering-by-labels">
        <name>2. <strong>Filtering by Labels</strong></name>
        <t>To retrieve incoming unicast packets specifically for the interface <tt>eth0</tt>:</t>
        <ul spacing="normal">
          <li>
            <t><strong>InfluxQL</strong>:
<tt>sql
SELECT * FROM interfaces_interface_statistics_in_unicast_pkts WHERE interfaces_interface_name = 'eth0'
</tt></t>
          </li>
          <li>
            <t><strong>PromQL</strong>:
<tt>promql
interfaces_interface_statistics_in_unicast_pkts{interfaces_interface_name="eth0"}
</tt></t>
          </li>
        </ul>
        <t>Similarly, to filter by device / host name:</t>
        <ul spacing="normal">
          <li>
            <t><strong>InfluxQL</strong>:
<tt>sql
SELECT * FROM interfaces_interface_statistics_in_unicast_pkts WHERE host = 'router-01'
</tt></t>
          </li>
          <li>
            <t><strong>PromQL</strong>:
<tt>promql
interfaces_interface_statistics_in_unicast_pkts{host="router-01"}
</tt></t>
          </li>
        </ul>
      </section>
      <section anchor="time-based-queries">
        <name>3. <strong>Time-based Queries</strong></name>
        <ul spacing="normal">
          <li>
            <t><strong>InfluxQL</strong>:
<tt>sql
SELECT * FROM interfaces_interface_statistics_in_unicast_pkts WHERE time &gt; now() - 24h
</tt></t>
          </li>
        </ul>
        <t>Prometheus fetches data based on the configured scrape interval and retention policies, so time-based filters in PromQL often center around the range vectors. For data over the last 24 hours:</t>
        <ul spacing="normal">
          <li>
            <t><strong>PromQL</strong>:
<tt>promql
interfaces_interface_statistics_in_unicast_pkts[24h]
</tt></t>
          </li>
        </ul>
      </section>
      <section anchor="aggregations">
        <name>4. <strong>Aggregations</strong></name>
        <t>To get the average number of incoming unicast packets over the last hour:</t>
        <ul spacing="normal">
          <li>
            <t><strong>InfluxQL</strong>:
<tt>sql
SELECT MEAN(value) FROM interfaces_interface_statistics_in_unicast_pkts WHERE time &gt; now() - 1h GROUP BY time(10m)
</tt></t>
          </li>
          <li>
            <t><strong>PromQL</strong>:
<tt>promql
avg_over_time(interfaces_interface_statistics_in_unicast_pkts[1h])
</tt></t>
          </li>
        </ul>
      </section>
      <section anchor="combining-filters">
        <name>5. <strong>Combining Filters</strong></name>
        <t>To retrieve the sum of incoming unicast packets for <tt>eth0</tt> on <tt>router-01</tt> over the last day:</t>
        <ul spacing="normal">
          <li>
            <t><strong>InfluxQL</strong>:
<tt>sql
SELECT SUM(value) FROM interfaces_interface_statistics_in_unicast_pkts WHERE interfaces_interface_name = 'eth0' AND host = 'router-01' AND time &gt; now() - 24h
</tt></t>
          </li>
          <li>
            <t><strong>PromQL</strong>:
<tt>promql
sum(interfaces_interface_statistics_in_unicast_pkts{interfaces_interface_name="eth0", host="router-01"})[24h]
</tt></t>
          </li>
        </ul>
      </section>
      <section anchor="querying-enumeration-types">
        <name>6. <strong>Querying Enumeration Types</strong></name>
        <t>In YANG models, enumerations are defined types with a set of named values. The <tt>oper-status</tt> leaf in the IETF interfaces model is an example of such an enumeration, representing the operational status of an interface.</t>
        <t>For instance, the <tt>oper-status</tt> might have values such as <tt>up</tt>, <tt>down</tt>, or <tt>testing</tt>.</t>
        <t>To query interfaces that have an <tt>oper-status</tt> of <tt>up</tt>:</t>
        <ul spacing="normal">
          <li>
            <t><strong>InfluxQL</strong>:
<tt>sql
SELECT * FROM interfaces_interface_oper_status WHERE value = 'up'
</tt></t>
          </li>
          <li>
            <t><strong>PromQL</strong>:
<tt>promql
interfaces_interface_oper_status{value="up"}
</tt></t>
          </li>
        </ul>
        <t>Similarly, to filter interfaces with <tt>oper-status</tt> of <tt>down</tt>:</t>
        <ul spacing="normal">
          <li>
            <t><strong>InfluxQL</strong>:
<tt>sql
SELECT * FROM interfaces_interface_oper_status WHERE value = 'down'
</tt></t>
          </li>
          <li>
            <t><strong>PromQL</strong>:
<tt>promql
interfaces_interface_oper_status{value="down"}
</tt></t>
          </li>
        </ul>
        <t>This approach allows us to effectively query interfaces based on their operational status, leveraging the enumeration mapping within the TSDB.</t>
      </section>
    </section>
    <section anchor="requirements-on-time-series-databases">
      <name>Requirements on time series databases</name>
      <t>This document specifies a mapping to a conceptual representation, not a particular concrete interface. To effectively support the mapping of YANG-modeled data into a label-centric model, certain requirements must be met by the Time Series Databases (TSDBs). These requirements ensure that the data is stored and retrieved in a consistent and efficient manner.</t>
      <section anchor="support-for-string-values">
        <name>Support for String Values</name>
        <t>Several YANG leaf types carry string values, including the <tt>string</tt> type itself and all its descendants as well as enumerations which are saved using their string representation.</t>
        <t>The chosen TSDB must support the storage and querying of string values. Not all TSDBs inherently offer this capability, and thus, it's imperative to ensure compatibility.</t>
      </section>
      <section anchor="sufficient-path-length">
        <name>Sufficient Path Length</name>
        <t>YANG data nodes, especially when representing deep hierarchical structures, can result in long paths. When transformed into metric names or labels within the TSDB, these paths might exceed typical character limits imposed by some databases. It's essential for the TSDB to accommodate these potentially long names to ensure data fidelity and avoid truncation or loss of information.</t>
      </section>
      <section anchor="high-cardinality">
        <name>High Cardinality</name>
        <t>Given the possibility of numerous unique label combinations (especially with dynamic values like interface names, device names, etc.), the chosen TSDB should handle high cardinality efficiently. High cardinality can impact database performance and query times, so it's essential for the TSDB to have mechanisms to manage this efficiently.</t>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <reference anchor="RFC7950" target="https://www.rfc-editor.org/info/rfc7950" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7950.xml">
        <front>
          <title>The YANG 1.1 Data Modeling Language</title>
          <author fullname="M. Bjorklund" initials="M." role="editor" surname="Bjorklund"/>
          <date month="August" year="2016"/>
          <abstract>
            <t>YANG is a data modeling language used to model configuration data, state data, Remote Procedure Calls, and notifications for network management protocols. This document describes the syntax and semantics of version 1.1 of the YANG language. YANG version 1.1 is a maintenance release of the YANG language, addressing ambiguities and defects in the original specification. There are a small number of backward incompatibilities from YANG version 1. This document also specifies the YANG mappings to the Network Configuration Protocol (NETCONF).</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="7950"/>
        <seriesInfo name="DOI" value="10.17487/RFC7950"/>
      </reference>
    </references>
  </back>
  <!-- ##markdown-source:
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
hkqG2brW7V9CDOXJ/gcwaSd6lScAAA==

-->

</rfc>
