...

Text file src/go.opentelemetry.io/otel/VERSIONING.md

Documentation: go.opentelemetry.io/otel

     1# Versioning
     2
     3This document describes the versioning policy for this repository. This policy
     4is designed so the following goals can be achieved.
     5
     6**Users are provided a codebase of value that is stable and secure.**
     7
     8## Policy
     9
    10* Versioning of this project will be idiomatic of a Go project using [Go
    11  modules](https://github.com/golang/go/wiki/Modules).
    12  * [Semantic import
    13    versioning](https://github.com/golang/go/wiki/Modules#semantic-import-versioning)
    14    will be used.
    15    * Versions will comply with [semver
    16      2.0](https://semver.org/spec/v2.0.0.html) with the following exceptions.
    17      * New methods may be added to exported API interfaces. All exported
    18        interfaces that fall within this exception will include the following
    19        paragraph in their public documentation.
    20
    21        > Warning: methods may be added to this interface in minor releases.
    22
    23    * If a module is version `v2` or higher, the major version of the module
    24      must be included as a `/vN` at the end of the module paths used in
    25      `go.mod` files (e.g., `module go.opentelemetry.io/otel/v2`, `require
    26      go.opentelemetry.io/otel/v2 v2.0.1`) and in the package import path
    27      (e.g., `import "go.opentelemetry.io/otel/v2/trace"`). This includes the
    28      paths used in `go get` commands (e.g., `go get
    29      go.opentelemetry.io/otel/v2@v2.0.1`.  Note there is both a `/v2` and a
    30      `@v2.0.1` in that example. One way to think about it is that the module
    31      name now includes the `/v2`, so include `/v2` whenever you are using the
    32      module name).
    33    * If a module is version `v0` or `v1`, do not include the major version in
    34      either the module path or the import path.
    35  * Modules will be used to encapsulate signals and components.
    36    * Experimental modules still under active development will be versioned at
    37      `v0` to imply the stability guarantee defined by
    38      [semver](https://semver.org/spec/v2.0.0.html#spec-item-4).
    39
    40      > Major version zero (0.y.z) is for initial development. Anything MAY
    41      > change at any time. The public API SHOULD NOT be considered stable.
    42
    43    * Mature modules for which we guarantee a stable public API will be versioned
    44      with a major version greater than `v0`.
    45      * The decision to make a module stable will be made on a case-by-case
    46        basis by the maintainers of this project.
    47    * Experimental modules will start their versioning at `v0.0.0` and will
    48      increment their minor version when backwards incompatible changes are
    49      released and increment their patch version when backwards compatible
    50      changes are released.
    51    * All stable modules that use the same major version number will use the
    52      same entire version number.
    53      * Stable modules may be released with an incremented minor or patch
    54        version even though that module has not been changed, but rather so
    55        that it will remain at the same version as other stable modules that
    56        did undergo change.
    57      * When an experimental module becomes stable a new stable module version
    58        will be released and will include this now stable module. The new
    59        stable module version will be an increment of the minor version number
    60        and will be applied to all existing stable modules as well as the newly
    61        stable module being released.
    62* Versioning of the associated [contrib
    63  repository](https://github.com/open-telemetry/opentelemetry-go-contrib) of
    64  this project will be idiomatic of a Go project using [Go
    65  modules](https://github.com/golang/go/wiki/Modules).
    66  * [Semantic import
    67    versioning](https://github.com/golang/go/wiki/Modules#semantic-import-versioning)
    68    will be used.
    69    * Versions will comply with [semver 2.0](https://semver.org/spec/v2.0.0.html).
    70    * If a module is version `v2` or higher, the
    71      major version of the module must be included as a `/vN` at the end of the
    72      module paths used in `go.mod` files (e.g., `module
    73      go.opentelemetry.io/contrib/instrumentation/host/v2`, `require
    74      go.opentelemetry.io/contrib/instrumentation/host/v2 v2.0.1`) and in the
    75      package import path (e.g., `import
    76      "go.opentelemetry.io/contrib/instrumentation/host/v2"`). This includes
    77      the paths used in `go get` commands (e.g., `go get
    78      go.opentelemetry.io/contrib/instrumentation/host/v2@v2.0.1`.  Note there
    79      is both a `/v2` and a `@v2.0.1` in that example. One way to think about
    80      it is that the module name now includes the `/v2`, so include `/v2`
    81      whenever you are using the module name).
    82    * If a module is version `v0` or `v1`, do not include the major version
    83      in either the module path or the import path.
    84  * In addition to public APIs, telemetry produced by stable instrumentation
    85    will remain stable and backwards compatible. This is to avoid breaking
    86    alerts and dashboard.
    87  * Modules will be used to encapsulate instrumentation, detectors, exporters,
    88    propagators, and any other independent sets of related components.
    89    * Experimental modules still under active development will be versioned at
    90      `v0` to imply the stability guarantee defined by
    91      [semver](https://semver.org/spec/v2.0.0.html#spec-item-4).
    92
    93      > Major version zero (0.y.z) is for initial development. Anything MAY
    94      > change at any time. The public API SHOULD NOT be considered stable.
    95
    96    * Mature modules for which we guarantee a stable public API and telemetry will
    97      be versioned with a major version greater than `v0`.
    98    * Experimental modules will start their versioning at `v0.0.0` and will
    99      increment their minor version when backwards incompatible changes are
   100      released and increment their patch version when backwards compatible
   101      changes are released.
   102    * Stable contrib modules cannot depend on experimental modules from this
   103      project.
   104    * All stable contrib modules of the same major version with this project
   105      will use the same entire version as this project.
   106      * Stable modules may be released with an incremented minor or patch
   107        version even though that module's code has not been changed. Instead
   108        the only change that will have been included is to have updated that
   109        modules dependency on this project's stable APIs.
   110      * When an experimental module in contrib becomes stable a new stable
   111        module version will be released and will include this now stable
   112        module. The new stable module version will be an increment of the minor
   113        version number and will be applied to all existing stable contrib
   114        modules, this project's modules, and the newly stable module being
   115        released.
   116  * Contrib modules will be kept up to date with this project's releases.
   117    * Due to the dependency contrib modules will implicitly have on this
   118      project's modules the release of stable contrib modules to match the
   119      released version number will be staggered after this project's release.
   120      There is no explicit time guarantee for how long after this projects
   121      release the contrib release will be. Effort should be made to keep them
   122      as close in time as possible.
   123    * No additional stable release in this project can be made until the
   124      contrib repository has a matching stable release.
   125    * No release can be made in the contrib repository after this project's
   126      stable release except for a stable release of the contrib repository.
   127* GitHub releases will be made for all releases.
   128* Go modules will be made available at Go package mirrors.
   129
   130## Example Versioning Lifecycle
   131
   132To better understand the implementation of the above policy the following
   133example is provided. This project is simplified to include only the following
   134modules and their versions:
   135
   136* `otel`: `v0.14.0`
   137* `otel/trace`: `v0.14.0`
   138* `otel/metric`: `v0.14.0`
   139* `otel/baggage`: `v0.14.0`
   140* `otel/sdk/trace`: `v0.14.0`
   141* `otel/sdk/metric`: `v0.14.0`
   142
   143These modules have been developed to a point where the `otel/trace`,
   144`otel/baggage`, and `otel/sdk/trace` modules have reached a point that they
   145should be considered for a stable release. The `otel/metric` and
   146`otel/sdk/metric` are still under active development and the `otel` module
   147depends on both `otel/trace` and `otel/metric`.
   148
   149The `otel` package is refactored to remove its dependencies on `otel/metric` so
   150it can be released as stable as well. With that done the following release
   151candidates are made:
   152
   153* `otel`: `v1.0.0-RC1`
   154* `otel/trace`: `v1.0.0-RC1`
   155* `otel/baggage`: `v1.0.0-RC1`
   156* `otel/sdk/trace`: `v1.0.0-RC1`
   157
   158The `otel/metric` and `otel/sdk/metric` modules remain at `v0.14.0`.
   159
   160A few minor issues are discovered in the `otel/trace` package. These issues are
   161resolved with some minor, but backwards incompatible, changes and are released
   162as a second release candidate:
   163
   164* `otel`: `v1.0.0-RC2`
   165* `otel/trace`: `v1.0.0-RC2`
   166* `otel/baggage`: `v1.0.0-RC2`
   167* `otel/sdk/trace`: `v1.0.0-RC2`
   168
   169Notice that all module version numbers are incremented to adhere to our
   170versioning policy.
   171
   172After these release candidates have been evaluated to satisfaction, they are
   173released as version `v1.0.0`.
   174
   175* `otel`: `v1.0.0`
   176* `otel/trace`: `v1.0.0`
   177* `otel/baggage`: `v1.0.0`
   178* `otel/sdk/trace`: `v1.0.0`
   179
   180Since both the `go` utility and the Go module system support [the semantic
   181versioning definition of
   182precedence](https://semver.org/spec/v2.0.0.html#spec-item-11), this release
   183will correctly be interpreted as the successor to the previous release
   184candidates.
   185
   186Active development of this project continues. The `otel/metric` module now has
   187backwards incompatible changes to its API that need to be released and the
   188`otel/baggage` module has a minor bug fix that needs to be released. The
   189following release is made:
   190
   191* `otel`: `v1.0.1`
   192* `otel/trace`: `v1.0.1`
   193* `otel/metric`: `v0.15.0`
   194* `otel/baggage`: `v1.0.1`
   195* `otel/sdk/trace`: `v1.0.1`
   196* `otel/sdk/metric`: `v0.15.0`
   197
   198Notice that, again, all stable module versions are incremented in unison and
   199the `otel/sdk/metric` package, which depends on the `otel/metric` package, also
   200bumped its version. This bump of the `otel/sdk/metric` package makes sense
   201given their coupling, though it is not explicitly required by our versioning
   202policy.
   203
   204As we progress, the `otel/metric` and `otel/sdk/metric` packages have reached a
   205point where they should be evaluated for stability. The `otel` module is
   206reintegrated with the `otel/metric` package and the following release is made:
   207
   208* `otel`: `v1.1.0-RC1`
   209* `otel/trace`: `v1.1.0-RC1`
   210* `otel/metric`: `v1.1.0-RC1`
   211* `otel/baggage`: `v1.1.0-RC1`
   212* `otel/sdk/trace`: `v1.1.0-RC1`
   213* `otel/sdk/metric`: `v1.1.0-RC1`
   214
   215All the modules are evaluated and determined to a viable stable release. They
   216are then released as version `v1.1.0` (the minor version is incremented to
   217indicate the addition of new signal).
   218
   219* `otel`: `v1.1.0`
   220* `otel/trace`: `v1.1.0`
   221* `otel/metric`: `v1.1.0`
   222* `otel/baggage`: `v1.1.0`
   223* `otel/sdk/trace`: `v1.1.0`
   224* `otel/sdk/metric`: `v1.1.0`

View as plain text