Add initial spec for DistributedContext.Entry (#73)
* Add initial spec for DistributedContext.Entry * Remove WIP TagMap specs. * Add Entry related terminology. * Add description of supported operations and types.
This commit is contained in:
parent
c707a8bac3
commit
db519d6220
|
|
@ -106,9 +106,23 @@ Trace instead of trusting incoming Trace context.
|
||||||
|
|
||||||
TODO: Describe metrics terminology https://github.com/open-telemetry/opentelemetry-specification/issues/45
|
TODO: Describe metrics terminology https://github.com/open-telemetry/opentelemetry-specification/issues/45
|
||||||
|
|
||||||
## Tags
|
## DistributedContext
|
||||||
|
|
||||||
TODO: Describe tags terminology https://github.com/open-telemetry/opentelemetry-specification/issues/46
|
### Entry
|
||||||
|
|
||||||
|
An **Entry** is used to label anything that is associated with a specific operation,
|
||||||
|
such as an HTTP request. It consists of **EntryKey**, **EntryValue** and **EntryMetadata**.
|
||||||
|
|
||||||
|
- **EntryKey** is the name of the **Entry**. **EntryKey** along with **EntryValue**
|
||||||
|
can be used to aggregate and group stats, annotate traces and logs, etc. **EntryKey** is
|
||||||
|
a string that contains only printable ASCII (codes between 32 and 126 inclusive) and with
|
||||||
|
a length greater than zero and less than 256.
|
||||||
|
- **EntryValue** is a string that contains only printable ASCII (codes between 32 and 126).
|
||||||
|
- **EntryMetadata** contains properties associated with an **Entry**.
|
||||||
|
For now only the property **EntryTTL** is defined.
|
||||||
|
- **EntryTTL** is an integer that represents number of hops an entry can propagate.
|
||||||
|
Anytime a sender serializes an entry, sends it over the wire and receiver unserializes
|
||||||
|
the entry then the entry is considered to have travelled one hop.
|
||||||
|
|
||||||
## Resources
|
## Resources
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
# OpenCensus Library Tags Package
|
|
||||||
This documentation serves to document the "look and feel" of the open source tags package. It
|
|
||||||
describes the key types and the overall behavior.
|
|
||||||
|
|
||||||
## Main APIs
|
|
||||||
* [TagMap](TagMap.md)
|
|
||||||
|
|
@ -1,189 +0,0 @@
|
||||||
# Summary
|
|
||||||
A `Tag` is used to label anything that is associated
|
|
||||||
with a specific operation, such as an HTTP request. These `Tag`s are used to
|
|
||||||
aggregate measurements in a [`View`](https://github.com/census-instrumentation/opencensus-specs/blob/master/stats/DataAggregation.md#view)
|
|
||||||
according to unique value of the `Tag`s. The `Tag`s can also be used to filter (include/exclude)
|
|
||||||
measurements in a `View`. `Tag`s can further be used for logging and tracing.
|
|
||||||
|
|
||||||
# Tag
|
|
||||||
A `Tag` consists of TagMetadata, TagKey, and TagValue.
|
|
||||||
|
|
||||||
## TagKey
|
|
||||||
|
|
||||||
`TagKey` is the name of the Tag. TagKey along with `TagValue` is used to aggregate
|
|
||||||
and group stats, annotate traces and logs.
|
|
||||||
|
|
||||||
**Restrictions**
|
|
||||||
- Must contain only printable ASCII (codes between 32 and 126 inclusive)
|
|
||||||
- Must have length greater than zero and less than 256.
|
|
||||||
- Must not be empty.
|
|
||||||
|
|
||||||
## TagValue
|
|
||||||
|
|
||||||
`TagValue` is a string. It MUST contain only printable ASCII (codes between
|
|
||||||
32 and 126)
|
|
||||||
|
|
||||||
## TagMetadata
|
|
||||||
|
|
||||||
`TagMetadata` contains properties associated with a `Tag`. For now only the property `TagTTL`
|
|
||||||
is defined. In future, additional properties may be added to address specific situations.
|
|
||||||
|
|
||||||
A tag creator determines metadata of a tag it creates.
|
|
||||||
|
|
||||||
### TagTTL
|
|
||||||
|
|
||||||
`TagTTL` is an integer that represents number of hops a tag can propagate. Anytime a sender serializes a tag,
|
|
||||||
sends it over the wire and receiver unserializes the tag then the tag is considered to have travelled one hop.
|
|
||||||
There could be one or more proxy(ies) between sender and receiver. Proxies are treated as transparent
|
|
||||||
entities and they may not create additional hops. Every propagation implementation should support an option
|
|
||||||
`decrementTTL` (default set to true) that allows proxies to set it to false.
|
|
||||||
|
|
||||||
**For now, ONLY special values (0 and -1) are supported.**
|
|
||||||
|
|
||||||
#### Special Values
|
|
||||||
- **NO_PROPAGATION (0)**: Tag with `TagTTL` value of zero is considered to have local scope and
|
|
||||||
is used within the process it created.
|
|
||||||
|
|
||||||
- **UNLIMITED_PROPAGATION (-1)**: A Tag with `TagTTL` value of -1 can propagate unlimited hops.
|
|
||||||
However, it is still subject to outgoing and incoming (on remote side) filter criteria.
|
|
||||||
See `TagPropagationFilter` in [Tag Propagation](#Tag Propagation). `TagTTL` value of -1
|
|
||||||
is typical used to represent a request, processing of which may span multiple entities.
|
|
||||||
|
|
||||||
#### Example for TagTTL > 0
|
|
||||||
On a server side typically there is no information about the caller besides ip/port,
|
|
||||||
but in every process there is a notion of "service_name" tag that is added as a "caller" tag before
|
|
||||||
serialization when a RPC/HTTP call is made. For the "caller" tag, desirable `TagTTL` value is 1.
|
|
||||||
|
|
||||||
Note that TagTTL value of 1 is not supported at this time. The example is listed here simply to
|
|
||||||
show a possible use case for TagTTL > 0.
|
|
||||||
|
|
||||||
### Processing at Receiver and Sender
|
|
||||||
For now, limited processing is required on Sender and Receiver. However, for the sake of
|
|
||||||
completeness, future processing requirement is also listed here. These requirements are marked with
|
|
||||||
"**(future)**".
|
|
||||||
|
|
||||||
This processing is done as part of tag propagator.
|
|
||||||
|
|
||||||
#### At Receiver
|
|
||||||
Upon receiving a tag from remote entity a tag extractor
|
|
||||||
|
|
||||||
- MUST decrement the value of `TagTTL` by one if it is greater than zero. **(future)**
|
|
||||||
- MUST treat the value of `TagTTL` as -1 if it is not present.
|
|
||||||
- MUST discard the `Tag` for any other value of `TagTTL`. **(future)**
|
|
||||||
|
|
||||||
#### At Sender
|
|
||||||
Upon preparing to send a tag to a remote entity a tag injector
|
|
||||||
- MUST send the tag AND include `TagTTL` if its value is greater than 0. **(future)**
|
|
||||||
- MUST send the tag without 'TagTTL' if its value is -1. Absence of TagTTL on the wire is treated as having TagTTL of -1.
|
|
||||||
This is to optimize on-the-wire representation of common case.
|
|
||||||
- MUST not send the tag if the value of `TagTTL` is 0.
|
|
||||||
|
|
||||||
A tag accepted for sending/receiving based on `TagTTL` value could still be excluded from sending/receiving based on
|
|
||||||
`TagPropagationFilter`.
|
|
||||||
|
|
||||||
## Tag Conflict Resolution
|
|
||||||
If a new tag conflicts with an existing tag then the new tag takes precedence. Entire `Tag` along
|
|
||||||
with `TagValue` and `TagMetadata` is replaced by the most recent tag (regardless of it is locally
|
|
||||||
generated or received from a remote peer). Replacement is limited to a scope in which the
|
|
||||||
conflict arises. When the scope is closed the orignal value and metadata prior to the conflict is restored.
|
|
||||||
For example,
|
|
||||||
```
|
|
||||||
T# - Tag keys
|
|
||||||
V# - Tag Values
|
|
||||||
M# - Tag Metadata
|
|
||||||
|
|
||||||
Enter Scope 1
|
|
||||||
Current Tags T1=V1/M1, T2=V2/M2
|
|
||||||
Enter Scope 2
|
|
||||||
Add Tags T3=V3/M3, T2=v4/M4
|
|
||||||
Current Tags T1=V1/M1, T2=V4/M4, T3=V3/M3 <== Value/Metadata of T2 is replaced by V4/M4.
|
|
||||||
Close Scope 2
|
|
||||||
Current Tags T1=V1/M1, T2=V2/M2 <== T2 is restored.
|
|
||||||
Close Scope 1
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
# TagMap
|
|
||||||
`TagMap` is an abstract data type that represents collection of tags.
|
|
||||||
i.e., each key is associated with exactly one value. `TagMap` is serializable, and it represents
|
|
||||||
all of the information that could be propagated inside the process and across process boundaries.
|
|
||||||
`TagMap` is a recommended name but languages can have more language specific name.
|
|
||||||
|
|
||||||
## Limits
|
|
||||||
Combined size of all `Tag`s should not exceed 8192 bytes before encoding.
|
|
||||||
The size restriction applies to the deserialized tags so that the set of decoded
|
|
||||||
`TagMap`s is independent of the encoding format.
|
|
||||||
|
|
||||||
## TagMap Propagation
|
|
||||||
`TagMap` may be propagated across process boundaries or across any arbitrary boundaries for various
|
|
||||||
reasons. For example, one may propagate 'project-id' Tag across all micro-services to break down metrics
|
|
||||||
by 'project-id'. Not all `Tag`s in a `TagMap` should be propagated and not all `Tag`s in a `TagMap`
|
|
||||||
should be accepted from a remote peer. Hence, `TagMap` propagator must allow specifying an optional
|
|
||||||
list of ordered `TagPropagationFilter`s for receiving `Tag`s or for forwarding `Tag`s or for both.
|
|
||||||
A `TagPropagationFilter` list for receiving MAY be different then that for forwarding.
|
|
||||||
|
|
||||||
If no filter is specified for receiving then all `Tag`s are received.
|
|
||||||
If no filter is specified for forwarding then all `Tag`s are forwarded except those that have `TagTTL` of 0.
|
|
||||||
|
|
||||||
### TagPropagationFilter
|
|
||||||
Tag Propagation Filter consists of action (`TagPropagationFilterAction`) and condition
|
|
||||||
(`TagPropagationFilterMatchOperator` and `TagPropagationFilterMatchString`). A `TagKey`
|
|
||||||
is evaluated against condition of each `TagPropagationFilter` in order. If the condition is evaluated
|
|
||||||
to true then action is taken according to `TagPropagationFilterAction` and filter processing is stopped.
|
|
||||||
If the condition is evaluated to false then the `TagKey` is processed against next `TagPropagationFilter`
|
|
||||||
in the ordered list. If none of the condition is evaluated to true then the default
|
|
||||||
action is **Exclude**.
|
|
||||||
|
|
||||||
#### TagPropagationFilterAction
|
|
||||||
This is an interface. Implementation of this interface takes appropriate action on the `Tag` if the
|
|
||||||
condition (`TagPropagationFitlerMatchOperator` and `TagPropagationFilterMatchString`) is evaluated to true.
|
|
||||||
At a minimum, `Exclude` and `Include` actions MUST be implemented.
|
|
||||||
|
|
||||||
**Exclude**
|
|
||||||
If the `TagPropagationFilterAction` is Exclude then any `Tag` whose `TagKey` evaluates to true
|
|
||||||
with the condition (`TagPropagationFitlerMatchOperator` and `TagPropagationFilterMatchString`)
|
|
||||||
MUST be excluded.
|
|
||||||
|
|
||||||
**Include**
|
|
||||||
If the `TagPropagationFilterAction` is Include then any `Tag` whose `TagKey` evaluates to true
|
|
||||||
with the condition (`TagPropagationFitlerMatchOperator ` and `TagPropagationFilterMatchString`)
|
|
||||||
MUST be included.
|
|
||||||
|
|
||||||
#### TagPropagationFilterMatchOperator
|
|
||||||
|
|
||||||
| Operator | Description |
|
|
||||||
|----------|-------------|
|
|
||||||
| EQUAL | The condition is evaluated to true if `TagKey` is exactly same as `TagPropagationFilterMatchString` |
|
|
||||||
| NOTEQUAL | The condition is evaluated to true if `TagKey` is NOT exactly same as `TagPropagationFilterMatchString` |
|
|
||||||
| HAS_PREFIX | The condition is evaluated to true if `TagKey` begins with `TagPropagationFilterMatchString` |
|
|
||||||
|
|
||||||
#### TagPropagationFilterMatchString
|
|
||||||
It is a string to compare against TagKey using `TagPropagationFilterMatchOperator` in order to
|
|
||||||
include or exclude a `Tag`.
|
|
||||||
|
|
||||||
## Encoding
|
|
||||||
|
|
||||||
### Wire Format
|
|
||||||
TBD:
|
|
||||||
|
|
||||||
#### Over gRPC
|
|
||||||
TagMap should be encoded using [BinaryEncoding](https://github.com/census-instrumentation/opencensus-specs/tree/master/encodings)
|
|
||||||
and propagated using gRPC metadata `grpc-tags-bin`. The propagation MUST inject a TagMap and MUST extract a TagMap from the gRPC metadata.
|
|
||||||
|
|
||||||
#### Over HTTP
|
|
||||||
|
|
||||||
TBD: W3C [correlation context](https://github.com/w3c/correlation-context/blob/master/correlation_context/HTTP_HEADER_FORMAT.md)
|
|
||||||
may be an appropriate choice.
|
|
||||||
|
|
||||||
|
|
||||||
### Error handling
|
|
||||||
- Call should continue irrespective of any error related to encoding/decoding.
|
|
||||||
- There are no partial failures for encoding or decoding. The result of encoding or decoding
|
|
||||||
should always be a complete `TagMap` or an error. The type of error
|
|
||||||
reporting depends on the language.
|
|
||||||
- Serialization should result in an error if the `TagMap` does not meet the
|
|
||||||
size restriction above.
|
|
||||||
- Deserialization should result in an error if the serialized `TagMap`
|
|
||||||
- cannot be parsed.
|
|
||||||
- contains a `TagKey` or `TagValue` that does not meet the restrictions above.
|
|
||||||
- does not meet the size restriction above.
|
|
||||||
Loading…
Reference in New Issue