From 871a1587d8d033c212eb7403fef21810b849b483 Mon Sep 17 00:00:00 2001 From: Joshua MacDonald Date: Thu, 20 Aug 2020 11:37:25 -0700 Subject: [PATCH] Metric SDK specification OUTLINE (#347) * WIP: Metric SDK specification * Updates following Tigran's feedback * More rewording * Strengthen requirements for aggregators * Fix typos noted by MrAlias * Address some of freeformzSFDC's feedback * Capitalization * Respond to feedback * Respond to feedback * Handle->Bound instrument * New img * New img ref * Update image * Rename to Differentiator/Integrator * Remove reference to defaultkeys batcher * Batcher->Integrator * Differentiator->Accumulator * Upstream * Move the image * Update image * Simplify the diagram * Remove much dead code * Remove more dead code * Lint * Ignore * Rename metrics SDK * Bold * CheckpointSet -> ExportRecordSet * Update diagram * Update diagram (png) * Editing * Undo --- README.md | 1 + specification/metrics/img/metrics-sdk.png | Bin 0 -> 33014 bytes specification/metrics/sdk.md | 74 ++++++++++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 specification/metrics/img/metrics-sdk.png create mode 100644 specification/metrics/sdk.md diff --git a/README.md b/README.md index 8cfcc7dee1e..2c741071259 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ The OpenTelemetry specification describes the cross-language requirements and ex - [Metrics](specification/metrics/api.md) - SDK Specification - [Tracing](specification/trace/sdk.md) + - [Metrics](specification/metrics/sdk.md) - [Resource](specification/resource/sdk.md) - [Configuration](specification/sdk-configuration.md) - Data Specification diff --git a/specification/metrics/img/metrics-sdk.png b/specification/metrics/img/metrics-sdk.png new file mode 100644 index 0000000000000000000000000000000000000000..712292d626c2fd4c08228210dd833a0c6a6dde34 GIT binary patch literal 33014 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 WVOQwHeZ)Dg9mWRc7mD?-Km0!v9`tVj literal 0 HcmV?d00001 diff --git a/specification/metrics/sdk.md b/specification/metrics/sdk.md new file mode 100644 index 00000000000..318c76e60af --- /dev/null +++ b/specification/metrics/sdk.md @@ -0,0 +1,74 @@ +# Metrics SDK + +Note: This document assumes you are familiar with the (Metrics +API)[api.md] specification. + +TODO: TOC + +## Purpose + +This document describes a model implementation of the OpenTelemetry +Metrics SDK. The architectural details of the model SDK described +here are meant to offer guidance to implementors, not to mandate an +exact reproduction of the model architecture across languages. + +## Expectations + +The SDK implementors are expected to follow the best practices for the +language and runtime environment when implementing the OpenTelemetry +API. Implementors SHOULD follow the general prescriptions on safety +and performance given in [OpenTelemetry library +guidelines](../library-guidelines.md). + +## Export Pipeline Terminology + +**Export Pipeline** is used to describe a whole assembly of SDK parts. +There are three major components of the Metrics SDK that data flows +through, in order: + +1. **Accumulator**: Receives metric events from the API, computes one Accumulation per active Instrument and Label Set pair +2. **Processor**: Receives Accumulations from the Accumulator, transforms into ExportRecordSet +3. **Exporter**: Receives ExportRecordSet, transforms into some protocol and sends it somewhere. + +These terms are defined in the Metrics API specification: + +- **Metric Instrument**: the API object used by a developer for instrumentation +- **Synchronous Instrument**: a metric instrument called by the user with application context +- **Asynchronous Instrument**: a metric instrument invoked through a callback from the SDK +- **Metric Descriptor**: describes a metric instrument +- **Metric Event**: a single recorded or observed (Instrument, Label Set, Measurement) +- **Collection Interval**: the period between calls to Accumulator.Collect() +- **Label**: a key-value describing a property of the metric event +- **Label Set**: a set of key-values with unique keys +- **Measurement**: an integer or floating point number. + +Defined in the [Resource SDK](../resource/sdk.md) specification: + +- **Resource**: a set of key-values with unique keys describing the process. + +These are the significant data types used in the model architecture: + +- **Aggregator**: aggregates one or more measurements in a useful way +- **AggregatorSelector**: chooses which Aggregator to assign to a metric instrument +- **Aggregation**: the result of aggregating one or more events by a specific aggregator +- **AggregationKind**: describes the kind of read API the Aggregation supports (e.g., Sum) +- **Accumulation**: consists of Instrument, Label Set, Resource, and Aggregator snapshot +- **ExportRecordSet**: a set of export records +- **Controller**: coordinates the Accumulator, Processor, and Exporter components in an export pipeline +- **Export Record**: consists of Instrument, Label Set, Resource, Timestamp(s), and Aggregation +- **ExportKind**: one of Delta, Cumulative, or Pass-Through +- **ExportKindSelector**: chooses which ExportKind to use for a metric instrument. + +## Dataflow Diagram + +![Metrics SDK Design Diagram](img/metrics-sdk.png) + +## Accumulator Detail + +## Controller Detail + +## Basic Processor Detail + +## Reducing Processor Detail + +## Aggregator Implementations