<?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.11 (Ruby 3.2.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-lindblad-tlm-philatelist-01" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.21.0 -->
  <front>
    <title abbrev="Philatelist">Philatelist, YANG-based Network Controller collection and aggregation framework integrating Telemetry data and Time Series Databases</title>
    <seriesInfo name="Internet-Draft" value="draft-lindblad-tlm-philatelist-01"/>
    <author fullname="Jan Lindblad">
      <organization>Cisco</organization>
      <address>
        <email>jlindbla@cisco.com</email>
      </address>
    </author>
    <date year="2024" month="May" day="07"/>
    <area>OPS</area>
    <workgroup>NETMOD</workgroup>
    <keyword>YANG</keyword>
    <keyword>telemetry</keyword>
    <keyword>collection</keyword>
    <keyword>aggregation</keyword>
    <keyword>time series database</keyword>
    <keyword>TSDB</keyword>
    <abstract>
      <?line 46?>

<t>Timestamped telemetry data is collected en masse today.  Mature tools are typically used, but the data is often collected in an ad hoc manner.  While the dashboard graphs look great, the resulting data is often of questionable quality, not well defined, and hard to compare with seemingly similar data from other organizations.</t>
      <t>This document proposes a standard, extensible, cross domain framework for collecting and aggregating timestamped telemetry data in a way that combines YANG, metadata and Time Series Databases to produce more transparent, dependable and comparable results.  This framework is implemented in the Network Controller layer, but is rooted in data that is collected from all kinds of Network Elements and related systems.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://janlindblad.github.io/netmod-tlm-philatelist/draft-lindblad-tlm-philatelist.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-lindblad-tlm-philatelist/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/janlindblad/netmod-tlm-philatelist"/>.</t>
    </note>
  </front>
  <middle>
    <?line 52?>

<section anchor="introduction">
      <name>Introduction</name>
      <section anchor="the-problem">
        <name>The Problem</name>
        <t>Many organizations today are collecting large amounts of telemetry data from their networks and data centers for a variety of purposes.  Much (most?) of this data is funneled into a Time Series Database (TSDB) for display in a graphical dashboard or further (AI-backed) processing and decision making.</t>
        <t>While this data collection is often handled using existing and stable tools, there generally seems to be little commonality when it comes to what is meaured, how the data is aggregated, or definitions of the measured quantities (if any).</t>
        <t>Data science issues like adding overlapping quantities, adding quantities of different units of measurement, or quantities with different scopes, are likely common.  Such errors are hard to detect given the ad hoc nature of the collection.  This often leads to uncertainty regarding the quality of the conclusions drawn from the collected data.</t>
      </section>
      <section anchor="the-solution">
        <name>The Solution</name>
        <t>The Philatelist framework proposes to standardize the collection, definitions of the quantities measured and meta data handling to provide a robust ground layer for telemetry collection.  The architecture defines a few interfaces, but allows great freedom in the implementations with its plug-in architecture.  This allows flexibility enough that any kind of quantitiy can be measured, any kind of collection protocol and mechanism employed, and the telemetry data flows aggregated using any kind of operation.</t>
        <t>To do this, YANG is used both to describe the quantities being measured, as well as act as the framework for the metadata management.  Note that the use of YANG here does not limit the architecture to devices supporting traditional YANG-based transport protocols.  YANG is used to describe the data, regardless of which format it arrives in.</t>
        <t>Initially developed in context of the Power and Energy Efficiency work (POWEFF), the authors realized both the potential and the need for this collection and aggregation architecture to become a general framework for collection of a variety of metrics.</t>
        <t>There is not much point in knowing the "cost side" of a running system (as in energy consumption or CO2e-emissions) if that cannot be weighed against the "value side" delivered by the system (as in transported bytes, VPN connections, music streaming hours, or number of cat videos, etc.), which means traditional performance metrics will play an equally important role in the collection.</t>
      </section>
      <section anchor="the-philatelist-name">
        <name>The Philatelist Name</name>
        <t>This specification is about a framework for collection, aggregation and interpretation of timestamped telemetry data.  The definition of "philatelist" seems close enough.</t>
        <figure>
          <name>Source: https://www.synonym.com/synonyms/philatelist</name>
          <artwork><![CDATA[
1. philatelist

noun. ['fɪˈlætəlɪst'] a collector and student of postage stamps.

Synonyms
- collector
- aggregator

]]></artwork>
        </figure>
      </section>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</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>
      <?line -18?>

<t>This document uses the terminology defined in
<xref target="RFC7950"/>.</t>
      <t>In addition, this document defines the following terms:</t>
      <dl>
        <dt>TSDB</dt>
        <dd>
          <t>Time Series Database.</t>
        </dd>
        <dt>Sensor</dt>
        <dd>
          <t>An entity in a system that delivers a snapshot value of some quantity pertaining to the system.  Sensors are identified by their Sensor Path.</t>
        </dd>
        <dt>Sensor Path</dt>
        <dd>
          <t>A textual representation of the sensor's address within the system.</t>
        </dd>
      </dl>
    </section>
    <section anchor="architecure-overview">
      <name>Architecure Overview</name>
      <section anchor="functional-role-diagram">
        <name>Functional Role Diagram</name>
        <t>The following role diagram explains the basic concepts of the architecture. Many of the functional units would exist in many instances in a real deployment. For example, in a real deployment there would be lots of Network Elements with the Provider role.</t>
        <t>On top we have a Network Orchestrator that ensures the Network Controller functions get a suitable configuration. The Collector, Index and Aggregator functions run as part of one or more Network Controllers. Collectors and Aggregators are responsible for ensuring there is a TSDB Partition (also known as bucket, interval, segment, etc. in various TSDB implementations) to receive the potentially large volumes of telemetry data that they produce themselves, or in the case of the Collector, may configure a Provider Network Element to send the collected data to the TSDB, or to the Collector itself, which then passes it on to the TSDB.</t>
        <figure>
          <name>Philatelist Functional Role Diagram.</name>
          <artwork><![CDATA[
                    +--------------+
                    |   Network    |
                    | Orchestrator |
                    +------+-------+
                           |
       +-------------------+-------------------+
       v                   v                   v
+--------------+    +--------------+    +--------------+
|  *Collector* |    |   *Index*    |    | *Aggregator* |
|   Network    |--->|   Network    |<---|   Network    |
|  Controller  |    |  Controller  |    |  Controller  |
+--------------+    +--------------+    +--------------+
       |   /\  \\                :                  /\
       |   ||    \\              :                  ||
       v   ||      \\          ____________         ||
+--------------+     \\       /            \       //
|  *Provider*  |       ====> (     TSDB     ) <====
|   Network    | ==========> |\____________/|
|   Element    | ==========> |              |
+--------------+             | *Partition*  |
                             |              |
                              \____________/

]]></artwork>
        </figure>
        <t>In the figure, single line arrows indicate control/configuration flow.
Double line arrows indicate telemetry data flow. The dotted line
between the Index and the TSDB indicates that the index reflects the TSDB
partition contents.</t>
      </section>
      <section anchor="dashboards">
        <name>Dashboards</name>
        <t>In addition to the functional roles, there is a concept of Dashboards, which is used both within Providers and Collectors. A Dashboard is a particular collection of sensors and controls that have been predefined for particular use cases.  Network Elements may implement and publish one or more of these predefined Dashboards, and Controllers may know how to interpret one or more of them. Dashboards contain one or more dashboard items, each one a sensor or control.</t>
        <t>For example, a particular Network Element might publish two dashboards. One Dashboard might be called "Current Power Draw" and contain only a single dashboard item which allows the Controller to read out the Network Element's total power draw at this instance. The second Dashboard might be called "Subsystem Power" and contain a tree of dashboard items, which allows the Controller to read out the current power draw of the Network Element's various subsystems.  The contents of each Dashboard is defined as a YANG structure in some standards document, or might be a vendor specific YANG definition.</t>
        <t>A key point of this architecture is that Dashboard descriptions (in YANG) can be provided also for Network Elements that offer no YANG-based management interfaces at all, or for Network Elements hosting a YANG-based interface, but that were released prior to this document being written.</t>
      </section>
      <section anchor="collection-data-flow-tree-diagram">
        <name>Collection Data Flow Tree Diagram</name>
        <t>The deployment of a Philatelist framework consists of a collection of Controller plug-in components with well defined interfaces.  Here is an example of a deployment.  Each box is numbered in the lower right for easy reference.</t>
        <figure>
          <name>Example Philatelist component deployment.</name>
          <artwork><![CDATA[
                      +-----------------+
                      | USER INTERFACE  |
                      |   Graph View    |
                      +--------------11-+
                               |
                      +-----------------+
                      |    PROCESSOR    |
                      | Recommendation  |
                      |     Engine      |
                      +--------------21-+
                               |
                      +-----------------+
                      |   AGGREGATOR    |
                      |   Data Center   |
                      +--------------31-+
                               |
       +---------------+-------+-------+--------------+
       |               |               |              |
+------------+  +------------+  +------------+  +------------+
| PROCESSOR  |  | AGGREGATOR |  | AGGREGATOR |  | AGGREGATOR |
| Normalizer |  |  Network   |  |  Storage   |  |  Compute   |
+---------41-+  +---------42-+  +---------43-+  +---------44-+
       |           |                   |\             |\
+------------+     |     +------+------------+  +------------+------+
| COLLECTOR  |     |     | YANG | COLLECTOR  |  | COLLECTOR  | YANG |
|  Cooling   |     |     +---52-+ Storage 1  |  | Compute 1  +---55-+
+---------51-+     |            +---------53-+  +---------54-+
       |           |             \ Storage 2  \  \ Compute 2  \
+------------+     |              +------------+  +------------+
|  PROVIDER  |     |               \ Storage N  \  \ Compute N  \
|Utility Bill|     |                +------------+  +------------+
+---------61-+     |
                   +--------------+
                   |              |
            +------------+  +------------+
            | PROCESSOR  |  | COLLECTOR  |
            | Normalizer |  |  Routers   |
            +---------71-+  +---------72-+
                   |              |\
            +------------+  +------------+
            | COLLECTOR  |  |  PROVIDER  |
            |  Firewall  |  |  Router 1  |
            +---------81-+  +---------82-+
                   |         \  Router 2  \
            +------------+    +------------+
            |  PROVIDER  |     \  Router N  \
            |  Firewall  |      +------------+
            +---------91-+

]]></artwork>
        </figure>
        <t>Each component in the above diagram, represents a logical function.  Many of the functions represented by these boxes could be running within a single server, or they could be fully distributed, or, perhaps more likely, something in between.</t>
        <t>Provider components (61, 82, 91) are running on a Network Element system that supports a YANG-based telemetry data server.  The telemetry data flows from the telemetry source system to a Time Series Database (TSDB).</t>
        <t>Collector components (51, 72, 81) ensure the Providers are programmed properly to deliver the telemetry data to the TSDB Partition designated by the Collector.  In some cases this flow may be direct (e.g. via a message bus) from the Provider to the TSDB, in other cases, it may be going through the Collector.  In some cases the collector may be polling the Provider, in others it may have set up an automatic, periodic subscription.</t>
        <t>Many telemetry Provider systems will not have any on-board YANG-based telemetry server.  Such servers will instead be managed by a Collector capable of handling a particular kind of Provider (53, 54).  Such a Collector is still responsible to set up a telemetry data stream to the Collector's TSDB.  In this case, the Collector will also supply a YANG description (52, 55) of the incoming data stream.</t>
        <t>Processor components (21, 41, 71) are transforming the data stream in some way, e.g. converting from one unit of measurement to another, or adjusting the data values recorded to also include some aspect that this particular sensor is not taking into account.</t>
        <t>Aggregator components (31, 42, 43, 44) combine the time series telemetry data flows using some operation, e.g. summing, averaging or computing the max or min over them.  In this example there are aggregators for Network, Storage, Compute and the entire Data Center</t>
        <t>On top of the stack, we may often find a (graphical) user interface (11), for human consumption of the intelligence acquired by the system.  Equally relevant is of course an (AI) application making decisions based on findings in the aggregated telemetry flow.</t>
      </section>
      <section anchor="the-provider-component">
        <name>The Provider Component</name>
        <t>A Provider is a Network Element that is the source of telemetry data that may or may not offer a YANG-based management interface.  Each Provider typically has a large number of "sensors" that can be polled or in some cases subscribed to. It may also offer some controls (configurables or actionables).</t>
        <t>One problem with the sensors is that the sensors relevant for a given use case are often spread around inside the Provider system, and many may not know about all of them.  Also, the metadata assciated with each sensor is often only missing or only available in human readable form (free form strings), rather than in a strict machine parsable format.</t>
        <figure>
          <name>Example of scattered potential sensors in a device.</name>
          <artwork><![CDATA[
    /hardware/component[name="psu3"]/.../sensor-data/value
    ...
    /interfaces/interface[name="eth0/0"]/.../out-broadcast-packets
    ...
    /routing/mpls/mpls-label-blocks/.../inuse-labels-count
    ...
]]></artwork>
        </figure>
        <t>To solve these problems, the Provider YANG module contains a list of Dashboards.  Each dashboard contains the sensors and controls useful for some particular use case. The contents of the Dashboards is often defined by a standard, but could also be defined in proprietary YANG modules. Each dashboard item is listed with their sensor paths and machine parsable units, definition and any other metadata.</t>
        <t>An admin user or application can then copy the sensor definition from the Dashboard and insert into the Collector's configuration with items to collect and send to the TSDB.</t>
        <figure>
          <name>YANG tree diagram of the Provider Dashboard list.</name>
          <sourcecode type="yang-tree"><![CDATA[
module: ietf-tlm-philatelist-provider
  +--rw tlm-provider
     +--rw dashboards
     |  +--rw dashboard* [id]
     |     +--rw id                       identityref
     |     +--rw items* [tsdb-path]
     |        +--rw tsdb-path             -> ../../../../dash-items/
     |                                       dash-item/tsdb-path
     +--rw dash-items
     |  +--rw dash-item* [tsdb-path]
     |     +--rw tsdb-path                string
     |     +--rw item-type                identityref
     |     +--rw accuracy
     |     |  +--rw max-error-relative?   something
     |     |  +--rw max-error-offset?     something
     |     +--rw label* [name]
     |     |  +--rw name                  string
     |     |  +--rw (value-source)?
     |     |     +--:(static-values)
     |     |     |  +--rw static-values*  string
     |     |     +--:(runtime-values)
     |     |        +--rw runtime-values* -> ../../../dash-item/
     |     |                                 tsdb-path
     |     +--rw access-path?             string
     |     +--rw access-params?           -> ../../../accesses/
                                             access/id
]]></sourcecode>
        </figure>
        <t>Note: The "something" YANG-type is used in many places in this document.  That is just a temporary placeholder we use until we have figured out what the appropriate type should be.</t>
        <t>Each Dashboard in the dashboard list has a name that is an identityref. That makes it possible to define particular dashboards with well known names and contents in YANG, so that Providers and Collectors know what to expect. Each dashboard refers to a set of dasboard items (some of which may be the same in multiple Dashboards). Each dashboard item has a type that is defined as a YANG identitity, making them maximally extensible.  Examples of sensor types might be a sensor for energy measured in kWh, or energy measured in J, or temperature measured in F, or in C, or in K.</t>
        <t>Each dashboard item has an access path and access parameters. These are a mapping into the access mechanism the Collector must use to poll or subscribe to the sensor value.</t>
        <figure>
          <name>YANG tree diagram of the Provider Accesses list.</name>
          <sourcecode type="yang-tree"><![CDATA[
module: ietf-tlm-philatelist-provider
  +--rw tlm-provider
     +--rw accesses
     |  +--rw access* [id]
     |     +--rw id                                 string
     |     +--rw method?                            identityref
     |     +--rw get-local-file-once
     |     |  +--rw filename?                       string
     |     +--rw get-static-url-once
     |     |  +--rw url?                            something
     |     +--rw gnmi-polling
     |     |  +--rw encoding?                       something
     |     |  +--rw protocol?                       something
     |     +--rw restconf-get-polling
     |     |  +--rw xxx?                            string
     |     +--rw netconf-get-polling
     |     |  +--rw xxx?                            string
     |     +--rw restconf-yang-push-subscription
     |     |  +--rw xxx?                            string
     |     +--rw netconf-yang-push-subscription
     |     |  +--rw xxx?                            string
     |     +--rw redfish-polling
     |     |  +--rw xxx?                            string
     |     +--rw frequency?                         sample-frequency
]]></sourcecode>
        </figure>
        <t>The list of access methods contains a number of YANG-based and non-YANG based access methods, but this set of access methods can also be extended by YANG-augmentation. The get-local-file-once access method allows reading fixed values from a data sheet encoded in YANG-instance data file format <xref target="RFC9195"/>, and  the get-static-url-once access method does the same from a given URL. That URL may be served from the Network Element, or from the Collector itself or anywhere else on the network or even internet.</t>
        <t>The access-path leaf discussed above (/tlm-provider/dash-items/dash-item/access-path) contains the path to the item that should be read or subscribed to. If the dash-item in question is for a YANG-based interface, then that path would be an XPath expression, with prefixes. Those prefixes need to be mapped to XML namespaces (NETCONF) or YANG module names (RESTCONF). That mapping is provided by the prefix-mappings list.</t>
        <figure>
          <name>YANG tree diagram of the Provider Prefix Mapping list.</name>
          <sourcecode type="yang-tree"><![CDATA[
module: ietf-tlm-philatelist-provider
  +--rw tlm-provider
     +--rw prefix-mappings
        +--rw prefix-mapping* [prefix]
           +--rw prefix         string
           +--rw namespace?     string
           +--rw module-name?   string
]]></sourcecode>
        </figure>
      </section>
      <section anchor="the-collector-component">
        <name>The Collector Component</name>
        <t>The Collector component is part of a Network Controller that collects telemetry data from Providers, typically by periodic polling or subscriptions, and ensures the collected data is stored in a Time Series Database (TSDB).  The actual data stream may or may not be passing through the collector component; the collector is responsible for ensuring data flows from the Provider to the destination TSDB, and that the data has a YANG description and is tagged with necessary metadata.  How the Collector agrees with a Provider to deliver data in a timely manner is beyond the scope of this document.</t>
        <figure>
          <name>Example of Collector setting up three streams of telemetry data from two Providers to one TSDB Partition.</name>
          <artwork><![CDATA[
         +-------------+
         |  COLLECTOR  |
         +-------------+                     ___________
                |                           /           \
      +------------------+                 (    TSDB     )
      v                  v                 |\___________/|
+------------+    +------------+  STREAM 1 |             |
|  PROVIDER  |    |  PROVIDER  |  =======> |             |
| - sensor 1 |    | - sensor 1 |           |  Partition  |
| - sensor 2 |    | - sensor 4 |  STREAM 2 |             |
| - sensor 3 |    | - sensor 7 |  =======> |             |
+------------+    +------------+           |             |
          \\                      STREAM 3 |             |
            =============================>  \___________/
]]></artwork>
        </figure>
        <t>The top of the Collector model contains a list of organizations, as a single Collector component might be doing collection work for different organizations (customers, departments, scopes) that must not be intermixed. Each organization has a list of device-groups pointing out specific Network Elements. Each group has a list of dashboards that will be queried. Since each Provider has a list of supported dashboards, the Collector simply copies the dashboards it is interested in to its own collection list.</t>
        <figure>
          <name>YANG tree diagram of the top part of the Collector model.</name>
          <sourcecode type="yang-tree"><![CDATA[
module: ietf-tlm-philatelist-collector
  +--rw tlm-collector
     +--rw organizations
        +--rw organization* [name]
           +--rw name                     string
           +--rw device-groups
           |  +--rw device-group* [name]
           |     +--rw name               string
           |     +--rw devices*           string
           |     +--rw dashboards
           |     |  +--rw dashboard* [id]
           |     |     +--rw id           identityref
           |     |     +--rw items* [tsdb-path]
           |     |        +--rw tsdb-path  -> ../../../../
                                              dash-items/
                                              dash-item/
                                              tsdb-path
]]></sourcecode>
        </figure>
        <t>The Collector model also contains the same dash-item list as shown above in the Provider model. This allows the Collector configuration to hold a local copy of the dashboards and dash-items it finds relevant, to guide its own collection work.</t>
        <t>Finally, the Collector keeps a list of streams to work with, pointing out the sources (device-group and dash-name) and destination (a TSDB Partition).</t>
        <figure>
          <name>YANG tree diagram of the Collector tlm-streams.</name>
          <sourcecode type="yang-tree"><![CDATA[
module: ietf-tlm-philatelist-collector
  +--rw tlm-collector
     +--rw organizations
        +--rw organization* [name]
           +--rw tlm-streams
              +--rw tlm-stream* [id]
                 +--rw id                 something
                 +--rw sources* [device-group dash-name]
                 |  +--rw device-group    -> ../../../../
                 |  |                        device-groups/
                 |  |                        device-group/name
                 |  +--rw dash-name       -> ../../../../
                 |                           device-groups/
                 |                           device-group/
                 |                           dashboards/dashboard/id
                 +--rw destination?       partition-ref-t
]]></sourcecode>
        </figure>
        <t>The sensor groups are then arranged into streams from a collection of sources (that support the same set of sensor groups) to a destination.  This structure has been chosen with the assumption that there will be many source devices with the same set of sensor groups, and we want to minimize repetition.</t>
      </section>
      <section anchor="the-index-component">
        <name>The Index Component</name>
        <t>When Collectors collect, and when Aggregators process and aggregate telemetry data, they need to send this data to a TSDB Partition as destination. To keep track of which data is sent where, and what the connection details are for that partition, the Network Controller implements the Index YANG module. Both the Collector and Aggregator modules reference this module.</t>
        <figure>
          <name>YANG tree diagram of the Index TSDB Partitions.</name>
          <sourcecode type="yang-tree"><![CDATA[
module: ietf-tlm-philatelist-index
  +--rw tlm-index
     +--rw partitions
        +--rw partition* [id]
           +--rw id                     something
           +--rw url?                   something
           +--rw organization?          something
           +--rw partition?             something
           +--rw impl-specific
              +--rw binding* [key]
                 +--rw key              string
                 +--rw (value-type)?
                    +--:(value)
                    |  +--rw value?     string
                    +--:(values)
                    |  +--rw values*    string
                    +--:(env-var)
                       +--rw env-var?   string
]]></sourcecode>
        </figure>
        <t>The implementation specific part of the model is for integration with specific TSDB implementations. Each such integration may need a specific sef of key-value bindings, that can be provided in this list.</t>
      </section>
      <section anchor="the-processor-and-aggregator-components">
        <name>The Processor and Aggregator Components</name>
        <t>Processor components are parts of a Network Controller that take an incoming data flow and transforms it somehow, and possibly augments it with a flow of derived information.  The purpose of the transformation could be to convert between different units of measurement, correct for known errors in the input data, or fill in approximate values where there are holes in the input data.</t>
        <t>Aggregator components take multiple incoming data flows and combine them, typically by adding them together, taking possible differences in cadence in the input data flows into account.</t>
        <t>Processor and Aggregator components provide a YANG model of their output data, just like the Collector components, so that all data flowing in the system has a YANG description and is associated with metadata.</t>
        <t>Note: In the current version of the YANG modules, a Processor is simply an Aggregator with a single input and output.  Unless we see a need to keep these two component types separate, we might remove the Processor component and keep it baked in with the Aggregator.</t>
        <figure>
          <name>Example of an Aggregator setting up two streams of telemetry data from two sources to one destination.</name>
          <artwork><![CDATA[
                  +-------------+
                  | AGGREGATOR  |
                  +-------------+
                         |
            +------------+------------+
            v                         v
        ___________               ___________
       /  SOURCE   \             /DESTINATION\
      ( PARTITION 1 )           (  PARTITION  )
      |\___________/| STREAM 1  |\___________/|
      |             | ========> |             |
      |             |           |             |
      |             | STREAM 2  |             |
       \___________/  ===##===>  \___________/
                         ||
        ___________      ||
       /  SOURCE   \     ||
      ( PARTITION 2 )   //
      |\___________/| ==
      |             |
      |             |
      |             |
       \___________/
]]></artwork>
        </figure>
        <t>In this diagram, the sources and destination look like separate TSDBs, which they might be.  They may also be different partitions within the same TSDB.</t>
        <t>Each stream is associated with one or more inputs, one output and a processing operation.  All the input streams are combined using one or more aggregation operations.  Some basic operations have been defined in the Aggregator YANG module, but the set of operations has been designed to be maximally extensible.</t>
        <figure>
          <name>YANG tree diagram of the top Aggregator model.</name>
          <sourcecode type="yang-tree"><![CDATA[
module: ietf-tlm-philatelist-aggregator
  +--rw tlm-aggregator
     +--rw aggregations
     |  +--rw aggregation* [id]
     |     +--rw id           string
     |     +--rw input* [source]
     |     |  +--rw source    partition-ref-t
     |     +--rw operation?   -> ../../../operations/operation/id
     |     +--rw output
     |        +--rw destination?   partition-ref-t
]]></sourcecode>
        </figure>
        <t>The operations listed below are basic aggregation operations.  Linear-sum is just adding all the input sources together, with linear interpolation when their data points don't align perfectly in time.  Rolling average is averaging the input flows over a given length of time.  The filter-age drops all data points that are outside the min to max age.  The function allows plugging in any other function the Aggregator may have defined, but more importantly, the operations choice is easily extended using YANG augment to include any other IETF or vendor specified augmentations.</t>
        <figure>
          <name>YANG tree diagram of the Aggregator operations list.</name>
          <sourcecode type="yang-tree"><![CDATA[
module: ietf-tlm-philatelist-aggregator
  +--rw tlm-aggregator
     +--rw operations
        +--rw operation* [id]
           +--rw id                       something
           +--rw (op-type)?
              +--:(linear-sum)
              |  +--rw linear-sum
              +--:(linear-average)
              |  +--rw linear-average
              +--:(linear-max)
              |  +--rw linear-max
              +--:(linear-min)
              |  +--rw linear-min
              +--:(rolling-average)
              |  +--rw rolling-average
              |     +--rw timespan?       something
              +--:(filter-age)
              |  +--rw filter-age
              |     +--rw min-age?        something
              |     +--rw max-age?        something
              +--:(function)
                 +--rw function
                    +--rw name?           something
]]></sourcecode>
        </figure>
      </section>
      <section anchor="the-link-to-assets">
        <name>The Link to Assets</name>
        <t>In <xref target="I-D.draft-palmero-ivy-ps-almo-01"/>, the DMLMO team has built an inventory strucure that describes systems, subsystems and their soft- and hardware components.  They are called assets in the DMLMO YANG models.  Some of the collected telemetry data streams may pertain to quite precisely to these assets, and it may be interesting to see the linkage.  For this reason, there is an optional module, ietf-tlm-philatelist-assets, that augments the Philatelist Index structure and adds the possibility to point to a DMLMO asset that the TSDB Partition pertains to.</t>
      </section>
    </section>
    <section anchor="yang-based-telemetry-outlook">
      <name>YANG-based Telemetry Outlook</name>
      <t>Much work has already gone into the area of telemetry, YANG, and even their intersection.  E.g.
<xref target="I-D.draft-ietf-opsawg-collected-data-manifest-03"/>,
<xref target="I-D.draft-claise-netconf-metadata-for-collection-03"/> and
<xref target="I-D.draft-netana-nmop-yang-message-broker-integration-00"/> come to mind. We (the POWEFF authoring team) would like to work with the authoring teams of these drafts to align our joint work.</t>
      <t>Many essential data sources in real world deployments do not support any YANG-based interfaces, and that situation is expected to remain for the forseable future, which is why we find it important to be able to ingest data from free form (often REST-based) interfaces, and then add the necessary rigor on the Collector level.  Then output the datastreams in formats that existing, mature tools can consume directly.</t>
      <t>In particular, this draft depends on the mapping of YANG-based structures to the typical TSDB tag-based formats described in <xref target="I-D.draft-kll-yang-label-tsdb-00"/>.</t>
      <t>For the evolution of the YANG-based telemetry area, we believe this approach, combining pragmatism in the telemetry data stream interfaces with rigor and transparency regarding the data content, is key.  We would like to make this work fit in with the works of others in the field.</t>
    </section>
    <section anchor="yang-modules">
      <name>YANG Modules</name>
      <section anchor="base-types-module-for-philatelist">
        <name>Base types module for Philatelist</name>
        <sourcecode type="yang" markers="true"><![CDATA[
module ietf-tlm-philatelist-types {
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:ietf-tlm-philatelist-types";
  prefix ietf-tlm-philatelist-types;

  organization
    "IETF OPSA (Operations and Management Area) Working Group";
  contact
    "WG Web:   <https://datatracker.ietf.org/wg/opsawg/>
     WG List:  <mailto:opsawg@ietf.org>
     Editor:  Jan Lindblad
              <mailto:jlindbla@cisco.com>
     Editor:  Snezana Mitrovic
              <mailto:snmitrov@cisco.com>
     Editor:  Marisol Palmero
              <mailto:mpalmero@cisco.com>";
  description
    "This YANG module defines base identities for quantities, 
    measurement units, connection methods, sensor and control types
    for the Telemetry Philatelist framework.

    Copyright (c) 2024 IETF Trust and the persons identified as
    authors of the code.  All rights reserved.

    Redistribution and use in source and binary forms, with or
    without modification, is permitted pursuant to, and subject to
    the license terms contained in, the Revised BSD License set
    forth in Section 4.c of the IETF Trust's Legal Provisions
    Relating to IETF Documents
    (https://trustee.ietf.org/license-info).

    This version of this YANG module is part of RFC XXXX
    (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
    for full legal notices.
      
    The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL',
    'SHALL NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED',
    'NOT RECOMMENDED', 'MAY', and 'OPTIONAL' in this document
    are to be interpreted as described in BCP 14 (RFC 2119)
    (RFC 8174) when, and only when, they appear in all
    capitals, as shown here.
    ";
  
  revision 2024-04-15 {
    description
      "Restructured as part of the Telemetry Philatelist framework";
    reference
      "RFC XXXX: ...";
  }

  typedef something { 
    type string;
    description 
      "FIXME: Used when we haven't decided the type yet
      ";
  }
  typedef xpath {
    type string;
    description 
      "FIXME: Proper type needed
      ";
  }
  typedef sample-frequency {
    type string; 
    description 
      "FIXME: Proper type needed
      ";
  }

  // ========== SENSOR-CLASS ==============================
  identity sensor-class {
    description 
      "Sensor's relation to the asset it sits on.
      ";
  }
  identity sc-input {
    base sensor-class;
    description 
      "Sensor reports input quantity of the asset it sits on.
      ";
  }
  identity sc-output {
    base sensor-class;
    description 
      "Sensor reports output quantity of the asset it sits on.
      ";
  }
  identity sc-allocated {
    base sensor-class;
    description 
      "Sensor reports (maximum) allocated quantity of the asset
      it sits on.
      ";
  }

  // ========== SENSOR-QUANTITY ==============================
  identity sensor-quantity {
    description 
      "Sensor's quantity being measured.
      ";
  }
  
  // ========== SENSOR-UNIT ==============================
  identity sensor-unit {
    description 
      "Sensor's unit of reporting.
      ";
  }

  // ========== DASH-TYPE ===================================
  identity dash-type {
    description 
      "The base identity for all dashboard types.
      Dashboards are predefined collections of sensors and/or controls
      that a Network Element publishes towards a Network Controller,
      which uses the dashboard to find use case relevant telemetry
      collection and control points.
      ";
  }

  // ========== DASH-ITEM-TYPE ==============================
  identity dash-item-type {
    description 
      "The base identity for an individual item on a dashboard.
      This is further subdivided into controls and sensors, which
      are even further subdivided into sensors measuring e.g.
      temperature in Celsius.
      ";
  }
  identity sensor-type {
    base dash-item-type;
    description 
      "Sensor's type, i.e. combination of class, quantity and unit.
      Sensor class tells whether the sensor measures some quantity
      on the inside or outside of the component it pertains to.
      E.g. whether it is measuring the incoming our outgoing current
      from a power supply.
      Sensor quantity tells what the sensor is measuring.
      E.g. temperature, current or number of packets
      Sensor unit tells about the sensor measurement unit.
      E.g. Celsius, Farenheit or Kelvin. Or energy in kWh or J.
      ";
  }

  // ========== CONNECTION-METHOD ==============================

  identity connection-method {
    description 
      "Base identity for all kinds of connection methods.
      ";
  }
  identity get-local-file-once {
    base connection-method;
    description 
      "Connection method identity for the case where a file contains
      the dashboard information in lieu of the Network Element itself.
      ";
  }
  identity get-static-url-once {
    base connection-method;
    description
      "Connection method identity for the case where a URL contains
      the dashboard information in lieu of the Network Element itself.
      The URL may or may not be hosted on the Network Element.
      ";
  }
  identity cm-polled {
    base connection-method;
    description 
      "Connection method identity for all mechanisms that are based on
      the client regularly polling the server.
      ";
  }
}
]]></sourcecode>
      </section>
      <section anchor="dashboard-abstract-interface-module-for-philatelist">
        <name>Dashboard abstract interface module for Philatelist</name>
        <sourcecode type="yang" markers="true"><![CDATA[
module ietf-tlm-philatelist-dashboard {
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:ietf-tlm-philatelist-dashboard";
  prefix ietf-tlm-philatelist-dashboard;

  import ietf-tlm-philatelist-types {
    prefix ietf-tlm-philatelist-types;
  }

  organization
    "IETF OPSA (Operations and Management Area) Working Group";
  contact
    "WG Web:   <https://datatracker.ietf.org/wg/opsawg/>
     WG List:  <mailto:opsawg@ietf.org>
     Editor:  Jan Lindblad
              <mailto:jlindbla@cisco.com>
     Editor:  Snezana Mitrovic
              <mailto:snmitrov@cisco.com>
     Editor:  Marisol Palmero
              <mailto:mpalmero@cisco.com>";
  description
    "This YANG module defines the Telemetry Philatelist Dashboard.

    These definitions are used both by Philatelist Network Controllers,
    and Philatelist Network Elements. Network Elements that are unaware
    of the Philatelist framework may also be covered when a 
    'proxy mechanism' for the Philatelist information is added.

    Copyright (c) 2024 IETF Trust and the persons identified as
    authors of the code.  All rights reserved.

    Redistribution and use in source and binary forms, with or
    without modification, is permitted pursuant to, and subject to
    the license terms contained in, the Revised BSD License set
    forth in Section 4.c of the IETF Trust's Legal Provisions
    Relating to IETF Documents
    (https://trustee.ietf.org/license-info).

    This version of this YANG module is part of RFC XXXX
    (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
    for full legal notices.
      
    The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL',
    'SHALL NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED',
    'NOT RECOMMENDED', 'MAY', and 'OPTIONAL' in this document
    are to be interpreted as described in BCP 14 (RFC 2119)
    (RFC 8174) when, and only when, they appear in all
    capitals, as shown here.
    ";
  
  revision 2024-04-15 {
    description
      "Restructured as part of the Telemetry Philatelist framework";
    reference
      "RFC XXXX: ...";
  }

  identity cm-gnmi {
    base ietf-tlm-philatelist-types:connection-method;
    description 
      "Connection method identity for gNMI-based mechanisms.
      ";
  }
  identity cm-restconf {
    base ietf-tlm-philatelist-types:connection-method;
    description
      "Connection method identity for RESTCONF-based mechanisms.
      ";
  }
  identity cm-netconf {
    base ietf-tlm-philatelist-types:connection-method;
    description
      "Connection method identity for NETCONF-based mechanisms.
      ";
  }
  identity cm-redfish {
    base ietf-tlm-philatelist-types:connection-method;
    description
      "Connection method identity for Redfish-based mechanisms.
      ";
  }
  identity gnmi-polling {
    base cm-gnmi;
    base ietf-tlm-philatelist-types:cm-polled;
    description 
      "Connection method identity for gNMI-based polling mechanisms.
      ";
  }
  identity restconf-get-polling {
    base cm-restconf;
    base ietf-tlm-philatelist-types:cm-polled;
    description 
      "Connection method identity for RESTCONF-based polling 
      mechanisms.
      ";
  }
  identity netconf-get-polling {  
    base cm-netconf;
    base ietf-tlm-philatelist-types:cm-polled;
    description 
      "Connection method identity for NETCONF-based polling 
      mechanisms.
      ";
  }
  identity restconf-yang-push-subscription {
    base cm-restconf;
    description 
      "Connection method identity for RESTCONF-based 
      subscription mechanisms.
      ";
  }
  identity netconf-yang-push-subscription {
    base cm-netconf;
    description 
      "Connection method identity for NETCONF-based 
      subscription mechanisms.
      ";
  }
  identity redfish-polling {
    base cm-redfish;
    description 
      "Connection method identity for Redfish-based polling
      mechanisms.
      ";
  }
  grouping access-g {
    description 
      "Grouping describing the basic set of access methods offered by
      Philatelist servers, i.e. Network Elements. The set of access      
      mechanisms may be extended by servers offering additional 
      mechanisms.  This grouping is also used by Network Controllers,
      when they need to find a way to interact with the 
      Network Elements.
      ";

    leaf method {
      type identityref {
        base ietf-tlm-philatelist-types:connection-method;
      }
      default ietf-tlm-philatelist-types:get-local-file-once;
      description 
        "Discriminator pointing out which access mechanusm is offered.
        This value controls which detailed configuration nodes will be
        available.
        ";
    }
    container get-local-file-once {
      when "derived-from-or-self(../method, 
            'ietf-tlm-philatelist-types:get-local-file-once')";
      description 
        "The server itself does not offer any access mechanism for this
        dashboard item. Instead, philatelist controllers will need to
        read static values from a local on the controller. How the file
        appears in a relevant location on the controller is outside the
        scope of this specification.
        The file format used MUST adhere to RFC9195
        (https://datatracker.ietf.org/doc/rfc9195/)
        ";
      leaf filename { 
        type string; 
        description 
          "The name of the file containing the static data for the
          dashboard item. If the filename is not specified, the 
          controller should look for a file with the same name as the
          connection name.
          ";
      }
    }
    container get-static-url-once {
      when "derived-from-or-self(../method, 
            'ietf-tlm-philatelist-types:get-static-url-once')";
      description 
        "The server points to a URL the controller can use to download
        a file with static values for this dashboard item. The URL may
        or may not be pointing to the server itself, and could 
        potentially even point to a URL on the controller itself.
        How the static file contents pointed to by the URL appears on
        the webserver is outside the scope of this specification.
        ";
      leaf url { 
        type ietf-tlm-philatelist-types:something; 
        description 
          "The URL that the controller should read in order to get the
          static data about the dashboard item.
          The file format used MUST adhere to RFC9195
          (https://datatracker.ietf.org/doc/rfc9195/)
          "; 
      }
    }
    container gnmi-polling {
      when "derived-from-or-self(../method, 'gnmi-polling')";
      description 
        "The server points to a gNMI interface the controller can poll
        at regular intervals to read the current sensor value for this
        dashboard item.
        ";
      leaf encoding { 
        type ietf-tlm-philatelist-types:something; 
        description 
          "The encoding of the data provided by this mechanism, such as
          self-describing-gpb
          "; 
      } 
      leaf protocol { 
        type ietf-tlm-philatelist-types:something; 
        description 
          "The exact protocol parameters for this gNMI endpoint, such as
          grpc no-tls
          "; 
      } 
    }
    container restconf-get-polling {
      when "derived-from-or-self(../method, 'restconf-get-polling')";
      description "FIXME";
      leaf xxx { type string; description "FIXME"; }
    }
    container netconf-get-polling {
      when "derived-from-or-self(../method, 'netconf-get-polling')";
      leaf xxx { type string; description "FIXME"; }
      description "FIXME";
    }
    container restconf-yang-push-subscription {
      when "derived-from-or-self(../method, 
            'restconf-yang-push-subscription')";
      leaf xxx { type string; description "FIXME"; }
      description "FIXME";
    }
    container netconf-yang-push-subscription {
      when "derived-from-or-self(../method, 
            'netconf-yang-push-subscription')";
      leaf xxx { type string; description "FIXME"; }
      description "FIXME";
    }
    container redfish-polling {
      when "derived-from-or-self(../method, 'redfish-polling')";
      leaf xxx { type string; description "FIXME"; }
      description "FIXME";
    }
    leaf frequency { 
      when "derived-from(../method, 
            'ietf-tlm-philatelist-types:cm-polled')";
      type ietf-tlm-philatelist-types:sample-frequency; 
      description 
        "The frequency with which the sensor data value collection
        should happen. E.g. once per 30 minutes, once per 5 minutes,
        once per 30 seconds or on-change.
        ";
    }
  }

  grouping provider-g {
    description 
      "Top-level provider grouping.  Devices will implement
      this as a config false container, or as a piece of instance data
      that a controller can read. Controllers implement this data
      structure as config true, configurable and readable by the 
      operators.
      ";
    container dashboards {
      description 
        "Each device may support one or more dashboards. 
        Controllers can then choose the most advanced dashboard they 
        are aware of and interested in. A dashboard contains
        a list of sensors and/or controls that a controller may find
        useful for some particular use case.
        ";
      list dashboard {
        key id;
        description 
          "List of dashboards supported by a given device or 
          controller.
          ";
        leaf id {
          type identityref {
            base ietf-tlm-philatelist-types:dash-type;
          }
          description 
            "Formal dashboard id. The dashboard-items in this
            dashboard are found in ../items, and what items are
            available there depends on this dashboard id .
            ";
        }
        list items {
          key tsdb-path;
          description 
            "List of dashboard items. Some of the items are sensors
            which provide data to be read, some may be controls that
            the controller may use.
            ";
          leaf tsdb-path {
            type leafref {
              path ../../../../dash-items/dash-item/tsdb-path;
            }
            description 
              "Path to the sensor or control item on the dashboard.
              The format of the path is TSDB style, i.e. used MUST
              conform to the I-D.draft-kll-yang-label-tsdb, e.g.
              interfaces_interface_statistics_in_unicast_pkts
              Each dashboard item may point to multiple sensors, as in
              the example above, where each interface would have
              a counter of incoming unicase packets.
              Each dashboard item may occur in more than one dashboard,
              and is therefore further desribed in 
              ../../../../dash-items/dash-item
              ";
          }
        }
      }
    }
    container dash-items {
      description 
        "Container for all dashboard items. Each item may be part of
        (referenced by) multiple dashboards.
        ";
      list dash-item {
        key tsdb-path;
        description 
          "Dashboard item, a sensor or control item that is part of a
          dashboard, i.e. a collection of sensors and controls relevant
          for a particular use case.
          Each dashboard item may occur in more than one dashboard.
          ";
        leaf tsdb-path {
          type string;
          description 
            "Path to the sensor or control item on the dashboard.
            The format of the path is TSDB style, i.e. used MUST
            conform to the I-D.draft-kll-yang-label-tsdb, e.g.
            interfaces_interface_statistics_in_unicast_pkts
            Each dashboard item may point to multiple sensors, as in
            the example above, where each interface would have
            a counter of incoming unicase packets.
            ";
        }
        leaf item-type { 
          type identityref { 
            base ietf-tlm-philatelist-types:dash-item-type; 
          }
          mandatory true;
          description 
            "The item type describes the type of dashboard item this
            is, including if it is a sensor or contol, sitting on the
            inside or outside of the parent component, the measurement
            quantity (e.g. temperature) and unit (e.g. Celsius).
            See the ietf-tlm-philatelist-types:dash-item-type for a
            more detailed explanation, or if you intend to define a new
            type of dashboard item.
            ";
        }
        container accuracy {
          when "derived-from(../item-type, 
                'ietf-tlm-philatelist-types:sensor-type')";
          description 
            "The accuracy of the dasboard item (sensor). The accuracy
            described using two parameters. One is the max deviation
            relative to the sensor reading, the other one is a constant
            deviation offset.

            Example 1: if a sensor might produce values between 
            0 and 1000, and the sensor currently reports 555, but 
            the actual value is 531, that could be reported as a
            5% relative error with offset 0.

            Example 2: if a sensor might produce values between 
            0 and 1000, and the sensor currently reports 0, but 
            the actual value is 2, that could be reported as a
            0% relative error with offset 2 (or some slightly
            highger value, e.g. 5).

            The accuracy MUST be described such that there is a 96%
            confidence that the actual value V is within the reported
            value R so that:

              (measured-error) =  | R - V |
              (error-margin)   =  | R * (max-error-relative) | 
                                   + (max-error-offset)
              p( (measured-error) < (error-margin) ) >= 0.96
            ";
          leaf max-error-relative {
            type ietf-tlm-philatelist-types:something;
            description 
              "The part of the accuracy claim that depends on (varies
              in proportion to) the reported value.
              ";
          }
          leaf max-error-offset {
            type ietf-tlm-philatelist-types:something;
            description
              "The part of the accuracy claim that does not depend on
              (does not vary with) the reported value.
              ";
          }
        }
        list label {
          key name;
          description 
            "List of TSDB path labels. A single TSDB path often refer
            to a whole collection of readable sensors. Each such sensor
            is distinguished by the values associated with labels in
            the path. Those labels are listed here.

            Example: interfaces_interface_statistics_in_unicast_pkts
            might have one label interfaces_interface_name. Concrete
            readouts going into the TSDB might have values like

            Metric: interfaces_interface_statistics_in_unicast_pkts
            Value: 5432100
            Labels:
              host = router-01
              interfaces_interface_name = eth0

            As can be seen in the example, a controller might inject
            labels that are not part of the tsdb-path (host), but helps
            the controller keep track of the incoming data streams.
            ";
          reference
            I-D.draft-kll-yang-label-tsdb;
          leaf name {
            type string;
            description 
              "The name of the label, in TSDB path notation.
              E.g. interfaces_interface_name
              ";
          }
          choice value-source {
            description 
              "The source of the values associated with the labels.
              Label values may be provided in several ways:
              + the server may provide values in runtime, in which
                case the runtime-values points to the dashboard item
                to read to get the actual values.
              + the controller or operator may pick one or more values
                 by configuration, in which case they are listed under
                static-values .
              + the controller may pick one or more values using some
                internal mechanism of its own, in which case they
                will not be visible here.
              ";
            leaf-list static-values {
              type string;
              description 
                "One or more values configured by the controller or
                operator designating which instances of this TSDB path
                to collect data about. 

                Example: if the label name for this label entry is
                interfaces_interface_name, this could be a configured
                list of interface names to collect data about.
                ";
            }
            leaf-list runtime-values {
              type leafref {
                path ../../../dash-item/tsdb-path;
              }
              description 
                "One or more dashboard items to read label values from.

                Example: if the label name for this label entry is
                interfaces_interface_name, this could point to a
                dashboard item that collects the names of all 
                interfaces, or all interfaces relevant for a particular
                purpose or customer.
                ";
            }
          }
        }
        leaf access-path {
          type string;
          description 
            "This is the path used by the client (Network Controller)
            when asking the server (Network Element) for data.
            The format of the access-path depends on the specific
            access mechanism. If the access mechanism is YANG-based,
            this access path will be an XPath string. If the access
            mechanism is SNMP, it would be an OID. A redfish access
            mechanism would use a endpoint-local URL.

            In all cases, references to the label values, as defined in
            ../label/name, may occur. Such references are written as

                $(label_name)

            i.e. a dollar-sign, a left-parenthesis, 
            the name of the label - case sensitive and without 
            whitespace - and finally a right-parenthesis.

            Example 1: The access path for a NETCONF get-based node
            interfaces_interface_statistics_in_unicast_pkts
            might have access path

            /if:interfaces/interface[name='$(interfaces_interface_nam
            e)']/statistics/in-unicast-pkts

            Any prefixes used (as if: above) are mapped to the
            corresponding namespace (NETCONF) or module name (RESTCONF)
            using the ../../../prefix-mappings list.

            Example 2: The access path for an SNMP get-based node
            interfaces_interface_statistics_in_unicast_pkts
            might have access path

            1.3.6.1.2.1.2.2.1.11.$(interfaces_interface_num)

            Example 3: The access path for a Redfish-based node
            Systems_EthernetInterfaces_EthernetInterfaceMetrics_Droppe
            dPackets            
            might have access path

            /redfish/v1/Systems/VM1/EthernetInterfaces/$(interfaces_in
            terface_num)/EthernetInterfaceMetrics/DroppedPackets
            ";
        }
        leaf access-params {
          type leafref {
            path ../../../accesses/access/id;
          }
          description 
            "Points to the specific access method to be used with this
            dashboard item. 
            ";
        }
      }
    }
    container accesses {
      description 
        "Holds a list of all the access methods that have been defined
        for dashboard items on the Network Element.
        ";
      list access {
        key id;
        description
          "One specific access method to be used with some dashboard
          items.
          ";
        leaf id {
          type string;
          description 
            "Name for this access method.
            ";
        }
        uses access-g;
      }
    }
    container prefix-mappings {
      description 
        "Contains the mappings for prefixes used in the access-path
        to the XML namespace (NETCONF) or module name (RESTCONF).
        ";
      list prefix-mapping {
        key prefix;
        description 
          "List of access-path prefixes and their mapping to
          namespace and module name.
          ";
        leaf prefix {
          type string;
          description 
            "Prefix, as used in the dash-item/access-path.
            The prefix is case sensitive, and should not contain
            the ending colon (:).
            ";
        }
        leaf namespace {
          type string;
          description 
            "XML namespace corresponding to the prefix name.
            Used by NETCONF-based access mechanisms.
            ";
        }
        leaf module-name {
          type string;
          description 
            "YANG module name corresponding to the prefix name.
            Used by RESTCONF-based access mechanisms.
            ";
        }
      }
    }
  }
}
]]></sourcecode>
      </section>
      <section anchor="provider-interface-module-for-philatelist">
        <name>Provider interface module for Philatelist</name>
        <sourcecode type="yang" markers="true"><![CDATA[
module ietf-tlm-philatelist-provider {
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:ietf-tlm-philatelist-provider";
  prefix ietf-tlm-philatelist-provider;

  import ietf-tlm-philatelist-dashboard {
    prefix ietf-tlm-philatelist-dashboard;
  }

  organization
    "IETF OPSA (Operations and Management Area) Working Group";
  contact
    "WG Web:   <https://datatracker.ietf.org/wg/opsawg/>
     WG List:  <mailto:opsawg@ietf.org>
     Editor:  Jan Lindblad
              <mailto:jlindbla@cisco.com>
     Editor:  Snezana Mitrovic
              <mailto:snmitrov@cisco.com>
     Editor:  Marisol Palmero
              <mailto:mpalmero@cisco.com>";
  description
    "This YANG module defines the Telemetry Philatelist Provider
    interface.

    This module is used by Network Elements that have built-in support
    for the Philatelist provider interface, or by a proxy mechanism
    representing some/all of them, when not supported directly.

    Copyright (c) 2024 IETF Trust and the persons identified as
    authors of the code.  All rights reserved.

    Redistribution and use in source and binary forms, with or
    without modification, is permitted pursuant to, and subject to
    the license terms contained in, the Revised BSD License set
    forth in Section 4.c of the IETF Trust's Legal Provisions
    Relating to IETF Documents
    (https://trustee.ietf.org/license-info).

    This version of this YANG module is part of RFC XXXX
    (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
    for full legal notices.
      
    The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL',
    'SHALL NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED',
    'NOT RECOMMENDED', 'MAY', and 'OPTIONAL' in this document
    are to be interpreted as described in BCP 14 (RFC 2119)
    (RFC 8174) when, and only when, they appear in all
    capitals, as shown here.
    ";
  
  revision 2024-04-15 {
    description
      "Restructured as part of the Telemetry Philatelist framework";
    reference
      "RFC XXXX: ...";
  }

  container tlm-provider {
    description 
      "Container with telemetry collection dashboards for
      Network Elements with built-in support for the Philatelist
      collection framework.
      ";
    uses ietf-tlm-philatelist-dashboard:provider-g;
  }
}
]]></sourcecode>
      </section>
      <section anchor="index-interface-module-for-philatelist">
        <name>Index interface module for Philatelist</name>
        <sourcecode type="yang" markers="true"><![CDATA[
module ietf-tlm-philatelist-index {
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:ietf-tlm-philatelist-index";
  prefix ietf-tlm-philatelist-index;

  import ietf-tlm-philatelist-types {
    prefix ietf-tlm-philatelist-types;
  }

  organization
    "IETF OPSA (Operations and Management Area) Working Group";
  contact
    "WG Web:   <https://datatracker.ietf.org/wg/opsawg/>
     WG List:  <mailto:opsawg@ietf.org>
     Editor:  Jan Lindblad
              <mailto:jlindbla@cisco.com>
     Editor:  Snezana Mitrovic
              <mailto:snmitrov@cisco.com>
     Editor:  Marisol Palmero
              <mailto:mpalmero@cisco.com>";
  description
    'This YANG module defines the Telemetry Philatelist Index.
    These definitions are intended for Philatelist Network Controllers.

    A Network Controller with the Collector role programs one or more
    SOURCES (typically Network Elements) to generate a STREAM of 
    telemetry data. The STREAM is sent to a specific DESTINATION
    in a Time Series Database (TSDB).
    
    Each STREAM consists of timestamped sensor values from each
    sensor in a sensor group.

               +-------------+
               |  COLLECTOR  |
               +-------------+                     ___________
                      |                           /DESTINATION\
            +------------------+                 (  PARTITION  )
            v                  v                 |\___________/|
      +------------+    +------------+  STREAM 1 |             |
      |   SOURCE   |    |   SOURCE   |  =======> |             |
      | - sensor 1 |    | - sensor 1 |           |             |
      | - sensor 2 |    | - sensor 4 |  STREAM 2 |             |
      | - sensor 3 |    | - sensor 7 |  =======> |             |
      +------------+    +------------+           |             |
                \\                      STREAM 3 |             |
                  =============================>  \___________/

    '+"
    Copyright (c) 2024 IETF Trust and the persons identified as
    authors of the code.  All rights reserved.

    Redistribution and use in source and binary forms, with or
    without modification, is permitted pursuant to, and subject to
    the license terms contained in, the Revised BSD License set
    forth in Section 4.c of the IETF Trust's Legal Provisions
    Relating to IETF Documents
    (https://trustee.ietf.org/license-info).

    This version of this YANG module is part of RFC XXXX
    (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
    for full legal notices.
      
    The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL',
    'SHALL NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED',
    'NOT RECOMMENDED', 'MAY', and 'OPTIONAL' in this document
    are to be interpreted as described in BCP 14 (RFC 2119)
    (RFC 8174) when, and only when, they appear in all
    capitals, as shown here.
    ";
  
  revision 2024-04-15 {
    description
      "Restructured as part of the Telemetry Philatelist framework";
    reference
      "RFC XXXX: ...";
  }

  typedef partition-ref-t {
    type leafref { 
      path 
        "/ietf-tlm-philatelist-index:tlm-index"+
        "/ietf-tlm-philatelist-index:partitions"+
        "/ietf-tlm-philatelist-index:partition"+
        "/ietf-tlm-philatelist-index:id"; 
    }
    description 
      "Pointer to a specific TSDB partition 
      (aka. bucket, interval, segment, etc.)
      ";
  }
  grouping tsdb-partition-g {
    description 
      "Grouping for identifying and connecting to a specific TSDB
      partition (aka. bucket, interval, segment, etc.)
      ";
    leaf url { 
      type ietf-tlm-philatelist-types:something; 
      description 
        "The URL to use to connect to the TSDB.
        "; 
    }
    leaf organization { 
      type ietf-tlm-philatelist-types:something; 
      description 
        "The organization this partition belongs to.
        Leaving this unset means the 'default' organization.
        "; 
    }
    leaf partition {
      type ietf-tlm-philatelist-types:something; 
      description 
        "The TSDB partition (aka. bucket, interval, segment, etc.)
        that the collected data is stored in.
        "; 
    }
    container impl-specific {
      description 
        "Implementation specific key-valye pairs for establising and
        maintaining the collection connections.
        ";
      list binding {
        key key;
        description
          "List of key-valye bindings. The meaning of these key-value
          paris is implementation dependent.
          ";
        leaf key { 
          type string; 
          description 
            "The key part of the key-value pair.
            The set of key values that are defined is implementation
            dependent.
            "; 
        }
        choice value-type {
          description 
            "The value part of the key-value pair. The value part may
            have several different formats, and implementations may
            augment yet other formats into this choice.
            ";
          leaf value { 
            type string; 
            description 
              "The value part of the key-value pair as a simple string
              value.
              "; 
          }
          leaf-list values { 
            type string; 
            ordered-by user; 
            description 
              "The value part of the key-value pair as a collection of
              string values.
              "; 
          }
          leaf env-var { 
            type string; 
            description 
              "The value part of the key-value pair. The actual value
              is provided by an operating system environment variable.
              The name of that environment variable is given by this
              leaf. Case sensitive.
              The set of environment variable names that are defined is
              implementation dependent.
              "; 
          }
        }
      }
    }
  }

  container tlm-index {
    description 
      "List of TSDB Partitions referenced by this Network Controller. 
      ";
    container partitions {
      description 
        "Container for all the TSDB Partition access information.
        ";
      list partition {
        key id;
        description 
          "TSDB Partition access information for the Partitions that
          this Network Controller is aware of.
          ";
        leaf id { 
          type ietf-tlm-philatelist-types:something; 
          description 
            "The Network Controller's internal identifier for this
            TSDB Partition.
            "; 
        }
        uses tsdb-partition-g;
      }
    }
  }
}
]]></sourcecode>
      </section>
      <section anchor="collector-interface-module-for-philatelist">
        <name>Collector interface module for Philatelist</name>
        <sourcecode type="yang" markers="true"><![CDATA[
module ietf-tlm-philatelist-collector {
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:ietf-tlm-philatelist-collector";
  prefix ietf-tlm-philatelist-collector;

  import ietf-tlm-philatelist-types {
    prefix ietf-tlm-philatelist-types;
  }
  import ietf-tlm-philatelist-dashboard {
    prefix ietf-tlm-philatelist-dashboard;
  }
  import ietf-tlm-philatelist-index {
    prefix ietf-tlm-philatelist-index;
  }

  organization
    "IETF OPSA (Operations and Management Area) Working Group";
  contact
    "WG Web:   <https://datatracker.ietf.org/wg/opsawg/>
     WG List:  <mailto:opsawg@ietf.org>
     Editor:  Jan Lindblad
              <mailto:jlindbla@cisco.com>
     Editor:  Snezana Mitrovic
              <mailto:snmitrov@cisco.com>
     Editor:  Marisol Palmero
              <mailto:mpalmero@cisco.com>";
  description
    'This YANG module defines the Telemetry Philatelist Collector.
    These definitions are intended for Philatelist Network Controllers.

    A Network Controller with the Collector role programs one or more
    SOURCES (typically Network Elements) to generate a STREAM of 
    telemetry data. A SOURCE may be a Provider, or a proxy mechanism
    standing in for the Provider.
    The STREAM is then sent to a specific DESTINATION PARTITION
    in a Time Series Database (TSDB). Partitions are also known as
    buckets, intervals, segments, etc. in various implementations.
    
    Each STREAM consists of timestamped sensor values from each
    sensor in a sensor group.

               +-------------+
               |  COLLECTOR  |
               +-------------+                     ___________
                      |                           /DESTINATION\
            +------------------+                 (  PARTITION  )
            v                  v                 |\___________/|
      +------------+    +------------+  STREAM 1 |             |
      |   SOURCE   |    |   SOURCE   |  =======> |             |
      | - sensor 1 |    | - sensor 1 |           |             |
      | - sensor 2 |    | - sensor 4 |  STREAM 2 |             |
      | - sensor 3 |    | - sensor 7 |  =======> |             |
      +------------+    +------------+           |             |
                \\                      STREAM 3 |             |
                  =============================>  \___________/

    '+"
    Copyright (c) 2024 IETF Trust and the persons identified as
    authors of the code.  All rights reserved.

    Redistribution and use in source and binary forms, with or
    without modification, is permitted pursuant to, and subject to
    the license terms contained in, the Revised BSD License set
    forth in Section 4.c of the IETF Trust's Legal Provisions
    Relating to IETF Documents
    (https://trustee.ietf.org/license-info).

    This version of this YANG module is part of RFC XXXX
    (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
    for full legal notices.
      
    The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL',
    'SHALL NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED',
    'NOT RECOMMENDED', 'MAY', and 'OPTIONAL' in this document
    are to be interpreted as described in BCP 14 (RFC 2119)
    (RFC 8174) when, and only when, they appear in all
    capitals, as shown here.
    ";
  
  revision 2024-04-15 {
    description
      "Restructured as part of the Telemetry Philatelist framework";
    reference
      "RFC XXXX: ...";
  }

  container tlm-collector {
    description 
      "Root container for the Philatelist Collector function.
      ";
    container organizations {
      description 
        "List of organizations that the collected data pertains to.
        Data belonging to one organization will not mix with that of
        another.
        ";
      list organization {
        key name;
        description 
          "Organization that this collection process pertains to.
          ";

        leaf name {
          type string;
          description 
            "Collector's name of the organization.
            ";
        }
        container device-groups {
          description 
            "List of device-groups.
            ";
          list device-group {
            key name;
            description 
              "A device-group contains a group of similar devices that will
              have collection performed in the same way.
              ";
            leaf name {
              type string;
              description 
                "Name of the device-group.
                ";
            }
            leaf-list devices {
              type string;
              description 
                "Points to the devices members of this device-group.
                The exact meaning of these names is implementation specific.
                ";
            }
            uses ietf-tlm-philatelist-dashboard:provider-g;
          }
        }

        container tlm-streams {
          description 
            "List of telemetry streams pertainin to this organization.
            ";
          list tlm-stream {
            key id;
            description 
              "A stream of telemetry data that is collected from a
              device-group that share a particular dashboard.
              ";
            leaf id { 
              type ietf-tlm-philatelist-types:something; 
              description 
                "Identifier of the telemetry stream.
                "; 
            }
            list sources { 
              key "device-group dash-name";
              description 
                "List of sources to collect from. Each source points to
                a device-group and a dashboard name to collect from 
                each device in the device-group.
                ";
              leaf device-group { 
                type leafref { 
                  path ../../../../device-groups/device-group/name; 
                }
                description 
                  "The device-group to collect from.
                  "; 
              }
              leaf dash-name { 
                type leafref { 
                  path ../../../../device-groups/device-group/dashboards/dashboard/id; 
                }
                description 
                  "The name of the dashboard 
                  "; 
              }
            }
            leaf destination { 
              type ietf-tlm-philatelist-index:partition-ref-t; 
              description 
                "The TSDB Partition (bucket, interval, segment, etc.)
                that the collected telemetry data is sent to.
                "; 
            }
          }
        }
      }
    }
  }

  augment /tlm-collector/organizations/organization/device-groups/device-group/dash-items/dash-item/label/value-source {
    description 
      "Some additional value-sources that the collector enables
      (that are not available to providers).
      ";
    case controller-managed-value {
      leaf controller-managed-value {
        type empty;
        description
          "The Collector will determine the label value by its
          own discretion.
          ";
      }
    }
    case controller-provided-value {
      leaf controller-provided-value {
        type string;
        description
          "The Collector will determine the label value by its
          own discretion, and that value is configured here.
          ";
      }
    }
  }
}
]]></sourcecode>
      </section>
      <section anchor="aggregator-interface-module-for-philatelist">
        <name>Aggregator interface module for Philatelist</name>
        <sourcecode type="yang" markers="true"><![CDATA[
module ietf-tlm-philatelist-aggregator {
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:ietf-tlm-philatelist-aggregator";
  prefix ietf-tlm-philatelist-aggregator;

  import ietf-tlm-philatelist-types {
    prefix ietf-tlm-philatelist-types;
  }
  import ietf-tlm-philatelist-index {
    prefix ietf-tlm-philatelist-index;
  }

  organization
    "IETF OPSA (Operations and Management Area) Working Group";
  contact
    "WG Web:   <https://datatracker.ietf.org/wg/opsawg/>
     WG List:  <mailto:opsawg@ietf.org>
     Editor:  Jan Lindblad
              <mailto:jlindbla@cisco.com>
     Editor:  Snezana Mitrovic
              <mailto:snmitrov@cisco.com>
     Editor:  Marisol Palmero
              <mailto:mpalmero@cisco.com>";
  description
    'This YANG module defines the Telemetry Philatelist Aggregator.
    These definitions are intended for Philatelist Network Controllers.

    An AGGREGATOR ensures data from one or more SOURCE(s) are
    combined into a FLOW using a (sequence of) OPERATIONs (OPs)
    to generate a new data set in the DESTINATION (which could
    be a new collection in the same data storage system as the 
    SOURCE).

                  +-------------+
                  | AGGREGATOR  |
                  +-------------+
                         |
            +------------+------------+
            v                         v
        ___________               ___________
       /  SOURCE   \             /DESTINATION\
      ( PARTITION 1 )           (  PARTITION  )
      |\___________/| STREAM 1  |\___________/|
      |             | ========> |             |
      |             |           |             |
      |             | STREAM 2  |             |
       \___________/  ===##===>  \___________/
                         ||
        ___________      ||
       /  SOURCE   \     ||
      ( PARTITION 2 )   //
      |\___________/| ==
      |             |
      |             |
      |             |
       \___________/

    '+"
    Copyright (c) 2024 IETF Trust and the persons identified as
    authors of the code.  All rights reserved.

    Redistribution and use in source and binary forms, with or
    without modification, is permitted pursuant to, and subject to
    the license terms contained in, the Revised BSD License set
    forth in Section 4.c of the IETF Trust's Legal Provisions
    Relating to IETF Documents
    (https://trustee.ietf.org/license-info).

    This version of this YANG module is part of RFC XXXX
    (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
    for full legal notices.
      
    The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL',
    'SHALL NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED',
    'NOT RECOMMENDED', 'MAY', and 'OPTIONAL' in this document
    are to be interpreted as described in BCP 14 (RFC 2119)
    (RFC 8174) when, and only when, they appear in all
    capitals, as shown here.
    ";
  
  revision 2024-04-15 {
    description
      "Restructured as part of the Telemetry Philatelist framework";
    reference
      "RFC XXXX: ...";
  }

  container tlm-aggregator {
    description
      "Root container for the Philatelist Aggregator function.
      ";
    container aggregations {
      description 
        "List of aggregation operations that are applied to a set of
        input telemetry streams in a TSDB Partition to form an output 
        stream in a different TSDB Partition.
        ";
      list aggregation {
        key id;
        description 
          "Each aggregation takes one or more input streams from a 
          TSDB Partition, an operation to apply to them, and points
          to an output stream an another TSDB Partition.
          ";
        leaf id {
          type string;
          description
            "The internal id of this aggregation operation.
            ";
        }
        list input {
          key source;
          description 
            "The list of sources/input streams for the aggregation.
            ";
          leaf source { 
            type ietf-tlm-philatelist-index:partition-ref-t; 
            description 
              "The TSDB Partition (bucket, interval, segment, etc.)
              that the input telemetry data is read from.
              "; 
          }
        }
        leaf operation {
          type leafref {
            path ../../../operations/operation/id;
          }
          description 
            "The operation to apply to the input stream(s) in order to
            compute the output stream.
            ";
        }
        container output {
          description 
            "The TSDB Partition to send the computed output to.
            ";
          leaf destination { 
            type ietf-tlm-philatelist-index:partition-ref-t; 
            description 
              "The TSDB Partition (bucket, interval, segment, etc.)
              that the aggregated telemetry data is sent to.
              "; 
          }
        }
      }
    }
    container operations {
      description 
        "The operations that may be applied during the aggregation.
        ";
      list operation {
        key id;
        description 
          "Details about which operation to apply and how.
          ";
        leaf id { 
          type ietf-tlm-philatelist-types:something; 
          description 
            "The internal id of the operation to apply.
            "; 
        }
        choice op-type {
          description 
            "A choice of basic operation types. This set of choices may
            be extended by other modules agumenting the choice.
            ";
          container linear-sum { 
            description 
            "This operation produces the sum of the input streams.

            Since the data points in the input stream are not likely to
            be perfectly aligned in time, this linear-sum operation
            produces a linear interpolation between each point in the
            time series.
            
            This works well when all inputs are continuously receiving
            additional data points, and when their frequency is roughly
            the same. A different summing operation should be chosen if
            this is not the case, e.g. most-recent-sum.
            "; 
          }
          container linear-average { description "FIXME"; }
          container linear-max { description "FIXME"; }
          container linear-min { description "FIXME"; }
          container rolling-average {
            description "FIXME";
            leaf timespan { type ietf-tlm-philatelist-types:something; description "FIXME"; }
          }
          container filter-age {
            description "FIXME";
            leaf min-age { type ietf-tlm-philatelist-types:something; description "FIXME"; }
            leaf max-age { type ietf-tlm-philatelist-types:something; description "FIXME"; }
          }
          container function {
            description "FIXME";
            leaf name { type ietf-tlm-philatelist-types:something; description "FIXME"; }
          }
        }
      }
    }
  }
}
]]></sourcecode>
      </section>
      <section anchor="assets-interface-module-for-philatelist">
        <name>Assets interface module for Philatelist</name>
        <sourcecode type="yang" markers="true"><![CDATA[
module ietf-tlm-philatelist-assets {
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:ietf-tlm-philatelist-assets";
  prefix ietf-tlm-philatelist-assets;

  import ietf-lmo {
    prefix ietf-lmo;
  }
  import ietf-lmo-assets {
    prefix ietf-lmo-assets;
  }
  import ietf-tlm-philatelist-index {
    prefix ietf-tlm-philatelist-index;
  }

  organization
    "IETF OPSA (Operations and Management Area) Working Group";
  contact
    "WG Web:   <https://datatracker.ietf.org/wg/opsawg/>
     WG List:  <mailto:opsawg@ietf.org>
     Editor:  Jan Lindblad
              <mailto:jlindbla@cisco.com>
     Editor:  Snezana Mitrovic
              <mailto:snmitrov@cisco.com>
     Editor:  Marisol Palmero
              <mailto:mpalmero@cisco.com>";
  description
    "This YANG module defines the Telemetry Philatelist linkage to
    DMLMO Assets.
    These definitions are intended for Philatelist Network Controllers.

    Copyright (c) 2024 IETF Trust and the persons identified as
    authors of the code.  All rights reserved.

    Redistribution and use in source and binary forms, with or
    without modification, is permitted pursuant to, and subject to
    the license terms contained in, the Revised BSD License set
    forth in Section 4.c of the IETF Trust's Legal Provisions
    Relating to IETF Documents
    (https://trustee.ietf.org/license-info).

    This version of this YANG module is part of RFC XXXX
    (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
    for full legal notices.
      
    The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL',
    'SHALL NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED',
    'NOT RECOMMENDED', 'MAY', and 'OPTIONAL' in this document
    are to be interpreted as described in BCP 14 (RFC 2119)
    (RFC 8174) when, and only when, they appear in all
    capitals, as shown here.
    ";
  
  revision 2024-04-15 {
    description
      "Initial revision.";
    reference
      "RFC XXXX: ...";
  }

  grouping asset-pointer-g {
      description 
        "Pointer to an LMO asset.
        ";
    leaf pertains-to-asset-class {
      type leafref {
        path /ietf-lmo:lmos/ietf-lmo:lmo/ietf-lmo:lmo-class;
      }
      must "derived-from-or-self(current(), 'ietf-lmo-assets:asset')";
      must "../pertains-to-asset-id";
      description 
        "The LMO Asset class of the asset.
        ";
    }
    leaf pertains-to-asset-id {
      type leafref {
        path "/ietf-lmo:lmos/ietf-lmo:lmo"+
          "[ietf-lmo:lmo-class=current()/../pertains-to-asset-class]"+
          "/ietf-lmo:inst/ietf-lmo:id";
      }
      description 
        "The LMO Asset id (within the class) of the asset.
        ";
    }
  }

  augment "/ietf-tlm-philatelist-index:tlm-index"+
          "/ietf-tlm-philatelist-index:partitions"+
          "/ietf-tlm-philatelist-index:partition" {
    description 
      "By augmenting an asset pointer into the TSDB Partition Index,
      controller may clarify which LMO Asset the data in the Partition
      pertains to.
      ";
    uses asset-pointer-g;
  }
}
]]></sourcecode>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>TODO Security</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
    <section anchor="changes-to-be-deleted-by-rfc-editor">
      <name>Changes (to be deleted by RFC Editor)</name>
      <section anchor="from-version-01-to-02">
        <name>From version -01 to -02</name>
        <ul spacing="normal">
          <li>
            <t>Introduced Dashboard and Index concepts</t>
          </li>
          <li>
            <t>Restructured YANG into three controller modules: collector, index, aggregator</t>
          </li>
          <li>
            <t>Restructured YANG into one device module: provider</t>
          </li>
          <li>
            <t>Restructured YANG common parts into one abstract module: dashboard</t>
          </li>
        </ul>
      </section>
      <section anchor="from-version-00-to-01">
        <name>From version -00 to -01</name>
        <ul spacing="normal">
          <li>
            <t>Split YANG modules, some contents going into poweff-specific modules</t>
          </li>
          <li>
            <t>Renamed remaining YANG modules from -poweff- to -tlm-philatelist-</t>
          </li>
          <li>
            <t>Updated text to reflect new module organization</t>
          </li>
          <li>
            <t>Added optional linkage to DMLMO assets</t>
          </li>
        </ul>
      </section>
      <section anchor="version-00">
        <name>Version -00</name>
        <ul spacing="normal">
          <li>
            <t>Initial version.</t>
          </li>
        </ul>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC7950">
          <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>
        <reference anchor="RFC9195">
          <front>
            <title>A File Format for YANG Instance Data</title>
            <author fullname="B. Lengyel" initials="B." surname="Lengyel"/>
            <author fullname="B. Claise" initials="B." surname="Claise"/>
            <date month="February" year="2022"/>
            <abstract>
              <t>There is a need to document data defined in YANG models at design time, implementation time, or when a live server is unavailable. This document specifies a standard file format for YANG instance data, which follows the syntax and semantics of existing YANG models and annotates it with metadata.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9195"/>
          <seriesInfo name="DOI" value="10.17487/RFC9195"/>
        </reference>
        <reference anchor="I-D.draft-kll-yang-label-tsdb-00">
          <front>
            <title>Mapping YANG Data to Label-Set Time Series</title>
            <author fullname="Kristian Larsson" initials="K." surname="Larsson">
              <organization>Deutsche Telekom</organization>
            </author>
            <date day="18" month="October" year="2023"/>
            <abstract>
              <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>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-kll-yang-label-tsdb-00"/>
        </reference>
        <reference anchor="I-D.draft-palmero-ivy-ps-almo-01">
          <front>
            <title>Asset Lifecycle Management and Operations: A Problem Statement</title>
            <author fullname="Marisol Palmero" initials="M." surname="Palmero">
              <organization>Cisco Systems</organization>
            </author>
            <author fullname="Frank Brockners" initials="F." surname="Brockners">
              <organization>Cisco Systems</organization>
            </author>
            <author fullname="Sudhendu Kumar" initials="S." surname="Kumar">
              <organization>NC State University</organization>
            </author>
            <author fullname="Camilo Cardona" initials="C." surname="Cardona">
              <organization>NTT</organization>
            </author>
            <author fullname="Diego Lopez" initials="D." surname="Lopez">
              <organization>Telefonica I+D</organization>
            </author>
            <date day="24" month="April" year="2024"/>
            <abstract>
              <t>   This document presents a problem statement for assets lifecycle
   management and operations.  It describes a framework, the motivation
   and requirements for asset-centric metrics including but not limited
   to, asset adoption, usability, entitlements, supported capabilities,
   and enabled capabilities.  The document also defines an information
   model.  The primaty objectives for the problem statement document is
   to validate and proof that the framework can measure and improve the
   network operators' experience along the lifecycle journey, from
   technical requirements and technology selection through renewal,
   including the end of life of an asset.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-palmero-ivy-ps-almo-01"/>
        </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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="I-D.draft-ietf-opsawg-collected-data-manifest-03">
          <front>
            <title>A Data Manifest for Contextualized Telemetry Data</title>
            <author fullname="Benoît Claise" initials="B." surname="Claise">
              <organization>Huawei</organization>
            </author>
            <author fullname="Jean Quilbeuf" initials="J." surname="Quilbeuf">
              <organization>Huawei</organization>
            </author>
            <author fullname="Diego Lopez" initials="D." surname="Lopez">
              <organization>Telefonica I+D</organization>
            </author>
            <author fullname="Ignacio Dominguez Martinez-Casanueva" initials="I. D." surname="Martinez-Casanueva">
              <organization>Telefonica I+D</organization>
            </author>
            <author fullname="Thomas Graf" initials="T." surname="Graf">
              <organization>Swisscom</organization>
            </author>
            <date day="4" month="March" year="2024"/>
            <abstract>
              <t>   Network platforms use Model-driven Telemetry, and in particular YANG-
   Push, to continuously stream information, including both counters and
   state information.  This document documents the metadata that ensure
   that the collected data can be interpreted correctly.  This document
   specifies the Data Manifest, composed of two YANG data models (the
   Platform Manifest and the Data Collection Manifest).  These YANG
   modules are specified at the network (i.e. controller) level to
   provide a model that encompasses several network platforms.  The Data
   Manifest must be streamed and stored along with the data, up to the
   collection and analytics system in order to keep the collected data
   fully exploitable by the data scientists.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-opsawg-collected-data-manifest-03"/>
        </reference>
        <reference anchor="I-D.draft-claise-netconf-metadata-for-collection-03">
          <front>
            <title>Per-Node Capabilities for Optimum Operational Data Collection</title>
            <author fullname="Benoît Claise" initials="B." surname="Claise">
              <organization>Huawei</organization>
            </author>
            <author fullname="Munish Nayyar" initials="M." surname="Nayyar">
              <organization>Cisco Systems, Inc.</organization>
            </author>
            <author fullname="Adithya Reddy Sesani" initials="A. R." surname="Sesani">
              <organization>Cisco Systems, Inc.</organization>
            </author>
            <date day="25" month="January" year="2022"/>
            <abstract>
              <t>   This document proposes a YANG module that provides per-node
   capabilities for optimum operational data collection.  This YANG
   module augments the YANG Modules for describing System Capabilities
   and YANG-Push Notification capabilities.

   This module defines augmented nodes to publish the metadata
   information specific to YANG node-identifier as per ietf-system-
   capabilities datatree.

   Complementary RPCs, based on the same node capabilities, simplify the
   data collection operations.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-claise-netconf-metadata-for-collection-03"/>
        </reference>
        <reference anchor="I-D.draft-netana-nmop-yang-message-broker-integration-00">
          <front>
            <title>An Architecture for YANG-Push to Message Broker Integration</title>
            <author fullname="Thomas Graf" initials="T." surname="Graf">
              <organization>Swisscom</organization>
            </author>
            <author fullname="Ahmed Elhassany" initials="A." surname="Elhassany">
              <organization>Swisscom</organization>
            </author>
            <date day="22" month="April" year="2024"/>
            <abstract>
              <t>   This document describes the motivation and architecture of a native
   YANG-Push notifications and YANG Schema integration into a Message
   Broker and YANG Schema Registry.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-netana-nmop-yang-message-broker-integration-00"/>
        </reference>
      </references>
    </references>
    <?line 2153?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Kristian Larsson has provided invaluable insights, experience and validation of the design.  Many thanks to the entire POWEFF team for their committment, flexibility and hard work behind this.  Hat off to Benoît Claise, who inspires by the extensive work produced in IETF over the years, and in this area in particular.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
