cvlib 0.1.0

A rust implementation of the Correlation Vector
Documentation
## CorrelationVector for Rust
CorrelationVector-Rust provides the Rust implementation of the CorrelationVector protocol for tracing and correlation of events through a distributed system.

## CorrelationVector
### Background
Correlation Vector (a.k.a. cV) is a format and protocol standard for tracing and correlation of events through a distributed system based on a light weight vector clock. The standard is widely used internally at Microsoft for first party applications and services and supported across multiple logging libraries and platforms (Services, Clients - Native, Managed, Js, iOS, Android etc). The standard powers a variety of different data processing needs ranging from distributed tracing & debugging to system and business intelligence, in various business organizations.

For more on the correlation vector specification and the scenarios it supports, please refer to the [specification repo](https://github.com/microsoft/CorrelationVector).

### Features
#### Seed
Generates a new correlation vector.
```rust
CorrelationVector::new();
```
#### Extend
This adds a new counter in the vector clock.
```rust
let mut cv = CorrelationVector::new();
cv.extend();
```

#### Increment
This increments the latest counter in the vector clock.
```rust
let mut cv = CorrelationVector::new();
cv.increment();
```

#### Spin
This is the most complex function of the CorrelationVector. Spin changes the correlation vector such that the result should be unique and monotonically increasing without locking/atomic operations. It is used when the parent span is not able to atomically increment the vector clock for each child span.

```rust
let mut cv = CorrelationVector::new();
cv.spin();
```


### Explanation and example
The CorrelationVector contains a base-64 encoded uuid and a vector clock. The uuid is used to identify the vector clock and the vector clock is used to track the sequence of events.

```mermaid
sequenceDiagram
    participant A as Service A
    participant B as Service B
    participant C as Service C

    A -> A: A generates a correlation vector seed e.g. c3xEQzjqRlmr7zcQx9sBiQ.0
    A ->> B: A sends the message to B
    B -> B: B extends the correlation vector seed with a new event e.g. c3xEQzjqRlmr7zcQx9sBiQ.0.1
    B ->> C: B sends first message to C
    B -> B: B increments the cV when calling C again e.g. c3xEQzjqRlmr7zcQx9sBiQ.0.2
    B ->> C: B sends second message to C
```

This allows us to track the sequence of events in a complex distributed system.

### Disclaimer
I work for Microsoft and use CorrelationVectors but am not associated with the CorrelationVector team. This repo should *not* be considered a reference implementation of the CorrelationVector specification.