From 9fe913bd629f1ba03f8f9a0e1d738cb8d121bde3 Mon Sep 17 00:00:00 2001 From: Tigran Najaryan Date: Wed, 25 Sep 2019 16:37:11 -0400 Subject: [PATCH] Make Unary gRPC the only recommended mode Experiments have shown that Streaming implementation results in significantly more complex code. The performance benefits of Streaming mode were only visible in very small batches and are not applicable to real life scenarios when under high load we aim to have large batches. In addition, one of the potential benefits that we could get with Streaming - the ability to optimize and avoid repetition of Resource does not seem to have much real life usage. As a result Streaming mode was removed from the RFC and Unary mode is the only mode that is now part of the spec. --- text/0000-opentelemetry-protocol.md | 515 ------------------- text/0035-opentelemetry-protocol.md | 425 +++++++++++++++ text/images/otlp-concurrent.png | Bin 0 -> 9983 bytes text/images/otlp-load-balancing-timeline.png | Bin 24557 -> 0 bytes text/images/otlp-load-balancing.png | Bin 22126 -> 0 bytes text/images/otlp-multi-destination.png | Bin 18396 -> 24900 bytes text/images/otlp-sequential.png | Bin 0 -> 11665 bytes text/images/otlp-streaming.png | Bin 8827 -> 0 bytes text/images/otlp-unary.png | Bin 10864 -> 0 bytes 9 files changed, 425 insertions(+), 515 deletions(-) delete mode 100644 text/0000-opentelemetry-protocol.md create mode 100644 text/0035-opentelemetry-protocol.md create mode 100644 text/images/otlp-concurrent.png delete mode 100644 text/images/otlp-load-balancing-timeline.png delete mode 100644 text/images/otlp-load-balancing.png create mode 100644 text/images/otlp-sequential.png delete mode 100644 text/images/otlp-streaming.png delete mode 100644 text/images/otlp-unary.png diff --git a/text/0000-opentelemetry-protocol.md b/text/0000-opentelemetry-protocol.md deleted file mode 100644 index 0eaa0a230..000000000 --- a/text/0000-opentelemetry-protocol.md +++ /dev/null @@ -1,515 +0,0 @@ -# OpenTelemetry Protocol Specification - -_Author: Tigran Najaryan, Omnition Inc._ - -**Status:** `proposed` - -OpenTelemetry Protocol (OTLP) specification describes the encoding, transport and delivery mechanism of telemetry data between telemetry sources, intermediate nodes such as collectors and telemetry backends. - -## Table of Contents - -- [Motivation](#motivation) -- [Protocol Details](#protocol-details) - - [Export Request and Response](#export-request-and-response) - - [Client Modes](#client-modes) - - [Server Response](#server-response) - - [gRPC Transport](#grpc-transport) - - [Other Transports](#other-transports) -- [Implementation Recommendations](#implementation-recommendations) - - [Streaming Mode](#streaming-mode) - - [Multi-Destination Exporting](#multi-destination-exporting) - - [Load Balancing](#load-balancing) -- [Trade-offs and Mitigations](#trade-offs-and-mitigations) -- [Future Versions and Interoperability](#future-versions-and-interoperability) -- [Prior Art, Alternatives and Future Possibilities](#prior-art-alternatives-and-future-possibilities) -- [Open Questions](#open-questions) -- [Appendix A - Protocol Buffer Definitions](#appendix-a---protocol-buffer-definitions) -- [Appendix B - Performance Benchmarks](#appendix-b---performance-benchmarks) -- [Glossary](#glossary) -- [Acknowledgements](#acknowledgements) -- [Author's Address](#authors-address) - - -## Motivation - -OTLP is a general-purpose telemetry data delivery protocol designed in the scope of OpenTelemetry project. It is an incremental improvement of OpenCensus protocol. Compared to OpenCensus protocol OTLP has the following improvements: - -- Ensures high reliability of data delivery and clear visibility when the data cannot be delivered. OTLP uses acknowledgements and retry mechanisms to implement reliable delivery. - -- It is friendly to Level 7 Load Balancers and allows them to correctly map imbalanced incoming traffic to a balanced outgoing traffic. This allows to efficiently operate large networks of nodes where telemetry data generation rates change over time. - -- Allows backpressure signalling from telemetry data destinations to sources. This is important for implementing reliable multi-hop telemetry data delivery all the way from the source to the destination via intermediate nodes, each having different processing capacity and thus requiring different data transfer rates. - -## Protocol Details - -OTLP defines the encoding of telemetry data and the protocol used to exchange data between the client and the server. - -This specification defines how OTLP is implemented over [gRPC](https://grpc.io/) and specifies corresponding [Protocol Buffers](https://developers.google.com/protocol-buffers/docs/overview) schema. Future extensions to OTLP may define implementations over other transports. For details of gRPC service definition see section [gRPC Transport](#grpc-transport). - -OTLP is a request/response style protocols: the clients send requests, the server replies with corresponding responses. This document defines one requests and response type: `Export`. - -### Export Request and Response - -After establishing the underlying transport the client starts sending telemetry data using `Export` requests. The client continuously sends a sequence of `Export` requests to the server and expects to receive a response to each request: - -![Request-Response](images/otlp-request-response.png) - -_Note: this protocol is concerned with reliability of delivery between one pair of client/server nodes and aims to ensure that no data is lost in-transit between the client and the server. Many telemetry collection systems have multiple nodes that the data must travel across until reaching the final destination (e.g. application -> agent -> collector -> backend). End-to-end delivery guarantees in such systems is outside of the scope of OTLP. The acknowledgements described in this protocol happen between a single client/server pair and do not span multiple nodes in multi-hop delivery paths._ - -### Client Modes - -OTLP defines 2 modes of operation for clients: Unary and Streaming. - -Unary mode is simpler to implement and provides good performance in sub-millisecond latency networks, at the cost of worse throughput in high latency networks. - -Streaming mode requires somewhat more complicated implementation but provides significantly better throughput on high latency networks. - -Clients are recommended to implemented both modes but may choose to implement only one. - -Servers MUST implement both modes. Clients operating in different modes can connect to the same server. - -#### Unary - -In Unary mode after sending the request the client SHOULD wait until the response is received from the server. There can be at most only one request in flight that is not yet acknowledged by the server. The server MUST reply with `Export` response that includes the ID of the last request. Unary mode is implemented using gRPC unary RPC. - -![Unary](images/otlp-unary.png) - -Unary mode is recommended when simplicity of implementation is desirable and when the client and the server are connected via very low-latency network, such as for example when the client is an instrumented application and the server is a OpenTelemetry Service running as a local daemon. - -The maximum achievable throughput in unary mode is `max_request_size / (network_latency + server_response_time)`. For example if the request can contain at most 100 spans, network roundtrip latency is 200ms and server response time is 300 ms, then the maximum achievable throughput is `100 spans / (200ms+300ms)` or 200 spans per second. It is easy to see that in high latency networks or when the server response time is high it is difficult to achieve good throughput unless requests are very big (even when client, server and network throughput potentially allow much bigger processing rate). - -The ID field of the Export request and response is not used in Unary mode since the underlying transport already supports acknowledgements and one-to-one mapping of requests and responses. - -The implementations MAY make concurrent Unary calls however if the goal is to achieve higher throughput and better performance the implementations SHOULD consider using Streaming mode, which has less overhead and shows better performance in the benchmarks. - -#### Streaming - -In Streaming mode the client may send multiple `Export` requests without waiting for the response to the earlier sent requests, essentially creating a pipeline of requests that are currently in flight that are not acknowledged. - -`Export` request includes an ID field that is unique for each request. The value of ID field is a sequential uint64 number generated by the client. The server MUST respond and acknowledge each `Export` request with a corresponding response that includes the ID of the request. Note that the order of IDs in a sequence of responses coming from the server may be different than the order of IDs in a sequence of earlier sent requests coming from the client. The client MUST be able to correctly process such out-of-order responses. - -![Streaming](images/otlp-streaming.png) - -The number of unacknowledged requests for which the client did not receive responses yet is defined by the window size of underlying transport (for gRPC see details about [how the window size is calculated](https://grpc.io/blog/2017-08-22-grpc-go-perf-improvements/)). - -If the client detects that the underlying transport is broken and must be re-established the client will optionally retry sending all requests that are still pending acknowledgement after re-establishing the transport. The client implementation SHOULD expose an option to turn on and off the retrying; by default retrying SHOULD be on. - -If the client is shutting down (e.g. when the containing process wants to exit) the client will optionally wait until all pending acknowledgements are received or until an implementation specific timeout expires. This ensures reliable delivery of telemetry data. The client implementation SHOULD expose an option to turn on and off the waiting during shutdown. - -If the client is unable to deliver a certain request (e.g. it retried but failed multiple times or shutdown timer expired while waiting for acknowledgements) the client SHOULD record the fact that the data was not delivered. - -Streaming mode is recommended when the client and the server are connected via a high-latency network but high throughput is still required. This is a typical situation when the client is an application running in one data center and the server is a telemetry backend running in a different data center, potentially in a completely different geography that is reachable via high-latency multi-hop network. Same recommendation applies to low latency networks if the server is capable of high processing rate but takes a long time to generate a response to each particular request. - -### Server Response - -The Server replies to every `Export` request received from the client by a corresponding `Export` response. In Streaming mode the ID field of the response is set equal to the ID field of the request. - -If the Client does not receive a response to a particular request after a configurable period of time then the client SHOULD drop the request. The client SHOULD maintain a counter of such dropped data. This is the recommended approach because the reason that the response is not received may be that the server fails to generate a response to this particular request. Attempting to re-try sending may cause more problems at the server side. This timeout SHOULD be configured to be significantly larger than it normally takes the server to respond. - -#### Result Code - -`Export` response includes a `result_code` field, which indicates whether the server was able to successfully process the received data. Possible values for `result_code` field are: - -- `Success` - telemetry data is successfully processed by the server. If the server receives an empty request (a request that does not carry any telemetry data) the server SHOULD respond with `Success`. - -- `FailedNotRetryable` - processing of telemetry data failed. The client MUST NOT retry sending the same telemetry data. The telemetry data MUST be dropped. This for example can happen when the request contains bad data and cannot be deserialized or otherwise processed by the server. The client SHOULD maintain a counter of such dropped data. - -- `FailedRetryable` - processing of telemetry data failed. The client SHOULD record the error and may retry exporting the same data. This can happen when the server is temporarily unable to process the data. - -#### Throttling - -OTLP allows backpressure signalling. - -If the server is unable to keep up with the pace of data it receives from the client then it SHOULD signal that fact to the client. The client MUST then throttle itself to avoid overwhelming the server. - -When using gRPC transport to signal backpressure the server SHOULD return an error with code [Unavailable](https://godoc.org/google.golang.org/grpc/codes) and MAY supply additional [details via status](https://godoc.org/google.golang.org/grpc/status#Status.WithDetails) using [RetryInfo](https://github.com/googleapis/googleapis/blob/master/google/rpc/error_details.proto#L40). Here is a sample Go code to illustrate: - -```go - // Do this on server side. - st, err := status.New(codes.Unavailable, "Server is unavailable"). - WithDetails(&errdetails.RetryInfo{RetryDelay: &duration.Duration{Seconds: 30}}) - if err != nil { - log.Fatal(err) - } - - return st.Err() - - ... - - // Do this on client side. - st := status.Convert(err) - for _, detail := range st.Details() { - switch t := detail.(type) { - case *errdetails.RetryInfo: - if t.RetryDelay.Seconds > 0 || t.RetryDelay.Nanos > 0 { - // Wait before retrying. - } - } - } -``` - -When the client receives this signal it SHOULD follow the recommendations outlined in documentation for `RetryInfo`: - -``` -// Describes when the clients can retry a failed request. Clients could ignore -// the recommendation here or retry when this information is missing from error -// responses. -// -// It's always recommended that clients should use exponential backoff when -// retrying. -// -// Clients should wait until `retry_delay` amount of time has passed since -// receiving the error response before retrying. If retrying requests also -// fail, clients should use an exponential backoff scheme to gradually increase -// the delay between retries based on `retry_delay`, until either a maximum -// number of retires have been reached or a maximum retry delay cap has been -// reached. -``` - -The value of `retry_delay` is determined by the server and is implementation dependant. The server SHOULD choose a `retry_delay` value that is big enough to give the server time to recover, yet is not too big to cause the client to drop data while it is throttled. - -### gRPC Transport - -#### Service Definition - -`Export` requests and responses are delivered using bidirectional gRPC streams. - -This is OTLP over gRPC Service definition: - -``` -// Unary exporter service definition. -service UnaryExporter { - rpc ExportTraces(TraceExportRequest) returns (ExportResponse) {} - rpc ExportMetrics(MetricExportRequest) returns (ExportResponse) {} -} - -// Streaming exporter service definition. -service StreamExporter { - rpc ExportTraces(stream TraceExportRequest) returns (stream ExportResponse) {} - rpc ExportMetrics(stream MetricExportRequest) returns (stream ExportResponse) {} -} -``` - -Appendix A contains Protocol Buffer definitions for `TraceExportRequest`, `MetricExportRequest` and `ExportResponse`. - -### Other Transports - -OTLP can work over any other transport that supports message request/response capabilities. Additional transports supported by OTLP can be specified in future RFCs that extend OTLP. - -## Implementation Recommendations - -### Streaming Mode - -Typical client implementation of Streaming mode will contain an `AckPending` map of requests that were sent to the server but which are not yet acknowledged by the server. For every response received from the server the client will lookup in `AckPending` the corresponding request using the ID field of response and will remove it from the map. - -If the client shuts down before receiving acknowledging responses from the server or otherwise has to discard the requests that are in `AckPending` it may assume that telemetry data contained in these requests is lost. Client will typically maintain a counter of lost telemetry data. - -### Multi-Destination Exporting - -When the telemetry data from one client must be sent to more than one destination server there is an additional complication that must be accounted for. When one of the servers acknowledges the data and the other server does not (yet) acknowledges the client needs to make a decision about how to move forward. - -In such situation the the client SHOULD implement queuing, acknowledgement handling and retrying logic per destination. This ensures that servers do not block each other. The queues SHOULD reference shared, immutable data to be sent, thus minimizing the memory overhead caused by having multiple queues. - -![Multi-Destination Exporting](images/otlp-multi-destination.png) - -This ensures that all destination servers receive the data regardless of their speed of reception (within the available limits imposed by the size of the client-side queue). - -### Load Balancing - -Implementations SHOULD utilize gRPC transport in a way that allows Level 7 load balancers that may be in the network path between the client and the server to re-balance the traffic periodically. This is necessary so that the traffic is not pinned by the load balancer to one server for the entire duration of telemetry data sending, thus potentially leading to imbalanced load of servers located behind the load balancer. - -Unary mode implementation achieves this out of the box, Load Balancers typically make re-balancing decisions on a per unary request basis, so no other special provision is needed for Unary mode. - -Streaming mode implementations can achieve Load Balancer friendliness by periodically closing and reopening the gRPC stream. This will trigger the re-balancing by Level 7 load balancers that are gRPC-aware (such as Envoy) since they make re-balancing decisions when a new stream is opened. - -![Load Balancing](images/otlp-load-balancing-timeline.png) - -The client SHOULD periodically close and re-open the stream to help Load Balancers to re-balance the traffic. - -Client SHOULD close and re-open the stream after sending an `Export` request if any of these conditions is true: - -- Time passed since the stream was last opened is longer than a user-configurable re-balancing period `RebalanceTimeout`. - -- Number of requests exported since the stream was last opened is greater than user-configurable request count limit `RebalanceRequests`. - -In Streaming mode the client SHOULD continue processing responses that the server may send to a stream that is closed from the client side until that stream is closed from the server side as well. This means that during this transition there may exist more than one stream of data between the client and the server. - -Similar stream re-opening MAY also be initiated from the server-side, however it is usually less preferable since it results in the loss of requests which are not yet acknowledged and requires the client to re-send the requests. Even if the client is well-behaved and does the re-sending correctly this still results in overall worse throughput of the protocol. Implementations where the server needs to serve a mix of clients some of which are utilizing stream re-opening strategy and some others don't are recommended to be configured `RebalanceTimeout` and `RebalanceRequests` values that are larger at server-side than the corresponding values at client-side. This way the protocol will fall back to stream re-opening at the server-side only for the clients, which don't already utilize client-side stream re-opening. - -Below is a example of how the reference implementation behaves when multiple clients send data via load balancer to one server and one more server is added to the load balancer at some point in time. The horizontal axis is time in minutes, the vertical axis is telemetry data receiving rate by servers: - -![Load Re-balancing](images/otlp-load-balancing.png) - -In this chart initially the entire traffic is handled by one server (green line), then a second server is attached to Load Balancer (blue chart) and we can see that the total traffic is rebalanced and split evenly between the servers. - -## Trade-offs and mitigations - -### Request Acknowledgements - -#### Implementation Complexity - -The addition of acknowledgements provides delivery guarantees however it comes at the cost of slightly increased processing overhead and complexity of implementation. - -#### Duplicate Data - -In edge cases (e.g. on reconnections, network interruptions, etc) the client has no way of knowing if recently sent data was delivered if no acknowledgement was received yet. The client will typically choose to re-send such data to guarantee delivery, which may result in duplicate data on the server side. This is a deliberate choice and is considered to be the right tradeoff for telemetry data. - -### Client Mode - -Clients that want to avoid complex implementations can choose to implement Unary mode only. - -## Future Versions and Interoperability - -OTLP will evolve and change over time. Future versions of OTLP must be designed and implemented in a way that ensures that clients and servers that implement different versions of OTLP can interoperate and exchange telemetry data. Old clients must be able to talk to new servers and vice versa. If new versions of OTLP introduce new functionality that cannot be understood and supported by nodes implementing the old versions of OTLP the protocol must regress to the lowest common denominator from functional perspective. - -When possible the interoperability SHOULD be ensured between all versions of OTLP that are not declared obsolete. - -OTLP does not use explicit protocol version numbering. OTLP's interoperability of clients and servers of different versions is based on the following concepts: - -1. OTLP (current and future versions) defines a set of capabilities, some of which are mandatory, others are optional. Clients and servers must implement mandatory capabilities and can choose implement only a subset of optional capabilities. - -2. For minor changes to the protocol future versions and extension of OTLP are encouraged to use the ability of Protocol Buffers to evolve message schema in backwards compatible manner. Newer versions of OTLP may add new fields to messages that will be ignored by clients and servers that do not understand these fields. In many cases careful design of such schema changes and correct choice of default values for new fields is enough to ensure interoperability of different versions without nodes explicitly detecting that their peer node has different capabilities. - -3. More significant changes must be explicitly defined as new optional capabilities in future RFCs. Such capabilities SHOULD be discovered by client and server implementations after establishing the underlying transport. The exact discovery mechanism SHOULD be described in future RFCs which define the new capabilities and typically can be implemented by making a discovery request/response message exchange from the client to server. The mandatory capabilities defined by this specification are implied and do not require a discovery. The implementation which supports a new, optional capability MUST adjust its behavior to match the expectation of a peer that does not support a particular capability. - -The current version of OTLP is the initial version that describes mandatory capabilities only. Implementations of this specification SHOULD NOT attempt to detect the capabilities of their peers and should operate as defined in this document. - -## Prior Art, Alternatives and Future Possibilities - -OTLP is an evolution of OpenCensus protocol based on the research and testing of its modifications in production at Omnition. The modifications include the addition of delivery acknowledgements and changes that make the protocol load-balancer friendly. - -OTLP uses Protocol Buffers for data encoding. Two other encodings were considered as alternative approaches: FlatBuffers and Capnproto. Both alternatives were rejected. FlatBuffers was rejected because it lacks required functionality in all languages except C++, particularly lack of verification of decoded data and inability to mutate in-memory data. Capnproto was rejected because it is not yet considered production ready, the API is not yet stable and like FlatBuffers it lacks ability mutate in-memory data. - -Both FlatBuffers and Capnproto are worth to be re-evaluated for future versions of OpenTelemetry protocol if they overcome currently known limitations. - -It is also worth researching transports other than gRPC. Other transports are not included in this RFC due to time limitations. - -Experimental implementation of OTLP over WebSockets exists and was researched as an alternate. WebSockets were not chosen as the primary transport for OTLP due to lack or immaturity of certain capabilities (such as [lack of universal support](https://github.com/gorilla/websocket#gorilla-websocket-compared-with-other-packages) for [RFC 7692](https://tools.ietf.org/html/rfc7692) message compression extension). Despite limitations the experimental implementation demonstrated good performance and WebSocket transport will be considered for inclusion in a future OTLP Extensions RFC. - -## Open Questions - -One of the goals for telemetry protocol is reducing CPU usage and memory pressure in garbage collected languages. These goals were not addressed as part of this RFC and remain open. One of the promising future ways to address this is finding a more CPU and memory efficient encoding mechanism. - -Another goal for telemetry protocol is achieving high compression ratios for telemetry data while keeping CPU consumption low. OTLP uses compression provided by gRPC transport. No further improvements to compression were considered as part of this RFC and are a future area of work. - -## Appendix A - Protocol Buffer Definitions - -This is Protocol Buffers schema for `Export` request and response: - -``` -// A request from client to server containing trace data to export. -message TraceExportRequest { - // Unique sequential ID generated by the client. - uint64 id = 1; - - // Telemetry data. An array of ResourceSpans. - repeated ResourceSpans resourceSpans = 2; -} - -// A request from client to server containing metric data to export. -message MetricExportRequest { - // Unique sequential ID generated by the client. - uint64 id = 1; - - // Telemetry data. An array of ResourceMetrics. - repeated ResourceMetrics resourceMetrics = 2; -} - -// A response to ExportRequest. -message ExportResponse { - // ID of a response that the server acknowledges. - uint64 id = 1; - - enum ResultCode { - // Telemetry data is successfully processed by the server. - Success = 0; - - // processing of telemetry data failed. The client MUST NOT retry - // sending the same telemetry data. The telemetry data MUST be dropped. - // This for example can happen when the request contains bad data and - // cannot be deserialized or otherwise processed by the server. - FailedNotRetryable = 1; - - // Processing of telemetry data failed. The client SHOULD record the - // error and may retry exporting the same data after some time. This - // for example can happen when the server is overloaded. - FailedRetryable = 2; - } - ResultCode result_code = 2; -} - -// A list of spans from a Resource. -message ResourceSpans { - Resource resource = 1; - repeated Span spans = 2; -} - -// A list of metrics from a Resource. -message ResourceMetrics { - Resource resource = 1; - repeated Metric metrics = 2; -} -``` - -`Span`, `Metric` and `Resource` schema definitions are defined in RFCNNNN (RFC number to be defined and linked from here). - -## Appendix B - Performance Benchmarks - -Benchmarking of OTLP vs other telemetry protocols was done using [reference implementation in Go](https://github.com/tigrannajaryan/exp-otelproto). - -### Throughput - Unary vs Streaming Modes - -Streaming mode shows the following throughput advantage in benchmarks compared to Unary mode for various values of network roundtrip latency: - -``` -+-----------+-----------------------+ -+ Latency | Streaming/Unary | -+ | Throughput Factor | -+-----------+-----------------------+ -+ 0.02 ms | 1.4 | -+ 2 ms | 1.6 | -+ 20 ms | 2.7 | -+ 200 ms | 6.5 | -+-----------+-----------------------+ -``` - -Benchmarking is done using Export requests each carrying 500 spans, each span containing 10 small attributes. - -### CPU Usage - gRPC vs WebSocket/Experimental - -Experimental implementation using WebSocket transport demonstrated about 30% less CPU usage on small batches compared to gRPC transport and about 7% less CPU usage on large batches. - -This shows that exploring different transports with less overhead is a promising future direction. - -### Benchmarking Raw Results - -The following is the benchmarking result, running on on a system with i7 7500U processor, 16 GB RAM. (Note that the benchmarking script sets "performance" CPU governor during execution and sets nice value of the process for more consistent results). - -``` -==================================================================================== -Legend: -GRPC/Stream/LBTimed/Sync - GRPC, streaming, load balancer friendly, close stream every 30 sec, with ack -GRPC/Stream/LBTimed/Async/N - OTLP Streaming. GRPC, N streams, load balancer friendly, close stream every 30 sec, with async ack -GRPC/Unary - OTLP Unary. One request per batch, load balancer friendly, with ack -GRPC/Unary/Async - GRPC, unary async request per batch, load balancer friendly, with ack -GRPC/OpenCensus - OpenCensus protocol, streaming, not load balancer friendly, without ack -GRPC/OpenCensusWithAck - OpenCensus-like protocol, streaming, not load balancer friendly, with ack -GRPC/Stream/NoLB - GRPC, streaming, not load balancer friendly, with ack -GRPC/Stream/LBAlways/Sync - GRPC, streaming, load balancer friendly, close stream after every batch, with ack -GRPC/Stream/LBSrv/Async - OTLP Streaming. Load balancer friendly, server closes stream every 30 sec or 1000 batches, with async ack -WebSocket/Stream/Sync - WebSocket, streaming, unknown load balancer friendliness, with sync ack -WebSocket/Stream/Async - WebSocket, streaming, unknown load balancer friendliness, with async ack -WebSocket/Stream/Async/zlib - WebSocket, streaming, unknown load balancer friendliness, with async ack, zlib compression - - -40000 small batches, 100 spans per batch, 4 attrs per span -GRPC/Stream/LBTimed/Async/1 4000000 spans, CPU time 55.6 sec, wall time 23.4 sec, 719.8 batches/cpusec, 1713.0 batches/wallsec -GRPC/Stream/LBTimed/Async/10 4000000 spans, CPU time 57.1 sec, wall time 18.0 sec, 700.3 batches/cpusec, 2218.2 batches/wallsec -GRPC/Unary 4000000 spans, CPU time 70.4 sec, wall time 43.2 sec, 568.2 batches/cpusec, 925.1 batches/wallsec -GRPC/Unary/Async 4000000 spans, CPU time 65.2 sec, wall time 18.7 sec, 613.5 batches/cpusec, 2134.8 batches/wallsec -GRPC/OpenCensus 4000000 spans, CPU time 99.0 sec, wall time 47.9 sec, 404.2 batches/cpusec, 835.1 batches/wallsec -GRPC/OpenCensusWithAck 4000000 spans, CPU time 110.2 sec, wall time 86.8 sec, 363.0 batches/cpusec, 460.8 batches/wallsec -GRPC/Stream/NoLB 4000000 spans, CPU time 64.9 sec, wall time 43.8 sec, 616.8 batches/cpusec, 913.8 batches/wallsec -GRPC/Stream/LBAlways/Sync 4000000 spans, CPU time 76.9 sec, wall time 45.8 sec, 520.4 batches/cpusec, 872.5 batches/wallsec -GRPC/Stream/LBTimed/Sync 4000000 spans, CPU time 60.8 sec, wall time 41.1 sec, 658.1 batches/cpusec, 972.4 batches/wallsec -GRPC/Stream/LBSrv/Async 4000000 spans, CPU time 55.2 sec, wall time 62.1 sec, 724.1 batches/cpusec, 644.0 batches/wallsec -WebSocket/Stream/Sync 4000000 spans, CPU time 37.5 sec, wall time 36.7 sec, 1067.5 batches/cpusec, 1090.3 batches/wallsec -WebSocket/Stream/Async 4000000 spans, CPU time 40.9 sec, wall time 23.8 sec, 978.0 batches/cpusec, 1681.0 batches/wallsec -WebSocket/Stream/Async/zlib 4000000 spans, CPU time 100.0 sec, wall time 70.3 sec, 400.0 batches/cpusec, 568.7 batches/wallsec - -4000 large batches, 500 spans per batch, 10 attrs per span -GRPC/Stream/LBTimed/Async/1 2000000 spans, CPU time 51.0 sec, wall time 32.5 sec, 78.4 batches/cpusec, 123.0 batches/wallsec -GRPC/Stream/LBTimed/Async/10 2000000 spans, CPU time 52.8 sec, wall time 25.6 sec, 75.8 batches/cpusec, 156.3 batches/wallsec -GRPC/Unary 2000000 spans, CPU time 49.5 sec, wall time 44.6 sec, 80.8 batches/cpusec, 89.6 batches/wallsec -GRPC/Unary/Async 2000000 spans, CPU time 53.5 sec, wall time 25.3 sec, 74.7 batches/cpusec, 158.0 batches/wallsec -GRPC/OpenCensus 2000000 spans, CPU time 110.3 sec, wall time 65.1 sec, 36.3 batches/cpusec, 61.5 batches/wallsec -GRPC/OpenCensusWithAck 2000000 spans, CPU time 104.2 sec, wall time 99.8 sec, 38.4 batches/cpusec, 40.1 batches/wallsec -GRPC/Stream/NoLB 2000000 spans, CPU time 48.9 sec, wall time 45.2 sec, 81.8 batches/cpusec, 88.6 batches/wallsec -GRPC/Stream/LBAlways/Sync 2000000 spans, CPU time 50.2 sec, wall time 45.0 sec, 79.7 batches/cpusec, 88.9 batches/wallsec -GRPC/Stream/LBTimed/Sync 2000000 spans, CPU time 48.6 sec, wall time 44.9 sec, 82.3 batches/cpusec, 89.1 batches/wallsec -GRPC/Stream/LBSrv/Async 2000000 spans, CPU time 51.4 sec, wall time 35.9 sec, 77.9 batches/cpusec, 111.5 batches/wallsec -WebSocket/Stream/Sync 2000000 spans, CPU time 47.2 sec, wall time 46.4 sec, 84.7 batches/cpusec, 86.3 batches/wallsec -WebSocket/Stream/Async 2000000 spans, CPU time 48.2 sec, wall time 33.5 sec, 83.0 batches/cpusec, 119.4 batches/wallsec -WebSocket/Stream/Async/zlib 2000000 spans, CPU time 136.0 sec, wall time 104.6 sec, 29.4 batches/cpusec, 38.2 batches/wallsec - -2ms network roundtrip latency -4000 large batches, 500 spans per batch, 10 attrs per span -GRPC/Stream/LBTimed/Async/1 2000000 spans, CPU time 50.2 sec, wall time 32.0 sec, 79.6 batches/cpusec, 124.9 batches/wallsec -GRPC/Stream/LBTimed/Async/10 2000000 spans, CPU time 52.0 sec, wall time 25.1 sec, 77.0 batches/cpusec, 159.1 batches/wallsec -GRPC/Unary 2000000 spans, CPU time 51.9 sec, wall time 54.4 sec, 77.1 batches/cpusec, 73.6 batches/wallsec -GRPC/Unary/Async 2000000 spans, CPU time 51.9 sec, wall time 24.3 sec, 77.0 batches/cpusec, 164.7 batches/wallsec -GRPC/OpenCensus 2000000 spans, CPU time 107.8 sec, wall time 63.6 sec, 37.1 batches/cpusec, 62.9 batches/wallsec -GRPC/OpenCensusWithAck 2000000 spans, CPU time 104.0 sec, wall time 107.7 sec, 38.5 batches/cpusec, 37.1 batches/wallsec -GRPC/Stream/NoLB 2000000 spans, CPU time 50.2 sec, wall time 53.9 sec, 79.7 batches/cpusec, 74.2 batches/wallsec -GRPC/Stream/LBAlways/Sync 2000000 spans, CPU time 52.2 sec, wall time 54.1 sec, 76.6 batches/cpusec, 74.0 batches/wallsec -GRPC/Stream/LBTimed/Sync 2000000 spans, CPU time 49.9 sec, wall time 53.7 sec, 80.2 batches/cpusec, 74.5 batches/wallsec -GRPC/Stream/LBSrv/Async 2000000 spans, CPU time 50.6 sec, wall time 35.4 sec, 79.1 batches/cpusec, 112.9 batches/wallsec -WebSocket/Stream/Sync 2000000 spans, CPU time 47.8 sec, wall time 54.2 sec, 83.6 batches/cpusec, 73.8 batches/wallsec -WebSocket/Stream/Async 2000000 spans, CPU time 49.4 sec, wall time 34.0 sec, 81.0 batches/cpusec, 117.6 batches/wallsec -WebSocket/Stream/Async/zlib 2000000 spans, CPU time 136.6 sec, wall time 104.8 sec, 29.3 batches/cpusec, 38.2 batches/wallsec - -20ms network roundtrip latency -2000 large batches, 500 spans per batch, 10 attrs per span -GRPC/Stream/LBTimed/Async/1 1000000 spans, CPU time 25.5 sec, wall time 16.7 sec, 78.5 batches/cpusec, 119.5 batches/wallsec -GRPC/Stream/LBTimed/Async/10 1000000 spans, CPU time 26.8 sec, wall time 13.1 sec, 74.7 batches/cpusec, 152.6 batches/wallsec -GRPC/Unary 1000000 spans, CPU time 27.3 sec, wall time 64.3 sec, 73.3 batches/cpusec, 31.1 batches/wallsec -GRPC/Unary/Async 1000000 spans, CPU time 27.3 sec, wall time 13.3 sec, 73.2 batches/cpusec, 150.2 batches/wallsec -GRPC/OpenCensus 1000000 spans, CPU time 54.4 sec, wall time 32.4 sec, 36.8 batches/cpusec, 61.8 batches/wallsec -GRPC/OpenCensusWithAck 1000000 spans, CPU time 54.9 sec, wall time 92.2 sec, 36.5 batches/cpusec, 21.7 batches/wallsec -GRPC/Stream/NoLB 1000000 spans, CPU time 26.6 sec, wall time 64.7 sec, 75.3 batches/cpusec, 30.9 batches/wallsec -GRPC/Stream/LBAlways/Sync 1000000 spans, CPU time 27.8 sec, wall time 64.8 sec, 71.9 batches/cpusec, 30.9 batches/wallsec -GRPC/Stream/LBTimed/Sync 1000000 spans, CPU time 26.5 sec, wall time 64.7 sec, 75.4 batches/cpusec, 30.9 batches/wallsec -GRPC/Stream/LBSrv/Async 1000000 spans, CPU time 25.2 sec, wall time 17.5 sec, 79.4 batches/cpusec, 114.0 batches/wallsec -WebSocket/Stream/Sync 1000000 spans, CPU time 25.1 sec, wall time 64.9 sec, 79.8 batches/cpusec, 30.8 batches/wallsec -WebSocket/Stream/Async 1000000 spans, CPU time 24.6 sec, wall time 16.8 sec, 81.3 batches/cpusec, 119.0 batches/wallsec -WebSocket/Stream/Async/zlib 1000000 spans, CPU time 68.8 sec, wall time 52.8 sec, 29.1 batches/cpusec, 37.9 batches/wallsec - -200ms network roundtrip latency -200 large batches, 500 spans per batch, 10 attrs per span -GRPC/Stream/LBTimed/Async/1 100000 spans, CPU time 2.5 sec, wall time 6.2 sec, 78.7 batches/cpusec, 32.5 batches/wallsec -GRPC/Stream/LBTimed/Async/10 100000 spans, CPU time 3.2 sec, wall time 5.9 sec, 62.1 batches/cpusec, 33.6 batches/wallsec -GRPC/Unary 100000 spans, CPU time 2.8 sec, wall time 44.0 sec, 70.4 batches/cpusec, 4.5 batches/wallsec -GRPC/Unary/Async 100000 spans, CPU time 2.7 sec, wall time 7.5 sec, 73.0 batches/cpusec, 26.8 batches/wallsec -GRPC/OpenCensus 100000 spans, CPU time 5.7 sec, wall time 6.7 sec, 35.3 batches/cpusec, 30.1 batches/wallsec -GRPC/OpenCensusWithAck 100000 spans, CPU time 5.8 sec, wall time 46.6 sec, 34.8 batches/cpusec, 4.3 batches/wallsec -GRPC/Stream/NoLB 100000 spans, CPU time 2.8 sec, wall time 43.6 sec, 72.5 batches/cpusec, 4.6 batches/wallsec -GRPC/Stream/LBAlways/Sync 100000 spans, CPU time 2.8 sec, wall time 43.7 sec, 70.2 batches/cpusec, 4.6 batches/wallsec -GRPC/Stream/LBTimed/Sync 100000 spans, CPU time 2.8 sec, wall time 43.6 sec, 72.5 batches/cpusec, 4.6 batches/wallsec -GRPC/Stream/LBSrv/Async 100000 spans, CPU time 2.5 sec, wall time 6.1 sec, 78.7 batches/cpusec, 32.5 batches/wallsec -WebSocket/Stream/Sync 100000 spans, CPU time 2.7 sec, wall time 45.3 sec, 73.5 batches/cpusec, 4.4 batches/wallsec -WebSocket/Stream/Async 100000 spans, CPU time 2.6 sec, wall time 5.3 sec, 77.5 batches/cpusec, 37.4 batches/wallsec -WebSocket/Stream/Async/zlib 100000 spans, CPU time 7.3 sec, wall time 5.8 sec, 27.5 batches/cpusec, 34.7 batches/wallsec - - -2000 large batches, 500 spans per batch, 10 attrs per span -200ms network roundtrip latency -GRPC/OpenCensus 1000000 spans, CPU time 54.0 sec, wall time 38.1 sec, 37.0 batches/cpusec, 52.5 batches/wallsec -GRPC/Stream/LBTimed/Async/1 1000000 spans, CPU time 24.7 sec, wall time 34.7 sec, 81.1 batches/cpusec, 57.7 batches/wallsec -GRPC/Stream/LBTimed/Async/10 1000000 spans, CPU time 30.9 sec, wall time 34.3 sec, 64.8 batches/cpusec, 58.4 batches/wallsec -GRPC/Unary/Async 1000000 spans, CPU time 26.4 sec, wall time 44.5 sec, 75.8 batches/cpusec, 44.9 batches/wallsec -WebSocket/Stream/Async 1000000 spans, CPU time 24.9 sec, wall time 38.0 sec, 80.5 batches/cpusec, 52.7 batches/wallsec -WebSocket/Stream/Async/zlib 1000000 spans, CPU time 69.3 sec, wall time 53.5 sec, 28.9 batches/cpusec, 37.4 batches/wallsec -==================================================================================== -``` - -## Glossary - -There are 2 parties involved in telemetry data exchange. In this document the party that is the source of telemetry data is called the `Client`, the party that is the destination of telemetry data is called the `Server`. - -![Client-Server](images/otlp-client-server.png) - -Examples of a Client are instrumented applications or sending side of telemetry collectors, examples of Servers are telemetry backends or receiving side of telemetry collectors (so a Collector is typically both a Client and a Server depending on which side you look from). - -Both the Client and the Server are also a `Node`. This term is used in the document when referring to either one. - -## Acknowledgements - -Special thanks to Owais Lone who helped to conduct experiments with Load Balancers, to Paulo Janotti, Bogdan Drutu and Yuri Shkuro for thoughtful discussions around the protocol. - -## Author's Address - -Tigran Najaryan - -Omnition, Inc. - -Email: tigran@najaryan.net diff --git a/text/0035-opentelemetry-protocol.md b/text/0035-opentelemetry-protocol.md new file mode 100644 index 000000000..7adf153b3 --- /dev/null +++ b/text/0035-opentelemetry-protocol.md @@ -0,0 +1,425 @@ +# OpenTelemetry Protocol Specification + +_Author: Tigran Najaryan, Omnition Inc._ + +**Status:** `proposed` + +OpenTelemetry Protocol (OTLP) specification describes the encoding, transport and delivery mechanism of telemetry data between telemetry sources, intermediate nodes such as collectors and telemetry backends. + +## Table of Contents + +- [Motivation](#motivation) +- [Protocol Details](#protocol-details) + - [Export Request and Response](#export-request-and-response) + - [OTLP over gRPC](#otlp-over-grpc) + - [Other Transports](#other-transports) +- [Implementation Recommendations](#implementation-recommendations) + - [Multi-Destination Exporting](#multi-destination-exporting) +- [Trade-offs and Mitigations](#trade-offs-and-mitigations) +- [Future Versions and Interoperability](#future-versions-and-interoperability) +- [Prior Art, Alternatives and Future Possibilities](#prior-art-alternatives-and-future-possibilities) +- [Open Questions](#open-questions) +- [Appendix A - Protocol Buffer Definitions](#appendix-a---protocol-buffer-definitions) +- [Appendix B - Performance Benchmarks](#appendix-b---performance-benchmarks) +- [Glossary](#glossary) +- [Acknowledgements](#acknowledgements) +- [Author's Address](#authors-address) + + +## Motivation + +OTLP is a general-purpose telemetry data delivery protocol designed in the scope of OpenTelemetry project. It is an incremental improvement of OpenCensus protocol. Compared to OpenCensus protocol OTLP has the following improvements: + +- Ensures high reliability of data delivery and clear visibility when the data cannot be delivered. OTLP uses acknowledgements to implement reliable delivery. + +- It is friendly to Level 7 Load Balancers and allows them to correctly map imbalanced incoming traffic to a balanced outgoing traffic. This allows to efficiently operate large networks of nodes where telemetry data generation rates change over time. + +- Allows backpressure signalling from telemetry data destinations to sources. This is important for implementing reliable multi-hop telemetry data delivery all the way from the source to the destination via intermediate nodes, each having different processing capacity and thus requiring different data transfer rates. + +## Protocol Details + +OTLP defines the encoding of telemetry data and the protocol used to exchange data between the client and the server. + +This specification defines how OTLP is implemented over [gRPC](https://grpc.io/) and specifies corresponding [Protocol Buffers](https://developers.google.com/protocol-buffers/docs/overview) schema. Future extensions to OTLP may define implementations over other transports. For details of gRPC service definition see section [gRPC Transport](#grpc-transport). + +OTLP is a request/response style protocols: the clients send requests, the server replies with corresponding responses. This document defines one requests and response type: `Export`. + +### Export Request and Response + +After establishing the underlying transport the client starts sending telemetry data using `Export` requests. The client continuously sends a sequence of `Export` requests to the server and expects to receive a response to each request: + +![Request-Response](images/otlp-request-response.png) + +_Note: this protocol is concerned with reliability of delivery between one pair of client/server nodes and aims to ensure that no data is lost in-transit between the client and the server. Many telemetry collection systems have intermediary nodes that the data must travel across until reaching the final destination (e.g. application -> agent -> collector -> backend). End-to-end delivery guarantees in such systems is outside of the scope of OTLP. The acknowledgements described in this protocol happen between a single client/server pair and do not span intermediary nodes in multi-hop delivery paths._ + +#### OTLP over gRPC + +For gRPC transport OTLP uses Unary RPC to send export requests and receives responses. + +After sending the request the client MAY wait until the response is received from the server. In that case there will be at most only one request in flight that is not yet acknowledged by the server. + +![Unary](images/otlp-sequential.png) + +Sequential operation is recommended when simplicity of implementation is desirable and when the client and the server are connected via very low-latency network, such as for example when the client is an instrumented application and the server is a OpenTelemetry Service running as a local daemon. + +The implementations that need to achieve high throughput SHOULD support concurrent Unary calls to achieve higher throughput. The client SHOULD send new requests without waiting for the response to the earlier sent requests, essentially creating a pipeline of requests that are currently in flight that are not acknowledged. + +![Streaming](images/otlp-concurrent.png) + +The number of concurrent requests SHOULD be configurable. + +The maximum achievable throughput is `max_concurrent_requests * max_request_size / (network_latency + server_response_time)`. For example if the request can contain at most 100 spans, network roundtrip latency is 200ms and server response time is 300 ms, then the maximum achievable throughput with one concurrent request is `100 spans / (200ms+300ms)` or 200 spans per second. It is easy to see that in high latency networks or when the server response time is high to achieve good throughput the requests need to be very big or a lot concurrent requests must be done. + +If the client is shutting down (e.g. when the containing process wants to exit) the client will optionally wait until all pending acknowledgements are received or until an implementation specific timeout expires. This ensures reliable delivery of telemetry data. The client implementation SHOULD expose an option to turn on and off the waiting during shutdown. + +If the client is unable to deliver a certain request (e.g. a timer expired while waiting for acknowledgements) the client SHOULD record the fact that the data was not delivered. + +#### Result Code + +`Export` response includes a `result_code` field, which indicates whether the server was able to successfully process the received data. Possible values for `result_code` field are: + +- `Success` - telemetry data is successfully processed by the server. If the server receives an empty request (a request that does not carry any telemetry data) the server SHOULD respond with `Success`. + +- `FailedNotRetryable` - processing of telemetry data failed. The client MUST NOT retry sending the same telemetry data. The telemetry data MUST be dropped. This for example can happen when the request contains bad data and cannot be deserialized or otherwise processed by the server. The client SHOULD maintain a counter of such dropped data. + +- `FailedRetryable` - processing of telemetry data failed. The client SHOULD record the error and may retry exporting the same data. This can happen when the server is temporarily unable to process the data. + +#### Throttling + +OTLP allows backpressure signalling. + +If the server is unable to keep up with the pace of data it receives from the client then it SHOULD signal that fact to the client. The client MUST then throttle itself to avoid overwhelming the server. + +To signal backpressure when using gRPC transport the server SHOULD return an error with code [Unavailable](https://godoc.org/google.golang.org/grpc/codes) and MAY supply additional [details via status](https://godoc.org/google.golang.org/grpc/status#Status.WithDetails) using [RetryInfo](https://github.com/googleapis/googleapis/blob/master/google/rpc/error_details.proto#L40). Here is a sample Go code to illustrate: + +```go + // Do this on server side. + st, err := status.New(codes.Unavailable, "Server is unavailable"). + WithDetails(&errdetails.RetryInfo{RetryDelay: &duration.Duration{Seconds: 30}}) + if err != nil { + log.Fatal(err) + } + + return st.Err() + + ... + + // Do this on client side. + st := status.Convert(err) + for _, detail := range st.Details() { + switch t := detail.(type) { + case *errdetails.RetryInfo: + if t.RetryDelay.Seconds > 0 || t.RetryDelay.Nanos > 0 { + // Wait before retrying. + } + } + } +``` + +When the client receives this signal it SHOULD follow the recommendations outlined in documentation for `RetryInfo`: + +``` +// Describes when the clients can retry a failed request. Clients could ignore +// the recommendation here or retry when this information is missing from error +// responses. +// +// It's always recommended that clients should use exponential backoff when +// retrying. +// +// Clients should wait until `retry_delay` amount of time has passed since +// receiving the error response before retrying. If retrying requests also +// fail, clients should use an exponential backoff scheme to gradually increase +// the delay between retries based on `retry_delay`, until either a maximum +// number of retires have been reached or a maximum retry delay cap has been +// reached. +``` + +The value of `retry_delay` is determined by the server and is implementation dependant. The server SHOULD choose a `retry_delay` value that is big enough to give the server time to recover, yet is not too big to cause the client to drop data while it is throttled. + +#### gRPC Service Definition + +`Export` requests and responses are delivered using bidirectional gRPC streams. + +This is OTLP over gRPC Service definition: + +``` +service UnaryExporter { + rpc ExportTraces(TraceExportRequest) returns (ExportResponse) {} + rpc ExportMetrics(MetricExportRequest) returns (ExportResponse) {} +} +``` + +Appendix A contains Protocol Buffer definitions for `TraceExportRequest`, `MetricExportRequest` and `ExportResponse`. + +### Other Transports + +OTLP can work over any other transport that supports message request/response capabilities. Additional transports supported by OTLP can be specified in future RFCs that extend OTLP. + +## Implementation Recommendations + +### Multi-Destination Exporting + +When the telemetry data from one client must be sent to more than one destination server there is an additional complication that must be accounted for. When one of the servers acknowledges the data and the other server does not (yet) acknowledges the client needs to make a decision about how to move forward. + +In such situation the the client SHOULD implement queuing, acknowledgement handling and retrying logic per destination. This ensures that servers do not block each other. The queues SHOULD reference shared, immutable data to be sent, thus minimizing the memory overhead caused by having multiple queues. + +![Multi-Destination Exporting](images/otlp-multi-destination.png) + +This ensures that all destination servers receive the data regardless of their speed of reception (within the available limits imposed by the size of the client-side queue). + +## Trade-offs and mitigations + +### Request Acknowledgements + +#### Duplicate Data + +In edge cases (e.g. on reconnections, network interruptions, etc) the client has no way of knowing if recently sent data was delivered if no acknowledgement was received yet. The client will typically choose to re-send such data to guarantee delivery, which may result in duplicate data on the server side. This is a deliberate choice and is considered to be the right tradeoff for telemetry data. + +## Future Versions and Interoperability + +OTLP will evolve and change over time. Future versions of OTLP must be designed and implemented in a way that ensures that clients and servers that implement different versions of OTLP can interoperate and exchange telemetry data. Old clients must be able to talk to new servers and vice versa. If new versions of OTLP introduce new functionality that cannot be understood and supported by nodes implementing the old versions of OTLP the protocol must regress to the lowest common denominator from functional perspective. + +When possible the interoperability SHOULD be ensured between all versions of OTLP that are not declared obsolete. + +OTLP does not use explicit protocol version numbering. OTLP's interoperability of clients and servers of different versions is based on the following concepts: + +1. OTLP (current and future versions) defines a set of capabilities, some of which are mandatory, others are optional. Clients and servers must implement mandatory capabilities and can choose implement only a subset of optional capabilities. + +2. For minor changes to the protocol future versions and extension of OTLP are encouraged to use the ability of Protocol Buffers to evolve message schema in backwards compatible manner. Newer versions of OTLP may add new fields to messages that will be ignored by clients and servers that do not understand these fields. In many cases careful design of such schema changes and correct choice of default values for new fields is enough to ensure interoperability of different versions without nodes explicitly detecting that their peer node has different capabilities. + +3. More significant changes must be explicitly defined as new optional capabilities in future RFCs. Such capabilities SHOULD be discovered by client and server implementations after establishing the underlying transport. The exact discovery mechanism SHOULD be described in future RFCs which define the new capabilities and typically can be implemented by making a discovery request/response message exchange from the client to server. The mandatory capabilities defined by this specification are implied and do not require a discovery. The implementation which supports a new, optional capability MUST adjust its behavior to match the expectation of a peer that does not support a particular capability. + +The current version of OTLP is the initial version that describes mandatory capabilities only. Implementations of this specification SHOULD NOT attempt to detect the capabilities of their peers and should operate as defined in this document. + +## Prior Art, Alternatives and Future Possibilities + +We have considered using gRPC streaming instead of Unary RPC calls. This would require implementations to manually perform stream closing and opening periodically to be L7 Load Balancer friendly. Reference implementation using gRPC Streaming has shown that it results in significantly more complex and error prone code without significant benefits. Because of this Unary RPC was chosen. + +OTLP is an evolution of OpenCensus protocol based on the research and testing of its modifications in production at Omnition. The modifications include changes to data formats (see RFCNNNN), use of Unary PRC and backpressure signaling capability. + +OTLP uses Protocol Buffers for data encoding. Two other encodings were considered as alternative approaches: FlatBuffers and Capnproto. Both alternatives were rejected. FlatBuffers was rejected because it lacks required functionality in all languages except C++, particularly lack of verification of decoded data and inability to mutate in-memory data. Capnproto was rejected because it is not yet considered production ready, the API is not yet stable and like FlatBuffers it lacks ability mutate in-memory data. + +Both FlatBuffers and Capnproto are worth to be re-evaluated for future versions of OpenTelemetry protocol if they overcome currently known limitations. + +It is also worth researching transports other than gRPC. Other transports are not included in this RFC due to time limitations. + +Experimental implementation of OTLP over WebSockets exists and was researched as an alternate. WebSockets were not chosen as the primary transport for OTLP due to lack or immaturity of certain capabilities (such as [lack of universal support](https://github.com/gorilla/websocket#gorilla-websocket-compared-with-other-packages) for [RFC 7692](https://tools.ietf.org/html/rfc7692) message compression extension). Despite limitations the experimental implementation demonstrated good performance and WebSocket transport will be considered for inclusion in a future OTLP Extensions RFC. + +## Open Questions + +One of the goals for telemetry protocol is reducing CPU usage and memory pressure in garbage collected languages. These goals were not addressed as part of this RFC and remain open. One of the promising future ways to address this is finding a more CPU and memory efficient encoding mechanism. + +Another goal for telemetry protocol is achieving high compression ratios for telemetry data while keeping CPU consumption low. OTLP uses compression provided by gRPC transport. No further improvements to compression were considered as part of this RFC and are a future area of work. + +## Appendix A - Protocol Buffer Definitions + +This is Protocol Buffers schema for `Export` request and response: + +``` +// A request from client to server containing trace data to export. +message TraceExportRequest { + // Telemetry data. An array of ResourceSpans. + repeated ResourceSpans resourceSpans = 2; +} + +// A request from client to server containing metric data to export. +message MetricExportRequest { + // Telemetry data. An array of ResourceMetrics. + repeated ResourceMetrics resourceMetrics = 2; +} + +// A response to ExportRequest. +message ExportResponse { + enum ResultCode { + // Telemetry data is successfully processed by the server. + Success = 0; + + // processing of telemetry data failed. The client MUST NOT retry + // sending the same telemetry data. The telemetry data MUST be dropped. + // This for example can happen when the request contains bad data and + // cannot be deserialized or otherwise processed by the server. + FailedNotRetryable = 1; + + // Processing of telemetry data failed. The client SHOULD record the + // error and may retry exporting the same data after some time. This + // for example can happen when the server is overloaded. + FailedRetryable = 2; + } + ResultCode result_code = 2; +} + +// A list of spans from a Resource. +message ResourceSpans { + Resource resource = 1; + repeated Span spans = 2; +} + +// A list of metrics from a Resource. +message ResourceMetrics { + Resource resource = 1; + repeated Metric metrics = 2; +} +``` + +`Span`, `Metric` and `Resource` schema definitions are defined in RFCNNNN (RFC number to be defined and linked from here). + +## Appendix B - Performance Benchmarks + +Benchmarking of OTLP vs other telemetry protocols was done using [reference implementation in Go](https://github.com/tigrannajaryan/exp-otelproto). + +### Throughput - Sequential vs Concurrent + +Using 20 concurrent requests shows the following throughput advantage in benchmarks compared to sequential for various values of network roundtrip latency: + +``` ++-----------+-----------------------+ ++ Latency | Concurrent/Sequential | ++ | Throughput Factor | ++-----------+-----------------------+ ++ 0.02 ms | 1.7 | ++ 2 ms | 2.1 | ++ 20 ms | 4.9 | ++ 200 ms | 6.9 | ++-----------+-----------------------+ +``` + +Benchmarking is done using Export requests each carrying 500 spans, each span containing 10 small attributes. + +### CPU Usage - gRPC vs WebSocket/Experimental + +Experimental implementation using WebSocket transport demonstrated about 30% less CPU usage on small batches compared to gRPC transport and about 7% less CPU usage on large batches. + +This shows that exploring different transports with less overhead is a promising future direction. + +### Benchmarking Raw Results + +The following is the benchmarking result, running on on a system with i7 7500U processor, 16 GB RAM. (Note that the benchmarking script sets "performance" CPU governor during execution and sets nice value of the process for more consistent results). + +``` +==================================================================================== +Legend: +GRPC/Stream/LBTimed/Sync - GRPC, streaming, load balancer friendly, close stream every 30 sec, with ack +GRPC/Stream/LBTimed/Async/N - OTLP Streaming. GRPC, N streams, load balancer friendly, close stream every 30 sec, with async ack +GRPC/Unary - OTLP Unary. One request per batch, load balancer friendly, with ack +GRPC/Unary/Async - GRPC, unary async request per batch, load balancer friendly, with ack +GRPC/OpenCensus - OpenCensus protocol, streaming, not load balancer friendly, without ack +GRPC/OpenCensusWithAck - OpenCensus-like protocol, streaming, not load balancer friendly, with ack +GRPC/Stream/NoLB - GRPC, streaming, not load balancer friendly, with ack +GRPC/Stream/LBAlways/Sync - GRPC, streaming, load balancer friendly, close stream after every batch, with ack +GRPC/Stream/LBSrv/Async - OTLP Streaming. Load balancer friendly, server closes stream every 30 sec or 1000 batches, with async ack +WebSocket/Stream/Sync - WebSocket, streaming, unknown load balancer friendliness, with sync ack +WebSocket/Stream/Async - WebSocket, streaming, unknown load balancer friendliness, with async ack +WebSocket/Stream/Async/zlib - WebSocket, streaming, unknown load balancer friendliness, with async ack, zlib compression + + +8000 small batches, 100 spans per batch, 4 attrs per span +GRPC/Stream/LBTimed/Async/1 800000 spans, CPU time 12.4 sec, wall time 5.3 sec, 645.7 batches/cpusec, 1510.0 batches/wallsec +GRPC/Stream/LBTimed/Async/10 800000 spans, CPU time 12.3 sec, wall time 3.9 sec, 650.9 batches/cpusec, 2058.4 batches/wallsec +GRPC/Unary 800000 spans, CPU time 15.3 sec, wall time 9.5 sec, 523.2 batches/cpusec, 840.0 batches/wallsec +GRPC/Unary/Async 800000 spans, CPU time 14.1 sec, wall time 4.0 sec, 565.8 batches/cpusec, 1986.3 batches/wallsec +GRPC/OpenCensus 800000 spans, CPU time 21.7 sec, wall time 10.6 sec, 368.7 batches/cpusec, 751.5 batches/wallsec +GRPC/OpenCensusWithAck 800000 spans, CPU time 23.4 sec, wall time 19.0 sec, 342.3 batches/cpusec, 420.8 batches/wallsec +GRPC/Stream/NoLB 800000 spans, CPU time 13.6 sec, wall time 9.4 sec, 588.2 batches/cpusec, 848.7 batches/wallsec +GRPC/Stream/LBAlways/Sync 800000 spans, CPU time 16.1 sec, wall time 10.0 sec, 495.7 batches/cpusec, 798.8 batches/wallsec +GRPC/Stream/LBTimed/Sync 800000 spans, CPU time 13.7 sec, wall time 9.5 sec, 585.7 batches/cpusec, 845.1 batches/wallsec +GRPC/Stream/LBSrv/Async 800000 spans, CPU time 12.7 sec, wall time 12.5 sec, 628.9 batches/cpusec, 639.8 batches/wallsec +WebSocket/Stream/Sync 800000 spans, CPU time 8.4 sec, wall time 8.3 sec, 949.0 batches/cpusec, 965.3 batches/wallsec +WebSocket/Stream/Async 800000 spans, CPU time 9.4 sec, wall time 5.4 sec, 852.0 batches/cpusec, 1492.0 batches/wallsec +WebSocket/Stream/Async/zlib 800000 spans, CPU time 23.3 sec, wall time 16.5 sec, 343.8 batches/cpusec, 484.0 batches/wallsec + +800 large batches, 500 spans per batch, 10 attrs per span +GRPC/Stream/LBTimed/Async/1 400000 spans, CPU time 11.4 sec, wall time 7.1 sec, 70.2 batches/cpusec, 113.1 batches/wallsec +GRPC/Stream/LBTimed/Async/10 400000 spans, CPU time 12.2 sec, wall time 5.8 sec, 65.8 batches/cpusec, 138.4 batches/wallsec +GRPC/Unary 400000 spans, CPU time 10.7 sec, wall time 9.6 sec, 74.7 batches/cpusec, 83.2 batches/wallsec +GRPC/Unary/Async 400000 spans, CPU time 11.9 sec, wall time 5.6 sec, 67.0 batches/cpusec, 141.8 batches/wallsec +GRPC/OpenCensus 400000 spans, CPU time 23.9 sec, wall time 14.1 sec, 33.5 batches/cpusec, 56.8 batches/wallsec +GRPC/OpenCensusWithAck 400000 spans, CPU time 22.0 sec, wall time 21.1 sec, 36.4 batches/cpusec, 38.0 batches/wallsec +GRPC/Stream/NoLB 400000 spans, CPU time 10.7 sec, wall time 9.8 sec, 74.9 batches/cpusec, 81.8 batches/wallsec +GRPC/Stream/LBAlways/Sync 400000 spans, CPU time 11.5 sec, wall time 10.2 sec, 69.9 batches/cpusec, 78.2 batches/wallsec +GRPC/Stream/LBTimed/Sync 400000 spans, CPU time 11.1 sec, wall time 10.2 sec, 71.9 batches/cpusec, 78.4 batches/wallsec +GRPC/Stream/LBSrv/Async 400000 spans, CPU time 11.3 sec, wall time 7.0 sec, 70.5 batches/cpusec, 113.6 batches/wallsec +WebSocket/Stream/Sync 400000 spans, CPU time 10.3 sec, wall time 10.1 sec, 78.0 batches/cpusec, 79.4 batches/wallsec +WebSocket/Stream/Async 400000 spans, CPU time 10.5 sec, wall time 7.2 sec, 76.2 batches/cpusec, 111.2 batches/wallsec +WebSocket/Stream/Async/zlib 400000 spans, CPU time 29.0 sec, wall time 22.1 sec, 27.6 batches/cpusec, 36.1 batches/wallsec + +2ms network roundtrip latency +800 large batches, 500 spans per batch, 10 attrs per span +GRPC/Stream/LBTimed/Async/1 400000 spans, CPU time 11.1 sec, wall time 7.0 sec, 71.9 batches/cpusec, 114.9 batches/wallsec +GRPC/Stream/LBTimed/Async/10 400000 spans, CPU time 11.4 sec, wall time 5.4 sec, 70.5 batches/cpusec, 148.0 batches/wallsec +GRPC/Unary 400000 spans, CPU time 11.5 sec, wall time 11.8 sec, 69.5 batches/cpusec, 68.1 batches/wallsec +GRPC/Unary/Async 400000 spans, CPU time 11.3 sec, wall time 5.3 sec, 70.5 batches/cpusec, 150.4 batches/wallsec +GRPC/OpenCensus 400000 spans, CPU time 23.1 sec, wall time 13.6 sec, 34.6 batches/cpusec, 58.7 batches/wallsec +GRPC/OpenCensusWithAck 400000 spans, CPU time 21.9 sec, wall time 22.6 sec, 36.6 batches/cpusec, 35.4 batches/wallsec +GRPC/Stream/NoLB 400000 spans, CPU time 11.1 sec, wall time 11.6 sec, 72.3 batches/cpusec, 69.2 batches/wallsec +GRPC/Stream/LBAlways/Sync 400000 spans, CPU time 11.5 sec, wall time 11.6 sec, 69.8 batches/cpusec, 68.9 batches/wallsec +GRPC/Stream/LBTimed/Sync 400000 spans, CPU time 11.3 sec, wall time 11.7 sec, 71.0 batches/cpusec, 68.2 batches/wallsec +GRPC/Stream/LBSrv/Async 400000 spans, CPU time 11.1 sec, wall time 6.9 sec, 72.0 batches/cpusec, 115.1 batches/wallsec +WebSocket/Stream/Sync 400000 spans, CPU time 10.8 sec, wall time 12.0 sec, 74.1 batches/cpusec, 66.5 batches/wallsec +WebSocket/Stream/Async 400000 spans, CPU time 10.6 sec, wall time 7.2 sec, 75.5 batches/cpusec, 111.8 batches/wallsec +WebSocket/Stream/Async/zlib 400000 spans, CPU time 28.6 sec, wall time 21.9 sec, 27.9 batches/cpusec, 36.6 batches/wallsec + +20ms network roundtrip latency +400 large batches, 500 spans per batch, 10 attrs per span +GRPC/Stream/LBTimed/Async/1 200000 spans, CPU time 6.2 sec, wall time 4.1 sec, 64.9 batches/cpusec, 96.7 batches/wallsec +GRPC/Stream/LBTimed/Async/10 200000 spans, CPU time 6.2 sec, wall time 3.0 sec, 64.0 batches/cpusec, 132.9 batches/wallsec +GRPC/Unary 200000 spans, CPU time 6.2 sec, wall time 13.5 sec, 64.3 batches/cpusec, 29.6 batches/wallsec +GRPC/Unary/Async 200000 spans, CPU time 5.9 sec, wall time 3.0 sec, 68.0 batches/cpusec, 132.9 batches/wallsec +GRPC/OpenCensus 200000 spans, CPU time 12.6 sec, wall time 7.5 sec, 31.8 batches/cpusec, 53.3 batches/wallsec +GRPC/OpenCensusWithAck 200000 spans, CPU time 12.0 sec, wall time 19.5 sec, 33.4 batches/cpusec, 20.5 batches/wallsec +GRPC/Stream/NoLB 200000 spans, CPU time 5.9 sec, wall time 13.3 sec, 68.3 batches/cpusec, 30.0 batches/wallsec +GRPC/Stream/LBAlways/Sync 200000 spans, CPU time 5.9 sec, wall time 13.3 sec, 68.0 batches/cpusec, 30.2 batches/wallsec +GRPC/Stream/LBTimed/Sync 200000 spans, CPU time 5.8 sec, wall time 13.3 sec, 69.3 batches/cpusec, 30.1 batches/wallsec +GRPC/Stream/LBSrv/Async 200000 spans, CPU time 5.5 sec, wall time 3.7 sec, 73.4 batches/cpusec, 107.3 batches/wallsec +WebSocket/Stream/Sync 200000 spans, CPU time 5.8 sec, wall time 14.6 sec, 69.4 batches/cpusec, 27.4 batches/wallsec +WebSocket/Stream/Async 200000 spans, CPU time 5.5 sec, wall time 3.9 sec, 72.3 batches/cpusec, 102.1 batches/wallsec +WebSocket/Stream/Async/zlib 200000 spans, CPU time 14.7 sec, wall time 11.2 sec, 27.3 batches/cpusec, 35.7 batches/wallsec + +200ms network roundtrip latency +40 large batches, 500 spans per batch, 10 attrs per span +GRPC/Stream/LBTimed/Async/1 20000 spans, CPU time 0.5 sec, wall time 3.1 sec, 74.1 batches/cpusec, 12.7 batches/wallsec +GRPC/Stream/LBTimed/Async/10 20000 spans, CPU time 0.7 sec, wall time 3.1 sec, 61.5 batches/cpusec, 12.8 batches/wallsec +GRPC/Unary 20000 spans, CPU time 0.6 sec, wall time 9.9 sec, 65.6 batches/cpusec, 4.0 batches/wallsec +GRPC/Unary/Async 20000 spans, CPU time 0.6 sec, wall time 3.6 sec, 65.6 batches/cpusec, 11.1 batches/wallsec +GRPC/OpenCensus 20000 spans, CPU time 1.1 sec, wall time 3.5 sec, 35.1 batches/cpusec, 11.3 batches/wallsec +GRPC/OpenCensusWithAck 20000 spans, CPU time 1.2 sec, wall time 10.2 sec, 32.8 batches/cpusec, 3.9 batches/wallsec +GRPC/Stream/NoLB 20000 spans, CPU time 0.6 sec, wall time 9.5 sec, 67.8 batches/cpusec, 4.2 batches/wallsec +GRPC/Stream/LBAlways/Sync 20000 spans, CPU time 0.6 sec, wall time 9.5 sec, 63.5 batches/cpusec, 4.2 batches/wallsec +GRPC/Stream/LBTimed/Sync 20000 spans, CPU time 0.6 sec, wall time 9.5 sec, 66.7 batches/cpusec, 4.2 batches/wallsec +GRPC/Stream/LBSrv/Async 20000 spans, CPU time 0.5 sec, wall time 3.3 sec, 74.1 batches/cpusec, 12.0 batches/wallsec +WebSocket/Stream/Sync 20000 spans, CPU time 0.6 sec, wall time 13.5 sec, 69.0 batches/cpusec, 3.0 batches/wallsec +WebSocket/Stream/Async 20000 spans, CPU time 0.5 sec, wall time 6.1 sec, 74.1 batches/cpusec, 6.5 batches/wallsec +WebSocket/Stream/Async/zlib 20000 spans, CPU time 1.5 sec, wall time 2.0 sec, 26.3 batches/cpusec, 19.8 batches/wallsec + + +400 large batches, 500 spans per batch, 10 attrs per span +200ms network roundtrip latency +GRPC/OpenCensus 200000 spans, CPU time 11.9 sec, wall time 10.1 sec, 33.6 batches/cpusec, 39.6 batches/wallsec +GRPC/Stream/LBTimed/Async/1 200000 spans, CPU time 5.3 sec, wall time 9.5 sec, 76.0 batches/cpusec, 41.9 batches/wallsec +GRPC/Stream/LBTimed/Async/10 200000 spans, CPU time 6.4 sec, wall time 8.9 sec, 62.3 batches/cpusec, 44.7 batches/wallsec +GRPC/Unary/Async 200000 spans, CPU time 5.8 sec, wall time 12.0 sec, 68.6 batches/cpusec, 33.3 batches/wallsec +WebSocket/Stream/Async 200000 spans, CPU time 5.3 sec, wall time 11.2 sec, 75.3 batches/cpusec, 35.7 batches/wallsec +WebSocket/Stream/Async/zlib 200000 spans, CPU time 15.1 sec, wall time 12.0 sec, 26.5 batches/cpusec, 33.4 batches/wallsec +==================================================================================== +``` + +## Glossary + +There are 2 parties involved in telemetry data exchange. In this document the party that is the source of telemetry data is called the `Client`, the party that is the destination of telemetry data is called the `Server`. + +![Client-Server](images/otlp-client-server.png) + +Examples of a Client are instrumented applications or sending side of telemetry collectors, examples of Servers are telemetry backends or receiving side of telemetry collectors (so a Collector is typically both a Client and a Server depending on which side you look from). + +Both the Client and the Server are also a `Node`. This term is used in the document when referring to either one. + +## Acknowledgements + +Special thanks to Owais Lone who helped to conduct experiments with Load Balancers, to Paulo Janotti, Bogdan Drutu and Yuri Shkuro for thoughtful discussions around the protocol. + +## Author's Address + +Tigran Najaryan + +Omnition, Inc. + +Email: tigran@najaryan.net diff --git a/text/images/otlp-concurrent.png b/text/images/otlp-concurrent.png new file mode 100644 index 0000000000000000000000000000000000000000..17d1ae18ec6e1a9c76bd07daffa5b37da8e15f9c GIT binary patch literal 9983 zcmd6Nc{G&o`~OHHSxZQ=Oi7C@W1Vc78OvCPu?~d>V;{y~W(=aTOcB~>L6K5g5K>tZ zMWtx5WD8|U5=BXh?=|%Pe9!ru&-wkn=lj?9oH6q}_j5n@b3fO8U9ao)x^7482vxnbN1cHZGU=)RP~{gnW_Pya0ZvCp*{h=0TiF*%P4gX^e%PuE|j*T23kqeL|Yraw6s;V&{}TG z{mFimkiTQugt7yIgUL!LGi_CM7;2jh**hR4A~f7zNfQI-_>c%nF#JL@eA_y}7YY6} z)KxXKmV3|{FuabQs`_?lH>Y?9!KBQ%J>a7OO=bafifmwCk6&o0Uod64l?E>r zzTB+GZP7FZ@&+IAM+^nmVRhyG(3o!A>+c1|eMCce%T+bFfdib|}-- zPF;f$p>0XT5Pj(|Yck505^O`$BvaX}5Lc{rkhyD+ot{n@nh}J>63N!;0k*dE&;U)W zgO`n;cBFQAFpj`-3ugocL}9I!P#9Ja!Ow(AF{5f(=#nWWS`@sW58BN;5XHp1Me5jK z15AhnAF{U_49WQB}SlqXjD5Bl#6Si zFNNp`*ZtTmd=!;JwFvf!bTA@xyI>S1$jly`0;3b^W$GUWFMx4$bo6mz2D35VK~c6o-d5^p z2dXX3nt*rI({eV83<>jbpfG(=8rB+=KpY-V)v-0z!f6ts0^weaWfacLIfP_yq6NN; zaSn4+cO;>7=^;c4IUpd?!I>TA;AJ0TPh#NAd_%&B3;R@2wcD+Gm#w9+%t3a8r;&21d4X<=0Elhj=UHE}-b+M1+bdk0$-%Rxsw zEXa+-q?tru19gJ5b(#Jq6!TEmAX9rYd=wgE>t~0GveR+2RL5)C*$0_>F}zSFI#|4k z1)kvTYpssg!$zUBqi{}Se;tySH(FiWAu`I2L}&Wi+7fKTLp5n(rW8FrO)YCvb*w$z z$_5jp;l?&au`K+EIF>pIZ^`s`GxZ|S^}Jp2ny%(dXNH!qkAp+FpJu3|MkLzD#SZI4 zVre<~gwb7m?0vBz5e|V~t|UJ+hQbPBMzX<-WORtDMtEc>j;^C&?iTE-fg`zuIC)WN z8bOW$SarXMP#2v*x^198-P_g20v&>(2VX ziiRH3nZ_Vf-Q1kOVir*}ZA~+VxedyjVP)nWVFqmh5u|VnRDhl<+l|}T!izw4i9{1! zd>QJN<|cY3>I@1-M>~pP;^k&drv(I)>}X_fI+{WBc6GD0Md2OsIf{TY^g5XfPw37fe}vXj@sOybfP*^^!(Xmf_GT3 z8&fZWZB5hh$GQ1hGuY74OE)Tn9u{F2q~(GNcJZYUP@29>F1Bz#Sm^K%t}KBJoc{%B zO;ZJ(_kjq60s@aSab#sra5MkdAv1g zQYS_&Y+mV9$*ET*_bHJRJBXXlxEB#qoLp}T+I)2hYQO4waesUM^(-Z~fZ=8}?Yqv| zyWFUz7wsh0aA@(fe;V|gHk{>cAp5qAY8n&|ZP`5IYaKs+Ts-()^#+`T`s1di57Vv2x>W`aA3uJqyB9wC zvcEr+vHeN|{oIrHk5f!=oRk!7K*07idE>O1nFulQV4aP>e*Jo`s_{t{O<##i*r*$F z#{KA6N%q#Svkw+G;S##a{5}jeB=byn+;U%otY7#uZ&TD_Kx%1%E~OD;_G03yp0x&n z?`ooF)tO)RRnLE^LLi)+j%Q`@SM`Y?4>b?hAKz?VK0G}=UF!36t*lXubV%h!$rQe8 z*RK8iHC|jn*{!dy5w{St?dXc@?MH9iP_c=BabDN^U3C~NH2$g*b^0Xk6{#C*+X=6l$a^a&6OkFbcVZh-?4amDnpa=x6yXz*g36d ze(8PHSaA7r-o=Xuum^5sac4?U=PmN9d{YHv@Y@m|k7C_@YL%zJ(Bx8*n3R<67y7PU zyA+Trp0)d;gIO$T)vPs)s!es?==0~!l~e2;94h86U%sr6AJ6RJK z&oP$9VzJUPG8j`+K90cf@G#GGSy`D0PFh+TOfzzoIhdU-3yX#zmH7&D1afk6Ogh&W zWeW=ncmLj>ez~9^o|AF<^kth`W_^7<#)hyMJ{CRu&Xx7f!UdhdIW^#@3-~!#f^6G=a5FJ2C#f)3bAE-))~GTj}bDp3c3t zQag5{?A|@s^YWidr95N8PG#3#yM5dKWLZH0Ze#f3LTsi3KfFnroS`7HzPlpG{KZZc zm6hUyFY~Zhi;MZi$>SY2d7AZdTH+hJm50B@jrP{Y&R=bKk)Mxz8>|B-8&jmzIx_j> zaxS^4WUg)=n-9ENQQ;JQfG~fS& zgS~yZEq3x|Or}tShn(ty|rBs%xd;M^8R;1eA=?4osZ=(XY zT`dv>m(I=2y*NGDd+%^snh3Ua!ZtKiO-4rM<=eMc|L~j@IDGi9Kb5MjrIWcIy}`_m zL`V{s$UI42nKP4^?m)%EnQ_OuUxhgn!!9)c*pw{M%Osz_^!)Zvos z6?w{|b#(}x;I{}QhDa1gr1nJCF&`R;E9&cS1ki13A;(Ic-K!$0;(B|_es{owuC6Y{ zn;#mFZB#%OT)C2e_bzFE!(I~;lb5$vJ%0RH0eQo%LNHlm6NXMlaRj7P_i^g4@03?5 z-1Bp2X7#}N7<-D3&whV@fx4gW{4vIO{fLhlI{nJ#SLtb$Y2Hm~2RXEXIv(mm^khx) zY=4}5-Ny#Ee$$0o&)Zjvj<#QS`S7``Y>>U$TX4yO_xnPEyUSOf*P*^P68naqAI|bz zA^l)HzW8u|jy|(|G?Yrs$;ke2^U}?mHsd@JQc}s^$2-Awouh9l4;w`PxbY)-D;m8a zF){Jdf%bZXq+tn8X$u-s0`I%ajpMrq^dHH}$#vvjx_&*#8l9Y!RNgRP*TG}(%W&i% zFF)5ek5tCaGY}7r#lX&z@7UwJ9yK)uHFvhRC(b6Oih~PCTeSeT9_Ex#nk5k*n46{| zji(khB4CZ;vvtnzy4aQ3IWC+LUL6TBx-y3Sduk91(S;>S2nh=xI}r}?rx)|HNr23!!i5VwGq72!W|@+42{m%tKgj}9aPz?g{0$ib7g zMm*w!6P5jGuXn0QEv?)>KiekqA~>;m4<6_!sCN5ZwD0@=a69 zi>+c(E7PK;NBEvsl2q=T+Eod@|vKSjURU?dt6{7>RXl+}m_>Z>61+Q(|MI*@S3vx^k5aEdP}&TeJ0 zddj{l$ml|`heJM(5{I)fCE4_cbb>}mf93ror`)Xs*tN8gV7^ggnrB0td4T(Ofa~f9l zGq}NX0>hg1^V9X>jNIH?!vU2&rBTzqWzB*+HPrlIfh9~$Ah+MIs>&}Gb)OJS^P~iDon;_bURimms%m4hsQfDNfJ&KEJ}-|J z-ToLZxC4aoq{|y0kd2Cp;-TwkX(=cvneH8_JID)pzN9M{(!nN2C)2n%s&6~o&MF0o@@7ykpTV<&# zYHP0#t@$pQO;BFDZXIukc-YS=@`U7i$Q4{}1b#cxdLccuc5W4-ByRD*4fiU^HIgcI zLB%zarPS0Yw4t0RU|YoKeDhcwX}s!mo&IF?;b+e*fu7v(d>{uox0~z;*duH3JRjcwVjySCC?`wJe=1thtz{B|SO2<-D>n0eR6%~2F{;WUWJ56wR znUlGUH3C(AX+Q_PfL2*pSiEek{rNtH^x%MDcTZ2nmw5Kp@{+034= zKa-^i12t!U_#@mnPKOKvkRYhXF zy*D>+Py+rC5W^*IHv#_} zfiXk2hj&eUfAY=goi6a$#`vl-)1zmy!kf}IDImeM_ziN8A3xaX5pCnr0x21(tjrG& z_&7d}wX#~Hy6^7Ar*n^`JpEfA)6Jy%tIjOusUWz#7mvqxkC{eCS7mx)vAnx??>2k7 z8gbqECWg)44IV-ykp!05S#L%ic2LI+Zb}0P{|dBgGXQt^Xv-#tmL>W&)#Z2LY{fl?LqN?)Dv||-g+a`1 zRqXFOKuOTU!(VlEtwz>&+}sO=qj)aqzPIw^^y|x3-TId%MX%dV6&39;U`-*$JByPa zdmSt)Qt{IZ@b{OFJo9Nj!D%v@`wYJ9*1LTnF>}LN_vs$BF&hx&(fhtt`T2lgIQYW% z4M7*;*UW5{oKcJbV%zrZtDoqrsfi+{#tJW_od9r?(Tx7_Ilk$3Ss8B#l{NBw1ETJV z&3X0Echv%+gA&Krv1an(Cs!3e4Dl}19T|CXeu`bw&Ci=R5NGrVC*tJvs<$__)o5Pj zW3ncg5lGia6Pi2fnTLNOCg&}?;oJHLn3EZb290{Cp`8a3 zw<=;;sbM}(bo~>HijZn*wn56kglI!g#HkCV-c1>&P9;FDS2Qw`104fg@Z!_SfdPeg zG1E4HIuQ2H&+DpPwE9&YHC^J}B*Fy@&=a7hKuQVS)AT4fzWk((<@M`#Is>0Se?A4I z5x}9CxTTd94}y=6&+WlWkZYTbjpYHV-~&cmB1>Z85WyV7=pS`s5g4Mxz6S?3AU8)eo;N({KUv@qom|yh?xDAJv;`PWmm6S?7afK6_)@B zG5^YyRX7Qnrh}){7ww=91ZzuSdtm#ogCe4$kjhou?`xsrwX~v_ok_KjhzG(v zXU7j7uQwWLvi6wf{=?+QL+9Cx5@_dZpr*RNj-Q7uA3 zLSAlc<)EI@OrJSoEYY#l&*S6cymGUBkpVQC-N`qLa;N(G`hbf8d~VbUMu;nJ-n@BF z3y9dy-4$!G%OUVI)Vh_pbwNa>^?z>Q=t7EGhPo$%-5SaCn|6 z5*Io0A<-+_<|Z@@#)Dk={29k&>Ox)s3S#u@ZpvwKjiScTP>bIWzLv^XEdO z;+~15rVmHzdb+CJb?>hi5f*+p{yiTQ3mAoGI)+|Ubo9p$2CL@X#a2kQM)RLF z+uGan3JaC1Pn%2sy)9|SOqQneUmt)-P*}E7r(L3%_Ulfq)vutpa`MNy6)J_Q zsD#nOraAu|t`GMUvDkm2JJf*W80+)o?~83+ks`zSC)#s~BuDg8xS!c!m~f@&DtD@n z4V5*oo-mxoBL~PjUGLIeC!+)n1s@s4qv%)MWZRDhW{MrBe(Oa z{&&0NsSjsIW98+4FN&JIIH~B#HU5VBHLFs7v7(J{%!_HFdkh*+-sluBC1ruNKZ&b38F7$>Kh+1X3?@5?~F z3fP$9vD0y)sbZxHg~krVHqX#`?Ncu6U&^j{q4>Lba*?lTV;ZlzT0a!kWc3*;1+al4 zDzv$DD|9w#n-~4^A^O2w?$#@zzg``ZCy&NWrgoEWKK6RG)szVG0mukOM!qU~U<<6~ zw{MiDte=H5arNcsH|ntq5!;G)uzu;*C>iZ;%hh(^FF~*3`J4 zFDfb;0N9@%d6Cgrmc1KR8ePd``AGA{?b`FL!)GXSIKSZj%28&p$%|qKJ3>NIxmJ1R z>9Y)0b^7$fLE6RQVzq*=Dup6k$HlRu8x#wSUuAF^ z1SdV6AF)MADX*+-9n@ybfNfiRfbz@Ts9MAwHkOGj%b`pG`*A$QW zExS26zh@&}@z0SCw4aTQFbJ(f&!1a^j77T{u*25!W3qdW@tm6F?$Ie!|rO>RHpfP(gqZFoz;y`-ltj+zLPngMwESeD$ z$4M4(xQ~CI3IobkyOgY5?DTHG)fT1u%;ghq1(7Yl z!z~g|eQlE8D5J0aV-N46+u2M@tHZU}qd&f>$Q2wFU{p+6S6!HbiE`&xpQ&Kt@#=4m$@+pEly}Xb8viaP6djvZ?PYT zo}L8BrKOcQ-1bn)V?0^@{e#8to7JK7>Q_x$*$LuWb$=AA~o3Mk(8Ed@ z`ykR;?Mf#WW^&=cuk8oErg%!rY}^~YU-}3i+SOt@TA;nHZU4ygv;XoyAH~O?6dgT1 zMS+z0-^h;MFOh*KNZR+xVIVUlG!LV+oO2D;pK(-`*K9Wz&4a?o@86@wx?0Yk4PWAL zr%ooGnsnLja%?Z8*9uM zEJ5Km1J0HLFU76Yc$@)iK}OU04fqqdW*G%YhK}2g-P}k>j)t-HUyqH~2|W z0*~B23L7FRg}H3OR>N6Yz}no{AFkFHj5Znnd?-5gL4HwhMrN~f-Vg-d5yhV3y~x<^ z6KBsJnLIFCrGWfBm2A9HoZOhYfvd9SpwJ3f`|{_LtuT{J2PdbPQT=`%@qjnst%kaJ zqx+Xo_Th0?i@5x+2m7C$-U;h%dyu0Z`zzuzRHQJ=SpCx5%M^NicY0PH@MaH=HFDN( zs{#1s!DxZU+>~O~5;@*62q4~=wn_iru0ZkSeY=Y%NS$?Z5E;NyyfzYV<;bn!!Yxpd z9^h_3ve%J|+^vn}{w0t;Jj8tZm$Z@+l0<3!i*d!2WUTuuwQ!>8iP^IGqiY}+aHQqd zY%sz-pT#c$_UiP+)PFHOSiw8wC9?HcXNgtiy-iwTTuYB{;LZuy;oW4r;D)6%ag++w z64H99@Ddway4kk~d?OOt&mIM8x0cK7P6M-B4>x+wl&@A!m|D`ni zH_{9VWhXwaoXSSE+)AhIpav zh1_0enLW$eBGh7iW@hFgPR5B7hhpb{D1!6j5-ypir=1A@&l`ndVHzMPop09XVUshm zvxShbV=09|=rg~xEg-6A-$h&C@lfe)5H(JHzVqVWcj(X90fKXRClCQ!2i&3=r8$%D zNf(eWWc|0{<_c~R2{sW*dL|I@ASuPf&z(QdW56zSuVHJq`KZa^DY|y657>AEM zFQGN`73Y<-@bi|r$AX`X$!9oZZp9xZ!wjWh;{@06u=Z6slWKl={A!K> zXa=5UP~H-_1gHoh>Y$)J)v-4eY7QPf#PLs`pt{V5#KgqJ#Am}E6;#U_pFFXU)dzI-Xh**0JoPNRuw`n5b7FMc4W;1?Tf$Pw6E86wOQDSUHnQ^yw&)Bpe-BasY7 zy;o`7hpz+Ii)&Yile=zHcs_{A>cvxg?$`ukm5(m_2-x>G0Gt4_{!{z)SFqa@`!W3Y z&#wqHRJ-4dCA0^cQmMP3WM&6NGGu+OVKf5KbB79>Y*5z2z%G!{+|W8P@plL2jgq4a z;2*kvaQ_#8irC}jg_JOT_@%FE@H?Bk$&IYv7+Nh}Dy1m>w{C+iDuLawv9Ymk#j8-R zdiON98uMiQd*CRicDu5&`MmnIvNDHx%SPRMeIeYPJH*S54oTWwD;x^|9jazxMe;WlyLTU7+mQ6XjP!x)Os|a_zEQY)ZwvgNKYB?iS@!UN1rT^s0`3-O|Dpc^3WUn* literal 0 HcmV?d00001 diff --git a/text/images/otlp-load-balancing-timeline.png b/text/images/otlp-load-balancing-timeline.png deleted file mode 100644 index fb7f6d6e86098db6c809e4c2fb6c02eec604399f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24557 zcmc$`cbF69*FU`KS8N~((geXmQR<{k5^1JQdYSZunmXx|K9kUuqSB;yQ4lE$EW*-R zmX0*(W$7Jc>17vKc6rYLexL94T+i?NJ@5O^%N5p5GIP&8_kGU!lr!>!K_{>C?#J&I z6cp4^Dx}7Og4f!>-@b3xf=`~jRXVAlp!E-FnLQn){lSQ@pcO~*^0!uOBuaXN{-Dp> ziX&~sX0s8Numd9Kz~Y%%+*TYBmjyrA+>UIX&jeaTdijJ-UJ#p=lF$bI=mIv4l7{FER`BJ$#JjtrK_8*~v#R}`)pe6>1Cqtwq9 zdSZec&3AG5G*^Vck}#_hb46bbVt`fX025`m;>h^ctjd$nQZfVLQslLmEGia+R2-S! zlQRWFT9yY%8%c4jjy%k4Oy$4 ziwjJon!rMGsf~zv(jr-&j2iNOOGxE6dE;qs&f>5Ha!PYDLJ(rFQX)bE3ZGUKciHqI zl|;$4Vop@04dZ5RGH0gMIk(xvcd%qUE2iKCL~(*tWR0#QBBgkaj7p8B;|h&}miYqd zm@*#3T#g_teo`Yc#!-v9lIIY|lp`B*ffNLeE+S1DwN04hA7KLMpCvI zrPWC?%7EOC2DK(7Vvc3QNee0p+5_T`CWw6O26vrNnX<>F^5&RV! zajS<=sx<^*RTJq#(a^W)u|0yLugP(TZQsuI!EN37Q2>23^Gh+&nDElSP~altV(IZXbh@S z4%DE}W{6-Ab8@5|w9*0xvuy~^VB?rngpE+T13uCfNa-^|+QxOqI2yua5ZkN)Ys}0hq$Defu=%!7 z$d=Dg#;lQ_)u>{G*=0i%CbPvUqJ%WtOXa0@1Wkn~oU1b0Xs<(VCiv=9LhdF~SsR}a zQ%=%i6!Y^$E-Fs4?JyIE0)kJh4#)y=GshV4M+C8iz{2B4?YNs4fv+H2Fu#)(^X9bS z3>THyEIt;+=47H7_#%}|p{8Uq6^JR>cC+7u5;1Ya%duL#sz_RBr(!9u#hfz;f@-6Z z^3$eNBFqwrJp8=XZDtDuN}q!3mI<;Jo>R>-S`|9GNR?1zb24KtB$4?2er9fRGtcQX z>JOloK+k^U) zaaSr~kSo0=1b3NeoK0AQavvI%AZEfAR6tUA*#S$49Yq~Uqh4wE%cx;?5Pvql5m&~! zq|JJpnxE#FxRfQ!j-duGA2o3`v7DUmC6cg+K^=uKTcO5KRm>RBnKTX!^EoadgkF_W z%~u5EUQXI6!^0AeNsjYuv^gC@@^lVWDq_qwC>>cD3jfvfB{6|c6_fM1L3uESD8g#O zDB=o;Y=F`OCeUU$NT?CXkRVsVR>AZWNn^yR!@Vfwm&L`hSSahX(m`#+WMX^$3Krjy zQkwLrJE4R0(uwp4&y^2jXgZp)P%sqBt?>$tI-^;}Gi%~;Zdw5!!pmaJGetHEcO|xE z1j;;o#wVPdtUv)U0B`<5g8u_7$od4dDX${X2j_J#CZdiMibEv)53m3qy@Z9N+nr8v z8CWm~9k|KM5k#edcrYr__qm*^@q;r2KJ= z8xwI=N^d?-P?%XL7FdK79a96WVF*_$ld%bm#?4-{L?p|J>_Lkq&bDM!yllWE(})rl zOOWL-8lcd*O%|O}Ac2Br(Yq{kNT_CeWKnZKLi0>qhm#a$*laQ>=UXFYg;*s`VWA*f zWrX=2=fC- zEbG*0?S3Up)y)>dPorCpIxTK~2DOX)Tq0yg1WqK#5?dT5PC^(@XxwtIFz#20r5Ovt zVJ@pm$aPu;?KZK6&XCa{il|&^iz&&o4EJ1>jMYTSI+Zw`L8C;snz}<->AuO0rI<*MT zne>w?njdwcHi1dTXUpZlC47>6n3K%XN;NEqSYs8Mjd4#{mdo%t32w+7aKt&GbVAJv zhWzd%T$Zc189cxw{BX2G5DKV+JiX6Li*)mQ$(ks*JlxDls zW#Y5KQlFRL1=R^mmCQ+U@i;$}=89xVxty?y<2`X3a~;L@q!$LI#pRV-mmHu7+u1 zc%H?!=!^;;CFCLw4wlyWl4!``6YBl^6pZUZNv?ry08cVu_GQLcg zPcbzMM+|(HB&G4n;1F4wjGJ9t(&NykXcejxG6~97Yu$8Gt;P{kEM$x7a{)|;=k;!# zK1%4lKqJLm+Rw~0PRJw~QmS)lxW0@v9;2*Kts=M=jv!FJHYf~Av@)4442P;E1Sv8? ztrWAAhOo+l({huGMq(K;l`ARg_6uggS##&jepuCXPFCX*84wnpv5&Ft4&k zS#p6nZFibDc|T+Y1enjQu9@43;IfjpL1@SP-wtF(DCB})_36nnK zG52`r|0lJ zDVd8!`9oMFB}ekY91%jYG9FhE=SKpTtUBY2nOGrfB5jUPJ{{)uJB+@3+^k5UVv>~= zvcmc#%Ye9XzDdA{g#Qg3C|&jrY+Fhlk?SOM&}?KSd9O6ce^UuSPhY}8+-*e}mB3~B zy|`JEvFB{^w3lPk3*9=7MqslT@L=8WR%}7S$vc@$Ok1(29D54|t zN-fVRSE-RaHzOlGIeAQ{7l)%E8>$oK=v-dQ4&-HMp2cIExrS5%)5StcEWneJ;F4$mj^vmkZ}5?4*?~;__5huRrJahe!?<5%Rqp zkDbv3hERrU%Y|bSQ%1pK5vq(=lMSZf3sca62Uy%J9hP|lX52yt^?oy@qT@Oqg3Hip4u)l$pv~bC4h<^#T2rrP2fp-TwDif64;4^ zDI7>gm3}YJ!Zxuq2~{f04eF!XOeE`z0DZx%UMn|Y^9U?nUCQCfh?&nUOeVlfmt+%G zLM6sbQiqfZ+8n5r<|#sAraFqTm`>r($OO_{+D&lcS|X>4f})_M9v`7jvqFv#&84}B zQJIu@4Q6F1MtiiLyqzNv*g}bnLGJL-7#>h^j5c2=zzk@`T^@~$5hn^P$}_6+8B!FK znU!j*CN6dvO^7cm$T`GTED+Wyr3Q&vlQ)VHojhRF@K}NnsmLo539B=0!C?s070M>O zmQ(;0IrW%W#w3YYDU`ayDJ##IF-N#ws|6}hKqLVr#Y6H|qt9baNpKcHN8+&SSS;mA zC|rDUA8;y{|P@)0=_N$AA{sTFe#SVXG!anym7%fpLAL@C^5 z&)MYxAwQrDvk;wAZEjyhzqwTm^@+NlM}>nDT@b4 z=nA;Pn8od8>8yH|P>|rJeYPx%WtTwd(Wo&WJMZPNS$;7pK+_R-Ug(pW{aTSOftf5u zUd{olibZtXP|gSSCL^?vF>Z**a>i3)u2d+@+nfQvhR#N_l4y#~$XI>{D?|zmI`A>X z8a>CJl2d9u%fb@GNraTRtpwB!g~Ad2Y?2F= zCg%lM5erdV;^moepW7Lxy`+V$w0Idt3oi#d;>4A-PUn(m;jIA1l;+^la919-m@@i= zq>mk7G9Y6z`+xvug6VL?ZcN&esKyrv+wu{+&==)|MQ)v!4>*D4gG!|X^9p4qlOTD>%=||M-xONNk)YS^RcXh0tSJhC>mkQ(?SJBVswa!KyH>t z*n|w+DN}5f!p?Fea~dV&HVWEP>@zxol1R$p_eX_D%%Rq4*@PgJwMDsE11rLJOJu0g zEJ-_JLZ{Ihumr{4lpe~hn1cyWmeuTFQDk14O+*!G%Hfvsj3xz@gw&*>n8W7JQ7)T9 zEst9%aX=IVcSGkg$~aPiJLFO_WCG?yAz1@Af`(b}J1^qb5OFTZ60tXE_K58oB+YYL zJt~`z!{YNZ;!rFQx7r-WOxz@7#0A@nKrUd;a3Z1RQ!cM7;+0vM1WX$uai2Yzhc5*z z0=5HTQHr2Herc` zMo2niLNb+5vNSe5o{gI|Y1|{`YIJFvPGk|7SU zf1zFMDC%WyN+$KOwS+5)DKb9bHXfnXk49n`cq5`HY2wInFE3&c%jAU57}c6{5^cr+ zXTeMFPS~7eLW7wgNie-nK!mNRHSSC4D07a$FtItv)3|K3Mi`JV`Zt%v#j!L;&vNaZhl@uaD<6cO9u}vqo zXr)ns8>pTH&q|Z3m{=QCOAJg73zhP8UhT2U*b(MfGop4GaE+Q{(8<(Fg~*$+6FCsc z2}T#m^9YKVBB7kjN+~sPa$4lWVq`X_Q{gP1RYu7@v1mBKfWHqsN{t#+yx8xFfz)&b zLNYiZnwJxCpHgK`Y9SKEq%>kl@D!RDDlt-c%thr%TZSXyDxq+A zP*qedbvOd~xQ!Q9=pD2VMS^k{5wzKDcK9mCm0CRsAVxt)++Yhk5)?|i!HbMo%_1*m zm4=h7IIT`_9BwPrEXBaSoT)SKp|`A%UPcp~O=Nu6=CPsh-wut(!|r*zEmPEr>Im=00&2f0g7qEp);gmy<13bng zTMUbXsWZ4n&y%tQFgPv)+UNCTUig_5;PvhXgEvF3lElsU$~lB)w6l zRfAc)eqbxUD9wwxZ$mYqdnG7jmMOB2z zD&spnf?UF?rG)`CPa+YzqSm<41cM?@TBgIGW{VBNq+4Mzsac3K&Sy};La?I=77rKX zK%E+4mjxj!2wsHel(vMC^@#V^V3reSG8p2%#|SE0yMT z^HLOMKv+IoPUgl#6kBfg2Kc6QIIoK5X&09=C5fCgpi4y{955M`7kd*VqEj0Kd`n6u z=7;2l34#A)JAC>5<9pggvb{2;5M6j0P>HSe|RtBmzhZOS6qJ^LCTh5;lZQ5JF;`!$n7QDy`e8 zCWR_JZj0%(Lg@4;Wgc;s7ZJHtydWh>B-q?+3Zu9}M>^;ZD^wzvmnXD^!*)-?g7Ptz zil+2_9VZ_!dF*1AnG?%sgJzMyhU6^qG#62Yd3tV82uQ2IO==&NwDS!fjl*bEa?K8{ zk2WZD92(BIQjWMNn1LQ2H!Si6JfJaQj(l24C}JXmi7iT~@@bF6NJo-j+Oo7}N`i!m z6rfm|70zig$rz=wMC~b5#$)i@Y8EJR2DQ`U4>+v^mgidtwM!Rga3Y6>L_v|y7ju$Q zj?fh}`Rz_iOh<<8q}za_O2nD=sx@Iy$$B@EmIy&?vKVL=h3swtYWL{!R$E?~RI|X7 zw21tAbCO{*)?|?XLarGT&a@Tw%`Z=i-4+*sMrP9K**%y$pMOY$B ziUN6|iLn9%J|w8oP+>ruq$>}-7bcL+Ts!PZ%H~Nj^jsSw<5^!07lg%mXhVabMR;kq z(Jak6vdX9^$w^yTd@3$AhQkz+j+v9$fY6za@?@kJiI@ziODxp8^eLf-CHFum=VKwG zF{Bmny#@t8WOD0())|Z#mk#*i5`LPe3`zOU;1gL0ai$xsrmODeR8lLjFzG(m3zQrBYA%&D>&k|J7l_lX+Dv zjj%FoGc&GJgC+RJq*w3OCzFifg}s1XxDAYX121hnDF|sf0xW9|2S_0g_EKy&B;u$> z8a2^=9xI2)d~{G_r4jngSSqJ@VQ(jtf&V6%dRB!XE@K9x^}`*QG! zAnDD;semb?H|f|$PsXNJ`@~9rj$l~6R*pD?E|G$A3$P#-^I6l8AQ?|vjaDz2FmfHD zlu;6khg%Y4(Fq4p-Ud)m{sXmUO*?@0ewoJ6&STfp@GecW{D`*k;<@8)S7n3 za28^A#1&D!Kkk65i7Z)9&>D-XC@u5WkEs=IMaCwQBm_|fw0N}8@|9_{da)`f)*v3U z(aJSj!bV)4RK*qioEbsk(FzJQ29B9z5w^M}%Y2tkV@Blb9%; zaB2x%oQv{+p9Lk+xH&?Th({+hTk}NTpw}DOlq_Pjr}M$M&gwGy6gp!79^wEoBX^6K zI;EG(xIB%(!sgq>A#Z{gl(1-4%#o(t@wm>5xQsy-ClVtSNt>DwTfjESFl+1~*=#xO z&WLEfz%Nf_WvXP7RO-^0L@)Km% z?9wrIy)zJE@r62;QzlZmr3o*Q5p$VDdExnjL}OAr8sKHkCL7l*W<}k)fJUrI+JrWg z;)LAL`bjC0dK7a>*a^EWEwDSYX%{qq;WVWZlPKkEUz*{D;6+igToRO}L#Y>oR%YjtVOSLO2NVsCKznwNO%!J3d>(4ub+|IGHBte7M#v_xmlp$lwL32hKGKAGCh9avHT!U9&CKA>V9l#S3 zo*-xTTa~`BORJT*P&ylQA!<=9lhqnEvYf&$kXm#++(Ao-6rN)RP!LvFBoLS53Om>7 z;K@*SAdC`Or&dBogg!&aYH_+@lY|+>$&@M){(rQw;M-SEopEGu+?;!&py1O2rBr05 zXWlxK>#wD1cHS!NCmBMbQtAY^&Fx<+z{T9yjT->i*N}akC#xc(bx~<=Iqe|DVUoo7WXq zwx3=8;9hqB+8LjS-*$a>^I^wt-u`US=NDQIU8bz36Tdy9<*Q%E4&Jgwe0A?M$&`-0 z=qrUv=ov+?q zO*^?Gb6&N+WZAM0I(6#wb@t|;P00;ICQPVL?Em@APZ8vU&Ye5|oWJo^#qBfd2Uqt6 z5B&0)XUC|6tLnb{?wrJ>9Y>1#w0P^Sw_x6D`afCz=ItkQm%xeXzYopZ{XBl#7b$(e zd6z%col4*ax(pdP^1WLpS8o05uQAzMCll8Xd{$7acH?i(tjpxC&7u~S+*yBW`bd~? zz54b4Sh0fh^vL3iU(8>yU_tT%*T1*%%$YNh#i{iuE7cBTPbbRUPDN`Ep zW2gI`+c=;LEYi(0>usk-bV)8+OO{qoZZo_8_(pyDk8`Z>kNfE-!$MsyF z9ew?J;B4;NCqMr9CvR=vzWvBT(+EqUHCTSCtSs^Op;pmZ$CmVX@Z{R;aH(1_ZD&n& zRU(<3V_o7rQC4Rb4%Qe$#uMHf%b*Hns9m_~;^8Ft~8lSX-X~ zlY)nT4>FfLKDsHt*mT#qGL*P^g7wSO>UHf|LB#Nu1ujBVa^&A{q)j*4iy!MW8^dPI zXu5Xo+HcCfSmfI?`QC``&xX9$sAHh~(={k-|Rw^B9Fa?x4qi#{ka&3_;Mw0A5Y z%7g<1{rU6fzcCu?$z-xoP5EP{^v=H{m&+lPi^I(z-a4)x*t>W0rAwD~seX8v8#?m+ z--qYF@zbRkG994K??tlm@EP>Gb7IL*BS@j5Dtf z9I*7hy=%XU#rJuZt0yR}Qt-}ak?}((e6XeU|DV6^D-Irh*imHvDO5cvUhkVS+tlum zq4_DFwU=(MQ3>8DP^nb({atMyb(Gk@|B*SS00PWZXzft4=YxiG+=E)p{8s_2cc1DT zw*NQ_Qg(r9{+P4Ax8KA6D6OY^ovGhUf%=cLR+Hzhme!P)KKzfNKl;e9I@aqy4tnzB z$&o^v{tkQSumvajywm2jZ(u7Pl^;L8zP9VLwiUK5%7ULJOxViV-(@bp(RI$=+*DTPsH$GF`mDRE;#L7u#p}1x72Ms&KX><75AqMs&i5fZ z<}EolPu=L^rAx2H82bNB7pPhZh%fe`!CnW3P4pTF^*$6)wjcSh@b(-@S$}`=CKp zp;z!)|B5o=@zba5;Gvecrq`c1?C>1f$f;d&Y@JTmvSrHx-|+>lwbQpv{K|Cq!GpQK z{WcWpJd`0#-@c#1W#)#DFRk4e8C-t6s64YeJz?Cq&36Vp@5iiw`@QO3D?<&6N-Cxw zEN|CTS9y3{rhI3`oUFEINq*Avnmf;rF=27+HaT$Mz)5=s^zT3F?9MM5=wPVhKM$z? z``YA{cNt)M5pgT4%CB76Ubcd0SKa^a=C`mrm&U!@1|JX%2A|yx413+DCrhhtuLr2wd2#1}(~iPY z3UUoVa$d5#p`tpsV?3mK%hs(AZOElYwwND1wF=7qYs;uRz5klsoxJCHxBOA%()DDU z_2q>{8`&?X*=OLBVUs)ba6W8YR#sLVIQZ@P^L=-W`D71pnw6)lOMC7*I9INHI@{9t z4lpP9eoF`t%xRm&|3nRy1|V=}(bMW5UFs2kJlzx;&zZ1q;3x=518KAAru@{54vRbXT(jx>55KT)?7wzZ`>tI}PJhji z%P+rFytf20_5eWLjie+w)9?-h<3RU3_*7+h4;>Fn9F|N7UzCN@1WXU^xf>U_NI z@~#OheeG;Zx1BrJV({a~^wY{ab-yv2Ke|&=*?iBGPCIw*eCxZ-o5p<7xj5{go>Wzt z?Dl|h*4Raho`#jTPOT>Hp5I)%d6&inaV^=RBG8_RQ2;1l9Q)ol&LZqru3inz#?}pb zKCnyIu1p5>T9-cfb4k_Z3HlSO$rc5PL_+ZO*G8l9+me#5$CvhcV|TZ&+jQwNbK5p4 zB<0?lWh)Ztw0HZD4T?iY7wslqzcaA$g-hF})=WRV%(eBz%5WnVi#2rk@OsUg$L@D) z31~21H|yg5K{YFsr>3@B+_BHby;t|mP^#5)^|QOdeHR?~Rq|HF&9XNpc71m`hj<^z zb8+;P_0+Lbr)Df$hOCN|ZMl14>uZAe`GS5GH-811`mZ#^*5N&S?uBIxmMw3!Yu7F)TTDbnTWsFE+0t!5 zuX_*gJbhH|_4%efdtG#N>fF-b>FP(vK|QoYke{G}9|HC@q4Ki}EejsQJxkVSZ-Fwn zG28+u_4Cg^*Z$<|;@wjk&g?c|IuMeJw{B^nsI;{oc60ePkmL z4t2hekNJ%}w{gwdwd1BvwZ{exsH(UEVZ>Xy=i|j^`gHH!y#U1H8=L0O9vFHNq=pJ} zb)V-?Z6$lY+C>K1I>Vg9jIg#p1x>-$z$``PG+SzD*Fsv+C-y zRnevnhvV|)%M<&xE`r#>Mt|%=8t+XJ9d4fZ!vo6lU})zIpcHqXUr1Lz3jGdM;G42` z`Dk@nTXnbPyZ7vAS2?LKh!Uuye*_M`NPWnl-Ae}DIPw(~^xktl&ItfY<>hLPruKJl z)xA2&)_dIQqVI2XPF{X{R%Z&ZZG!zN_wK;h*$umv`}Qn)6!@kSV4YI=4uICSZQIOG z7B6H$1{x}MoC0*d-U}OTZ?_mk-1aqzON}}HQ5CliteDZ)YpflBZ2S`e5VA;N9j{P95L2?>~HbM;|n4^25lHBhUIyOgy!kOx?RE zgIL);&rpv#UfCFH)h3mD6w=jhYW-?dtW~Q?J*e_yOEy$j zoU#@r0Bsmf_G)R*Q0K}Xc9(`njvn3Wv(JVAcQiklbUlx>8rAktVJT?;9cRvzI8QNZ z<@3)!zka-EHe9Y*qehLGAn!G%*92sdqNrwRkJV!;&kZVldEmw;SDOOR7Ew(a*8lLs z%}{CY^y>#z_}5>5ZPtZecKW_-WJA_~r)l++x2Ez(wS8J~ip&8Z?=>&HhsI8SUsxD^ zwU1{vOamyo-fOsQ?V2_5+oy#EwQId`;lhR5ExOHwc)0ZU-%6?UUr^MqtP&1*TD-lR z=+JnVd0g-6CA$)gcA9}k-RCzA$xm^ihv)0tv}*O{;AhYJ&zUo4YPSJjfA-mD-;}+1 z2RO~R@#Dp@SVtVk>0Hi|8^B23^PrgzRM>j09zUL0{!7i9H>^AN$A>pat*#9-G|b}J zr54W*tgk({>&?$IPUpw1TDAJ)Sg0Hk1j8kotK+zV3NqSwHA<=->4?o6Q~`D zc$_|eyyuAF!!KUGybZ>@clU0=FHkH2D?*zmPn#AzMqF&(7~A!9U_HNfY4s7Qw)eD- zP&XK`g2!KA8H(qrr_^iKOallyWXO=cvpTOn^fgq!tH7_)H;yQKT)lV^{@0epj?l6z zFZT7=F_7+q)ZDUlt7A?4vnEZN%ITY|8M~-~*@UXt{^p4}l zr+|TQe@9dDgAYFx0cQtcU%Lr==x?E!)`cHo4gNlQZtB#=Aj~W;BDes+cEEYltz!l- zVZawFD-N30UZHNE-hA}vqzBjb*RNlHEB{>oH@*SrfBT(xTu^%~w>yDK0x21XL4f?o z?e@mCzT12~Z+`#f_Hv`$Uow4iJcLvHhX=w`}GOYfOyaHtN{nd@Lhz~+C@y!l^Xi+$C;{bdldzCVBZtaS-qiNBiJ z#;d)VO$Dacw#6*F2_hHhVb3-3A!zjE2OoU!%bAL+Gst=k8ps9?><0X1;^fKo>ebuw z=eRF^7(2F2=gw8XRt=iDWx?kqPpb~=yWiX0uE-qj0fh9(%`=y-E(ccg?AbH>`fP`H z-g$?S2VjT9t16=RA3T77YsKYGY|4){URk`b5H+f2!iDo)?;ps>7-x`Ok>t6D-ADC;P66`N`5J>d3xnsK> zy7d@bD3F%l^lSZB<9gVR!-b`cYzFdIbZpg&5NgxVIdUle2tojO_{mk#9xn&zGvHAJ zSk&X|M*~Jq#i>WjYNnf@kbq12JD7_b9$y>@u0`puK!l$?Jzn}d z$Oi0=9AcpIxvpx3a9>ePwbrJKXS8`7vL=l6=ooYfW1eu8|EpxPd5HJD-JYW-KM}O%D(J z7>xuDy^sw+xaofV-uNkXza;}Jy-T}|%Vr}*HvJYwqO#(+vw#2o3wo_b;mTkDPHE82 zI<>fjVTup-cPD_xZd<$d!|J^p>B+KS_vbaYNTKBdKFP4>OpWstV`_s*T<2phl4GKA z)3f2Q&$~h;Q(vv2$IXzBP0ro2`og=Jy|cTwfIo#TR)bFuj_U2x zYd!aw$QsPJHi?VU|1h>dyMxvM{AWxPhI&l}F$A>y5Mv*JJlMW}Ke%2R=!Fza?b;8m zsi}EsEj{o5g5hnPUo}8D&oKL?CAW8`aKf$$ZGaX0d$eu?@@tFS^~O$a0*@5>+S0Da*`)X z2XzN83+SEeGp0e~YW+`}X7J9+;-$a+CcRT{+W-i?Z}x@jT|EG`5{M{(L&NzmXyY$e z?@pH(jpNU@vJZPP^T9KZb-mGY=1{}lOG)Sa&);ct&)%=6uH4K}N#Tymyw;d-A9oyPoR9Myu$#kv#CVV@V|wBpA47kn4aYOurf zg3bQaNkAWgTIpLT*sz6u$wx!)7a>2toY3^G?MD53vhQA6_`-BtApG~CPwN(e0Qu}Q z(dtXxZ#=wBW|*6OexXC#wp;e>8F~B6`b$@?$P9)LfE174--BJhq^id!u$;?AUjWtG z65R2Eo@(f?jGZxY=c}w)ejM?z<+Pv+W_}kHtFo ze~f(6Iop!QYXJWq#OGgpQMNAAZs*t*t3#vPPKejrJspjHe71gxW96U*%|C0-{p9FJ zRR=4q?-jl>Tnd)e#a{5Xkm@Humf>`RAXPRM@}qztxumm8%j#vdHe0YfKcC*UDM?9`6LL^ zb?Lw7^!oHUm>0$SX9K8jJ$UfL!O&$o+wV@-$({O)89TNvxY2Oqf#b_>->n=urP-qVvheGz;f2d~@7vd^Tes$e0UB219{3L(I&}T;{JLNU7o@Kr7y`Id z;1hAcKn3?3YVfs_E5ikhsX27ShzV1tDxe854RUhKm@$i?2t)hG@qh%E1!=deCE4 z#P#^@g@R^+_+YsD0noy*=D-V%9xJ->VZ%-1zK}OY`WArS%-%ELz;{C@7$&zGe!QM* z(v&G9=Fe{fdV9&kL*D`%f*}e|@w32N{~dZQE!(uYR9?OZx*RJXL2x{QMpoNfoms4L zrPa5{lXs36^=SjXHJtW!=7xDmK01sUm^b`*PuC1KD^2S(w&ii*}> ze?1*KNr#|U#^!KVW@^3PY{4w_Y#4lo$4{QTwk&q$YiOI;H_)v28n*8X&J=dkYB2Pj zKyDoeJABAPFG+k%!!{l(>a!mtY_Si_sLg$m51KaZ5$gqe4srU`S6}_AoY30q^%gK* z&E$@~-rY2)=0OW=Z1a6!#VB=4dtL&_zIXrr9B`CQE(gbh^dBDllXfe1GN61W|FmVMb48sDqri=^l!4Xg#w8H6Yu^8NR3Lk#AgT$#dZT-yst z2qx{VI)6fK2aN{YZ9io6pSyQ|-lom`)7$UAQ@`~;oUZ^*o5l@}ca-xcb*QLxK~4W< z$6Y69vD@Q;p#QXG%b~!yCUzdyu4Bj69XpO;)JWjKr(jb2erEElS^M@*Y9oH{iD ztP5~eGXswNEA((R6wue8Rvmk{aKnZ!kioGd>kb|~c(T0c>R+?=K!7rw7cYJ(7L6iE-vjC$SyY6|qkNT%ZRw2jU zFMRkg&FmwDT(J-Ocvq?`&+)7N(7Xf|rqrv(%B`@SpwCZzUWLA@_|v!cFy&|0a!&YX ztZ-~>(*Ex{JGtT?+hFkYt>I|f5idOicvHxqv_K?0O z<0ei7@SFZW2=#VlOfyR%n090RosE}330#AQRDR0qgZCfrb|h6KA5i(U3-9q)p|wXZ zZXcrO9JnX^eO0buWvx0B%b5-rbUB&I4m}_U-yXLMcV7dUk#d> z!3P7rg8zJB>xjeaDG~_h58r?PX`43k9^JuT1Y_?tgVVWtR1?ku;GrOGcdi56d>}|IzXj%Zh_?Gaz3250%(DnoHm_6`maMGz)PWV~+QXOzr z6iOu{ct4X2He3p57$ zKiJ1FC=MSV1Fn>R?^OIs4LHhRX4QtinGbrELx&9m4|UX1IjGq`8&*{z3{~29LHqwf z5L-aPM*b+R`vp+PQ_ar)zZAheH_!*KU+Ss?Yvxrw?mJ^^Q!og6_G|{M<`=j(XkG+X zmpr*T1O5q*akFQS1>BuCZyv-JgCfws-SyXB1FzS#09WEa?xYt$A)w0QUh5|h9r`b4 zabWY$UHh#WP=!LXjp>?v{PAvhBxKadbCr+ag$fPcl3ox$f9lyp7t2W zY#7E06l+2o3 zabSR=aaqTA+Wfk>st)PGYE_*qzOb$9?0EyG3?271@c8A6K0e#Wzt7$8%sP;6W5b;( zRpYN1+Esq`!aiYcJlIH)qCT?~ojb2OUf9OA)^kH&-w%MaDvcX48dh*G2$& z06I{4W+${h8*>96)Nidh4^Y_V*7LLbS4PU%Oc!k`%hQ+_`UsvDA$E;#buwGodB>UQ z{Ra&A`*=}{CC-&@us$u#*Z=ZM0jNg!_{rU^b*FX7EzjPBE=qHo%?7=O?Hh6rH0x%A zg~ynrP&km#kuST!bX0=~h%l%{W1-*p16+aw&j$dZ+Xjyc*;o8N^_%T4wU2+m<;yp2 zEE-V19DK>Ll74)+@I@%N1&e!^Os_oKuV{C)Q?GSWa9wuo|9^Tp_joAtJ&sSSj?mK9 zqTMBJZMhVoq>Ibyf=Rg*l~Jh}Nf9bCqB==MDVN$(F6)}hC^Ss&Nr}}^p%7V@av79i z%7pXzxty)t&Ux)0=XL(`s%Pf;J-_F9zQ6D1{rUWcBWwfKg<|cPxoYLgeT}rs5fPjo zZ~iK@f*Z}vp9lpub##=%GNlj?5l!69ckdg$1%)!Q7^k& zTGkpGmIwu!-Hv5(r8ns4+T6OYdF zcN3q%nMe(!y6!Z%AcL+^y!HSl_BCeIqhcrfMZ%bLtm$gXfO_EaK_hxI^M_LER~`kO zb;{mdEK1yqu|5;Yy^g#l9>7@|5_f*Hn;Wh%cjT@|x7AI{FSN12z2|km48xspEK4FI zvA4DTNp|I-if%tYKViq}grOybchykQissbznjwv1q^(T-@3r08xAY zPRs@xl z7*d$l?0e|glC+Z)lL03b%FK%pHl%T5XEONRt%xQl!4H6IXRP&;h__0H4(X}4$$;6U|TRZ zpr{o1QgbK>MR5;1{Hjh$IIv-5q><2RW!VQELP^xeOM5bt&{)lolj97-1mN*n@Gj%& zU&mc5ZQBcd4fZJ0yY=}W*^|x?sV(M8YZ#C=AJulhX z((+4xUV$7?x7SX{=26Rr)HFgP+YQc1Ue_wV=5B2QGcs6S~vPM4I}wDIm`+qburfXo40 za|UW1iT1-7VX)}!+Vvy4fJ2?t=izTTHRf$Z`$si4hRu*!Z_qedShx?E-GV)mXgn#Z zYh$(0Kc>Bc9H+D8SjOab{?c@3?bg=T)~5FMM@U8_c{voq^+O}40_MNgz`*TY3l$CB z20A^C^%w*noITZb1Y)(dA>JJJ9zu{?a=DRG&?b@8PrZ~!~)Z!h#5iY9b(Yq#ai>Ya^VU8{g z9)&WQBFFPj3ljI&vCacAZuuZ0o|l)0;LSd{26z6~FHp?)AT$IhIcoVq;+aOF_In&_J*=^hH(Jz{m4YCk-zhdCtmXs^p$jFklGqkWx&A3l(HgK@Z)NCEomH&sc}a0xQrA5)bkZC3nU9-sKH9I&bS&&!B)FXgle^`VYtv2@%<|g*F8Z4dHlmFU;1qYK@M=gTLhi zHI>u_xDUHw@X+&3NUW+f&9~_eo!oVY25^x_zj=UV4Bx@VVm!T&VPak3 zKOvR{s;udjFwk}bI{Mmz!ZC;x3^{ffl+|$fV zyp^~rL*)qb2=IbQ-|g}hp{}B)=|q|1)BVI1Q`wP|;QpP(_x-76TKr14=j>VsT@!}Z zdB&OSAdmsPk?pS$@MStb*g>b&t74F8n4s*RW#qU3CmI((mW`_7Bn5_2CXMgpDs-4X={4`ync0s8$EV$k=C)nrQpZu z9_1P$pNfCfVq!a10K{QW!_)#Syri38Jw7M7kPuW-9EJq^*D(Aoyc_FDS|7?CHt@L@ z9ZT$IS;S1B4okl;p^nIx-Yq5HxVpKa#4~y2dG5a06@WGpWq99a|M{OtbLlyA=bi*s zY2*(eNw<2wFVLvem}IMB7YPY}zdxp< zXFDeO`YLyE3fdWHb*S2SbYR$&FayPo1b^Wubk$`_C}j6)BfAXab~Mt;&BTrj{llUE znH`*V$9-sJzQukQSct{A6)X`uXUYeVLQ%Od2$Wd+VBl378G?)w(;J*3P=r8x*GH4AdMosc*#hjT4mYM z=~gY0^-8|@X$O8LlqVTN_MvujQ0_-%W%CfuLqBV26%Qv3i7f(ip@?FX-CbOMT(+z_ zxj%srjMY9QBSa|^cShbTv`kD)4290V>7Fm(^FizuK+#lGQE7vfo#Off=rqgerDy>* z-sr&>2iMHHdsp4IQG;Dj~0Y6W-mw-93 zKvy@SqQVrf1>2?h^drG#RrPR!9%4_smxd@JR`8WwssY5JElN}?Q};WgdkKT1U#XV! zhljs;hJG7pPl%mZ(ZXG}D_9jf$-4b>1i>2c|3;gGQ7lGxS+VLMwFcDq^fs z=0*uFs-|rp=LQo#_lV#Yi$R@rlN^V(Z^*8C5vwMpY{0WWi{%F6{T}(MZrO(G!SV#i z4Gi|5%}Cz^i+hItInvGpRk%1gt<~+D2J5<(lkX#-86Q2`zWvvPNf-_|M|QlO(eCdx z7YtstKa*(TpRn@qbNJkK9o6%9b!^Tp`?dMQ+)xsbl7`hToRI+Og!w zjm#An&n6+D)^4OaB1+)6I&rR6B$5D6F ukuD^TH`!=7o&JUGhM(*_{L-HzV%ySR+i;=}u<$ef6zV$TwanEvC;tVCV)Ie} diff --git a/text/images/otlp-load-balancing.png b/text/images/otlp-load-balancing.png deleted file mode 100644 index 857a6d1b7d335e27a314f61ab2f28f4095d8eae0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22126 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 diff --git a/text/images/otlp-multi-destination.png b/text/images/otlp-multi-destination.png index 3bba847675607bdf0f6f045bdcbdcf039139fef5..743a9020bd9c38ab9baa80b72a6b7f2878dd3bb5 100644 GIT binary patch literal 24900 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�!6nfU56=9<}`B$W^D6?{`{N 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�)=7u?R)o1%XULCn3ZXZM{42m zPb02fx^x!Gby<0N^?2_0YSZyjcP$<{*+D6XWtfiW-clNLg|z#&ZQI~tfjo>e#5)3| zW(dEbfOGOktNnvlvY}sEGL!fZo4zVBF*SYRfD#oIT?a0jjdJI`4f2RpF(>3#rWQ7I z0Od>_z_Ok0v zaI&OoIRWetN*$1>JfWv|+2+=@Ca3w`KV}UN^21#b4bo9rD5j?L#pK_)b2+?es2ob6 z18_YBahjFPEEji*7nPJ`pP8BY%~*nT7mb}KpJZZkWy#aS&GSR)8A!RnJ(SImK5z1* zLsB$ty}yu5rU4W% zi8VNubLQ`aWZPuz9xoPZts?)Qw==UnUXvy-o o?#j?(P$a5dC5RZ#{*`r2ZBcq@?#GV7RcizRXP|W#V|(`h0LhqB(EtDd literal 0 HcmV?d00001 diff --git a/text/images/otlp-streaming.png b/text/images/otlp-streaming.png deleted file mode 100644 index 94b703c0b96c2b27c7bd1497093fd5d3498ba455..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8827 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