From c739f258fb69eaca5affd9e8c99754c26d053082 Mon Sep 17 00:00:00 2001 From: Tigran Najaryan Date: Fri, 7 Jun 2019 14:46:30 -0400 Subject: [PATCH] Fix based on PR comments --- specification/language-library-design.png | Bin 18757 -> 18363 bytes specification/language-library-full.png | Bin 0 -> 14870 bytes specification/language-library-minimal.png | Bin 0 -> 7870 bytes specification/library-guidelines.md | 65 ++++++++++++++------- 4 files changed, 44 insertions(+), 21 deletions(-) create mode 100644 specification/language-library-full.png create mode 100644 specification/language-library-minimal.png diff --git a/specification/language-library-design.png b/specification/language-library-design.png index d3c215d46194c4105756fe715718e8b3100afb2e..c9324cf3b2bad35ca3de256a000630cdfc11b7ed 100644 GIT binary patch literal 18363 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 literal 18757 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 diff --git a/specification/language-library-full.png b/specification/language-library-full.png new file mode 100644 index 0000000000000000000000000000000000000000..5178b4bc8ae801d2546aac7e28a080498daa499b GIT binary patch literal 14870 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 literal 0 HcmV?d00001 diff --git a/specification/library-guidelines.md b/specification/library-guidelines.md index f44100cca32..2ae52bc8c1f 100644 --- a/specification/library-guidelines.md +++ b/specification/library-guidelines.md @@ -1,53 +1,76 @@ # OpenTelemetry Language Library Design Principles -This document defines common principles that will help designers to create language libraries that are ergonomic to use, enable multiple use cases for library users, are to a certain extent uniform across all supported languages, yet allow enough flexibility for language-specific expressiveness. +This document defines common principles that will help designers to create language libraries that are easy to use, enable multiple use cases for library users, are uniform across all supported languages, yet allow enough flexibility for language-specific expressiveness. -The document does not attempt to describe a language library API. For API specs see [Tracing API](tracing-api.md), [Resources API](resources-api.md). +The language libraries are expected to provide full features out of the box and allow for innovation and experimentation through extensibility points. + +The document does not attempt to describe a language library API. For API specs see [specification](specification/README.md). ## Requirements -1. The public API must be well-defined and clearly decoupled from the implementation, enabling end-users to swap out for alternate implementations. +1. The OpenTelemetry API must be well-defined and clearly decoupled from the implementation. This allows end users to consume API only without also consuming the implementation (see points 2 and 3 for why it is important). -2. Third party libraries and frameworks that add instrumentation to their code will have a dependency only on the public API of OpenTelemetry language library. The developers of third party libraries and frameworks do not care (and cannot know) what specific implementation of OpenTelemetry is used in the final application. +2. Third party libraries and frameworks that add instrumentation to their code will have a dependency only on the API of OpenTelemetry language library. The developers of third party libraries and frameworks do not care (and cannot know) what specific implementation of OpenTelemetry is used in the final application. -3. The developers of the final application normally decide what OpenTelemetry implementation to plug in. They should be also free to choose to not use any OpenTelemetry implementation at all, even though the application and/or its libraries are already instrumented. The rationale is that third-party libraries and frameworks which are instrumented with OpenTelemetry must still be fully usable in the applications which do not want to use OpenTelemetry (so this removes the need for framework developers to have "instrumented" and "non-instrumented" versions of their framework). +3. The developers of the final application normally decide how to configure OpenTelemetry SDK and what extensions to use. They should be also free to choose to not use any OpenTelemetry implementation at all, even though the application and/or its libraries are already instrumented. The rationale is that third-party libraries and frameworks which are instrumented with OpenTelemetry must still be fully usable in the applications which do not want to use OpenTelemetry (so this removes the need for framework developers to have "instrumented" and "non-instrumented" versions of their framework). -4. Full implementation must be clearly separated into wire protocol-independent parts that implement common logic (e.g. batching, tag enrichment by process information, etc.) and protocol-dependent exporters. Protocol-dependent exporters must contain minimal functionality, thus enabling vendors to easily add support for their specific protocol to the language library. +4. Language library implementation must be clearly separated into wire protocol-independent parts that implement common logic (e.g. batching, tag enrichment by process information, etc.) and protocol-dependent telemetry exporters. Telemetry exporters must contain minimal functionality, thus enabling vendors to easily add support for their specific protocol to the language library. -## Proposed Generic Design +## Language Library Generic Design -Here is a proposed generic design for a language library: +Here is a generic design for a language library (arrows indicate calls): ![Language Library Design Diagram](language-library-design.png) -### Public API +### Expected Usage + +The OpenTelemetry Language Library will be composed of 2 packages: API package and SDK package. + +Third-party libraries and frameworks that want to be instrumented in OpenTelemetry-compatible way will have a dependency on the API package. The developers of these third-party libraries will add calls to telemetry API to produce telemetry data. + +Applications that use third-party libraries that are instrumented with OpenTelemetry API will have a choice to enable or not enable the actual delivery of telemetry data. + +In order to enable it the application must take a dependency on the OpenTelemetry SDK, which implements the delivery of the telemetry. The application must also configure exporters so that the SDK knows where and how to deliver the telemetry. The details of how exporters are enabled and configured are language specific. + +The application can also call telemetry API directly to produce additional telemetry data. -The instrumentation code in the end-user application and in the instrumented third-party libraries that are used by the application will call the public API of OpenTelemetry Language Library. +### API and Minimal Implementation -The public API package is a self-sufficient dependency, in the sense that if the end-user application depends only on it and does not plug a full implementation then the application will still build and run without failing, although no telemetry data will be actually delivered to a telemetry backend. +The API package is a self-sufficient dependency, in the sense that if the end-user application or a third-party library depends only on it and does not plug a full SDK implementation then the application will still build and run without failing, although no telemetry data will be actually delivered to a telemetry backend. This self-sufficiency is achieved the following way. -The public API dependency will contain a minimal, virtually no-op implementation of the API. When no other implementation is explicitly included in the application all telemetry calls will effectively be no-op, any generated telemetry data will be discarded. +The API dependency will contain a minimal implementation of the API. When no other implementation is explicitly included in the application no telemetry data will be collected. Here is what active components will look like in this case: -It is important that values returned from this no-op implementation of API are valid and do not require the caller to perform extra checks (e.g. createSpan() method should not fail and should return a valid non-null Span object). The caller should not need to know and worry about the fact that no-op implementation is in effect. This minimizes the boilerplate and error handling in the instrumented code. +![Minimal Operation Diagram](language-library-minimal.png) -It is also important that no-op implementation incurs as little performance penalty as possible, so that third-party frameworks and libraries that are instrumented with OpenTelemetry impose negligible overheads to users of such libraries that do not want to use OpenTelemetry too. +It is important that values returned from this minimal implementation of API are valid and do not require the caller to perform extra checks (e.g. createSpan() method should not fail and should return a valid non-null Span object). The caller should not need to know and worry about the fact that minimal implementation is in effect. This minimizes the boilerplate and error handling in the instrumented code. -## Full SDK Implementation -The Full SDK implementation is a separate (optional) dependency. When it is plugged in it substitutes the no-op implementation that is included in the Public API package (exact substitution mechanism is language dependent). +It is also important that minimal implementation incurs as little performance penalty as possible, so that third-party frameworks and libraries that are instrumented with OpenTelemetry impose negligible overheads to users of such libraries that do not want to use OpenTelemetry too. -It is recommended to decouple common parts of the implementation from protocol-specific portion. Library designers are encouraged to specify an internal Exporter API that defines how protocol-independent and protocol-dependant parts interact. The design goals for such API will be: +### SDK Implementation -- Minimize burden of implementation for protocol-dependant parts and avoid duplicate implementation of the same functionality. +The SDK implementation is a separate (optional) dependency. When it is plugged in it substitutes the minimal implementation that is included in the API package (exact substitution mechanism is language dependent). Here is what active components will look like in this case: + +![Full Operation Diagram](language-library-full.png) + +It is recommended to decouple common parts of the implementation from protocol-specific Telemetry Exporters. Library designers are encouraged to specify an internal Telemetry Exporter API that defines how protocol-independent and protocol-dependant parts interact. The boundary and design goals for such API will be: + +- Place common functionality such as queuing, batching, tagging, etc. in the protocol-independent parts of the implementation. This functionality will be applicable regardless of what Telemetry Exporter is used. + +- Minimize burden of implementation for protocol-dependant telemetry exporters. The Telemetry Exporter is expected to be primarily a simple telemetry data encoder and transmitter. - Use efficient data structures that are well suited for fast serialization to wire formats and minimize the pressure on memory managers. The latter typically requires understanding of how to optimize the rapidly-generated, short-lived telemetry data structures to make life easier for the memory manager of the specific language. General recommendation is to minimize the number of allocations and use allocation arenas where possible, thus avoiding explosion of allocation/deallocation/collection operations in the presence of high rate of telemetry data generation. -## Alternate Implementations +### Alternate Implementations The end-user application may decide to take a dependency on alternate implementation. -The alternate implementation may provide functionality that is identical to the official full SDK, but for example has better performance characteristics. This opens up the possibility of having competing and better implementations. +SDK provides flexibility and extensibility that may be used by many implementations. Before developing an alternative implementation, please, review extensibility points provided by OpenTelemetry. + +An example use case for alternate implementations is automated testing. A mock implementation can be plugged in during automated tests. For example it can store all generated telemetry data in memory and provide a capability to inspect this stored data. This will allow the tests to verify that the telemetry is generated correctly. Language Library authors are encouraged to provide such mock implementation. + +Note that mocking is also possible by using the SDK and a Mock Exporter without needed to swap out the entire SDK. -Another common use case for alternate implementations is automated testing. A mock implementation can be plugged in during automated tests. For example it can store all generated telemetry data in memory and provide a capability to inspect this stored data. This will allow the tests to verify that the telemetry is generated correctly. Language Library authors are encouraged to provide such mock implementation. +The mocking approach chosen will depend on the testing goals and at which point exactly it is desirable to intercept the telemetry data path during the test. \ No newline at end of file