Bump go.opentelemetry.io/otel/trace from 1.15.1 to 1.16.0
Bumps [go.opentelemetry.io/otel/trace](https://github.com/open-telemetry/opentelemetry-go) from 1.15.1 to 1.16.0. - [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-go/compare/v1.15.1...v1.16.0) --- updated-dependencies: - dependency-name: go.opentelemetry.io/otel/trace dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com>
This commit is contained in:
@@ -72,7 +72,7 @@ require (
|
|||||||
github.com/shamaton/msgpack/v2 v2.1.1
|
github.com/shamaton/msgpack/v2 v2.1.1
|
||||||
github.com/sirupsen/logrus v1.9.0
|
github.com/sirupsen/logrus v1.9.0
|
||||||
github.com/spf13/cobra v1.7.0
|
github.com/spf13/cobra v1.7.0
|
||||||
github.com/stretchr/testify v1.8.2
|
github.com/stretchr/testify v1.8.3
|
||||||
github.com/test-go/testify v1.1.4
|
github.com/test-go/testify v1.1.4
|
||||||
github.com/thejerf/suture/v4 v4.0.2
|
github.com/thejerf/suture/v4 v4.0.2
|
||||||
github.com/tus/tusd v1.10.1
|
github.com/tus/tusd v1.10.1
|
||||||
@@ -81,11 +81,11 @@ require (
|
|||||||
go-micro.dev/v4 v4.9.0
|
go-micro.dev/v4 v4.9.0
|
||||||
go.etcd.io/bbolt v1.3.7
|
go.etcd.io/bbolt v1.3.7
|
||||||
go.opentelemetry.io/contrib/zpages v0.41.1
|
go.opentelemetry.io/contrib/zpages v0.41.1
|
||||||
go.opentelemetry.io/otel v1.15.1
|
go.opentelemetry.io/otel v1.16.0
|
||||||
go.opentelemetry.io/otel/exporters/jaeger v1.15.1
|
go.opentelemetry.io/otel/exporters/jaeger v1.15.1
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.15.1
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.15.1
|
||||||
go.opentelemetry.io/otel/sdk v1.15.1
|
go.opentelemetry.io/otel/sdk v1.15.1
|
||||||
go.opentelemetry.io/otel/trace v1.15.1
|
go.opentelemetry.io/otel/trace v1.16.0
|
||||||
golang.org/x/crypto v0.9.0
|
golang.org/x/crypto v0.9.0
|
||||||
golang.org/x/exp v0.0.0-20221026004748-78e5e7837ae6
|
golang.org/x/exp v0.0.0-20221026004748-78e5e7837ae6
|
||||||
golang.org/x/image v0.6.0
|
golang.org/x/image v0.6.0
|
||||||
@@ -310,6 +310,7 @@ require (
|
|||||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.36.4 // indirect
|
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.36.4 // indirect
|
||||||
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.15.1 // indirect
|
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.15.1 // indirect
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.15.1 // indirect
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.15.1 // indirect
|
||||||
|
go.opentelemetry.io/otel/metric v1.16.0 // indirect
|
||||||
go.opentelemetry.io/proto/otlp v0.19.0 // indirect
|
go.opentelemetry.io/proto/otlp v0.19.0 // indirect
|
||||||
go.uber.org/atomic v1.10.0 // indirect
|
go.uber.org/atomic v1.10.0 // indirect
|
||||||
go.uber.org/multierr v1.8.0 // indirect
|
go.uber.org/multierr v1.8.0 // indirect
|
||||||
|
|||||||
@@ -1576,8 +1576,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
|
|||||||
github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
|
github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
|
||||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||||
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
|
github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY=
|
||||||
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||||
github.com/stvp/go-udp-testing v0.0.0-20201019212854-469649b16807/go.mod h1:7jxmlfBCDBXRzr0eAQJ48XC1hBu1np4CS5+cHEYfwpc=
|
github.com/stvp/go-udp-testing v0.0.0-20201019212854-469649b16807/go.mod h1:7jxmlfBCDBXRzr0eAQJ48XC1hBu1np4CS5+cHEYfwpc=
|
||||||
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
|
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
|
||||||
github.com/tchap/go-patricia/v2 v2.3.1 h1:6rQp39lgIYZ+MHmdEq4xzuk1t7OdC35z/xm0BGhTkes=
|
github.com/tchap/go-patricia/v2 v2.3.1 h1:6rQp39lgIYZ+MHmdEq4xzuk1t7OdC35z/xm0BGhTkes=
|
||||||
@@ -1677,8 +1677,8 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.3
|
|||||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.36.4/go.mod h1:05eWWy6ZWzmpeImD3UowLTB3VjDMU1yxQ+ENuVWDM3c=
|
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.36.4/go.mod h1:05eWWy6ZWzmpeImD3UowLTB3VjDMU1yxQ+ENuVWDM3c=
|
||||||
go.opentelemetry.io/contrib/zpages v0.41.1 h1:FReY8OWFNtYm4mWleTRxTUyD3r02uGcwS6ZeElahs00=
|
go.opentelemetry.io/contrib/zpages v0.41.1 h1:FReY8OWFNtYm4mWleTRxTUyD3r02uGcwS6ZeElahs00=
|
||||||
go.opentelemetry.io/contrib/zpages v0.41.1/go.mod h1:C3iy146ccMyv1+gEaxVDDHuoT7yXAKKmbg+twudDpeg=
|
go.opentelemetry.io/contrib/zpages v0.41.1/go.mod h1:C3iy146ccMyv1+gEaxVDDHuoT7yXAKKmbg+twudDpeg=
|
||||||
go.opentelemetry.io/otel v1.15.1 h1:3Iwq3lfRByPaws0f6bU3naAqOR1n5IeDWd9390kWHa8=
|
go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s=
|
||||||
go.opentelemetry.io/otel v1.15.1/go.mod h1:mHHGEHVDLal6YrKMmk9LqC4a3sF5g+fHfrttQIB1NTc=
|
go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4=
|
||||||
go.opentelemetry.io/otel/exporters/jaeger v1.15.1 h1:x3SLvwli0OyAJapNcOIzf1xXBRBA+HD3elrMQmFfmXo=
|
go.opentelemetry.io/otel/exporters/jaeger v1.15.1 h1:x3SLvwli0OyAJapNcOIzf1xXBRBA+HD3elrMQmFfmXo=
|
||||||
go.opentelemetry.io/otel/exporters/jaeger v1.15.1/go.mod h1:0Ck9b5oLL/bFZvfAEEqtrb1U0jZXjm5fWXMCOCG3vvM=
|
go.opentelemetry.io/otel/exporters/jaeger v1.15.1/go.mod h1:0Ck9b5oLL/bFZvfAEEqtrb1U0jZXjm5fWXMCOCG3vvM=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.15.1 h1:XYDQtNzdb2T4uM1pku2m76eSMDJgqhJ+6KzkqgQBALc=
|
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.15.1 h1:XYDQtNzdb2T4uM1pku2m76eSMDJgqhJ+6KzkqgQBALc=
|
||||||
@@ -1687,10 +1687,12 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.15.1 h1:tyoeaUh8REKay72DVYs
|
|||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.15.1/go.mod h1:HUSnrjQQ19KX9ECjpQxufsF+3ioD3zISPMlauTPZu2g=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.15.1/go.mod h1:HUSnrjQQ19KX9ECjpQxufsF+3ioD3zISPMlauTPZu2g=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.15.1 h1:pIfoG5IAZFzp9EUlJzdSkpUwpaUAAnD+Ru1nBLTACIQ=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.15.1 h1:pIfoG5IAZFzp9EUlJzdSkpUwpaUAAnD+Ru1nBLTACIQ=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.15.1/go.mod h1:poNKBqF5+nR/6ke2oGTDjHfksrsHDOHXAl2g4+9ONsY=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.15.1/go.mod h1:poNKBqF5+nR/6ke2oGTDjHfksrsHDOHXAl2g4+9ONsY=
|
||||||
|
go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo=
|
||||||
|
go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4=
|
||||||
go.opentelemetry.io/otel/sdk v1.15.1 h1:5FKR+skgpzvhPQHIEfcwMYjCBr14LWzs3uSqKiQzETI=
|
go.opentelemetry.io/otel/sdk v1.15.1 h1:5FKR+skgpzvhPQHIEfcwMYjCBr14LWzs3uSqKiQzETI=
|
||||||
go.opentelemetry.io/otel/sdk v1.15.1/go.mod h1:8rVtxQfrbmbHKfqzpQkT5EzZMcbMBwTzNAggbEAM0KA=
|
go.opentelemetry.io/otel/sdk v1.15.1/go.mod h1:8rVtxQfrbmbHKfqzpQkT5EzZMcbMBwTzNAggbEAM0KA=
|
||||||
go.opentelemetry.io/otel/trace v1.15.1 h1:uXLo6iHJEzDfrNC0L0mNjItIp06SyaBQxu5t3xMlngY=
|
go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs=
|
||||||
go.opentelemetry.io/otel/trace v1.15.1/go.mod h1:IWdQG/5N1x7f6YUlmdLeJvH9yxtuJAfc4VW5Agv9r/8=
|
go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0=
|
||||||
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
|
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
|
||||||
go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw=
|
go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw=
|
||||||
go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
|
go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
|
||||||
|
|||||||
+18
-18
@@ -352,9 +352,9 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) {
|
|||||||
|
|
||||||
// Greater asserts that the first element is greater than the second
|
// Greater asserts that the first element is greater than the second
|
||||||
//
|
//
|
||||||
// assert.Greater(t, 2, 1)
|
// assert.Greater(t, 2, 1)
|
||||||
// assert.Greater(t, float64(2), float64(1))
|
// assert.Greater(t, float64(2), float64(1))
|
||||||
// assert.Greater(t, "b", "a")
|
// assert.Greater(t, "b", "a")
|
||||||
func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool {
|
func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -364,10 +364,10 @@ func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface
|
|||||||
|
|
||||||
// GreaterOrEqual asserts that the first element is greater than or equal to the second
|
// GreaterOrEqual asserts that the first element is greater than or equal to the second
|
||||||
//
|
//
|
||||||
// assert.GreaterOrEqual(t, 2, 1)
|
// assert.GreaterOrEqual(t, 2, 1)
|
||||||
// assert.GreaterOrEqual(t, 2, 2)
|
// assert.GreaterOrEqual(t, 2, 2)
|
||||||
// assert.GreaterOrEqual(t, "b", "a")
|
// assert.GreaterOrEqual(t, "b", "a")
|
||||||
// assert.GreaterOrEqual(t, "b", "b")
|
// assert.GreaterOrEqual(t, "b", "b")
|
||||||
func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool {
|
func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -377,9 +377,9 @@ func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...in
|
|||||||
|
|
||||||
// Less asserts that the first element is less than the second
|
// Less asserts that the first element is less than the second
|
||||||
//
|
//
|
||||||
// assert.Less(t, 1, 2)
|
// assert.Less(t, 1, 2)
|
||||||
// assert.Less(t, float64(1), float64(2))
|
// assert.Less(t, float64(1), float64(2))
|
||||||
// assert.Less(t, "a", "b")
|
// assert.Less(t, "a", "b")
|
||||||
func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool {
|
func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -389,10 +389,10 @@ func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{})
|
|||||||
|
|
||||||
// LessOrEqual asserts that the first element is less than or equal to the second
|
// LessOrEqual asserts that the first element is less than or equal to the second
|
||||||
//
|
//
|
||||||
// assert.LessOrEqual(t, 1, 2)
|
// assert.LessOrEqual(t, 1, 2)
|
||||||
// assert.LessOrEqual(t, 2, 2)
|
// assert.LessOrEqual(t, 2, 2)
|
||||||
// assert.LessOrEqual(t, "a", "b")
|
// assert.LessOrEqual(t, "a", "b")
|
||||||
// assert.LessOrEqual(t, "b", "b")
|
// assert.LessOrEqual(t, "b", "b")
|
||||||
func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool {
|
func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -402,8 +402,8 @@ func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...inter
|
|||||||
|
|
||||||
// Positive asserts that the specified element is positive
|
// Positive asserts that the specified element is positive
|
||||||
//
|
//
|
||||||
// assert.Positive(t, 1)
|
// assert.Positive(t, 1)
|
||||||
// assert.Positive(t, 1.23)
|
// assert.Positive(t, 1.23)
|
||||||
func Positive(t TestingT, e interface{}, msgAndArgs ...interface{}) bool {
|
func Positive(t TestingT, e interface{}, msgAndArgs ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -414,8 +414,8 @@ func Positive(t TestingT, e interface{}, msgAndArgs ...interface{}) bool {
|
|||||||
|
|
||||||
// Negative asserts that the specified element is negative
|
// Negative asserts that the specified element is negative
|
||||||
//
|
//
|
||||||
// assert.Negative(t, -1)
|
// assert.Negative(t, -1)
|
||||||
// assert.Negative(t, -1.23)
|
// assert.Negative(t, -1.23)
|
||||||
func Negative(t TestingT, e interface{}, msgAndArgs ...interface{}) bool {
|
func Negative(t TestingT, e interface{}, msgAndArgs ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
|
|||||||
+129
-87
@@ -22,9 +22,9 @@ func Conditionf(t TestingT, comp Comparison, msg string, args ...interface{}) bo
|
|||||||
// Containsf asserts that the specified string, list(array, slice...) or map contains the
|
// Containsf asserts that the specified string, list(array, slice...) or map contains the
|
||||||
// specified substring or element.
|
// specified substring or element.
|
||||||
//
|
//
|
||||||
// assert.Containsf(t, "Hello World", "World", "error message %s", "formatted")
|
// assert.Containsf(t, "Hello World", "World", "error message %s", "formatted")
|
||||||
// assert.Containsf(t, ["Hello", "World"], "World", "error message %s", "formatted")
|
// assert.Containsf(t, ["Hello", "World"], "World", "error message %s", "formatted")
|
||||||
// assert.Containsf(t, {"Hello": "World"}, "Hello", "error message %s", "formatted")
|
// assert.Containsf(t, {"Hello": "World"}, "Hello", "error message %s", "formatted")
|
||||||
func Containsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) bool {
|
func Containsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -56,7 +56,7 @@ func ElementsMatchf(t TestingT, listA interface{}, listB interface{}, msg string
|
|||||||
// Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either
|
// Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either
|
||||||
// a slice or a channel with len == 0.
|
// a slice or a channel with len == 0.
|
||||||
//
|
//
|
||||||
// assert.Emptyf(t, obj, "error message %s", "formatted")
|
// assert.Emptyf(t, obj, "error message %s", "formatted")
|
||||||
func Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) bool {
|
func Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -66,7 +66,7 @@ func Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) boo
|
|||||||
|
|
||||||
// Equalf asserts that two objects are equal.
|
// Equalf asserts that two objects are equal.
|
||||||
//
|
//
|
||||||
// assert.Equalf(t, 123, 123, "error message %s", "formatted")
|
// assert.Equalf(t, 123, 123, "error message %s", "formatted")
|
||||||
//
|
//
|
||||||
// Pointer variable equality is determined based on the equality of the
|
// Pointer variable equality is determined based on the equality of the
|
||||||
// referenced values (as opposed to the memory addresses). Function equality
|
// referenced values (as opposed to the memory addresses). Function equality
|
||||||
@@ -81,8 +81,8 @@ func Equalf(t TestingT, expected interface{}, actual interface{}, msg string, ar
|
|||||||
// EqualErrorf asserts that a function returned an error (i.e. not `nil`)
|
// EqualErrorf asserts that a function returned an error (i.e. not `nil`)
|
||||||
// and that it is equal to the provided error.
|
// and that it is equal to the provided error.
|
||||||
//
|
//
|
||||||
// actualObj, err := SomeFunction()
|
// actualObj, err := SomeFunction()
|
||||||
// assert.EqualErrorf(t, err, expectedErrorString, "error message %s", "formatted")
|
// assert.EqualErrorf(t, err, expectedErrorString, "error message %s", "formatted")
|
||||||
func EqualErrorf(t TestingT, theError error, errString string, msg string, args ...interface{}) bool {
|
func EqualErrorf(t TestingT, theError error, errString string, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -90,10 +90,27 @@ func EqualErrorf(t TestingT, theError error, errString string, msg string, args
|
|||||||
return EqualError(t, theError, errString, append([]interface{}{msg}, args...)...)
|
return EqualError(t, theError, errString, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// EqualExportedValuesf asserts that the types of two objects are equal and their public
|
||||||
|
// fields are also equal. This is useful for comparing structs that have private fields
|
||||||
|
// that could potentially differ.
|
||||||
|
//
|
||||||
|
// type S struct {
|
||||||
|
// Exported int
|
||||||
|
// notExported int
|
||||||
|
// }
|
||||||
|
// assert.EqualExportedValuesf(t, S{1, 2}, S{1, 3}, "error message %s", "formatted") => true
|
||||||
|
// assert.EqualExportedValuesf(t, S{1, 2}, S{2, 3}, "error message %s", "formatted") => false
|
||||||
|
func EqualExportedValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
return EqualExportedValues(t, expected, actual, append([]interface{}{msg}, args...)...)
|
||||||
|
}
|
||||||
|
|
||||||
// EqualValuesf asserts that two objects are equal or convertable to the same types
|
// EqualValuesf asserts that two objects are equal or convertable to the same types
|
||||||
// and equal.
|
// and equal.
|
||||||
//
|
//
|
||||||
// assert.EqualValuesf(t, uint32(123), int32(123), "error message %s", "formatted")
|
// assert.EqualValuesf(t, uint32(123), int32(123), "error message %s", "formatted")
|
||||||
func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool {
|
func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -103,10 +120,10 @@ func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg stri
|
|||||||
|
|
||||||
// Errorf asserts that a function returned an error (i.e. not `nil`).
|
// Errorf asserts that a function returned an error (i.e. not `nil`).
|
||||||
//
|
//
|
||||||
// actualObj, err := SomeFunction()
|
// actualObj, err := SomeFunction()
|
||||||
// if assert.Errorf(t, err, "error message %s", "formatted") {
|
// if assert.Errorf(t, err, "error message %s", "formatted") {
|
||||||
// assert.Equal(t, expectedErrorf, err)
|
// assert.Equal(t, expectedErrorf, err)
|
||||||
// }
|
// }
|
||||||
func Errorf(t TestingT, err error, msg string, args ...interface{}) bool {
|
func Errorf(t TestingT, err error, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -126,8 +143,8 @@ func ErrorAsf(t TestingT, err error, target interface{}, msg string, args ...int
|
|||||||
// ErrorContainsf asserts that a function returned an error (i.e. not `nil`)
|
// ErrorContainsf asserts that a function returned an error (i.e. not `nil`)
|
||||||
// and that the error contains the specified substring.
|
// and that the error contains the specified substring.
|
||||||
//
|
//
|
||||||
// actualObj, err := SomeFunction()
|
// actualObj, err := SomeFunction()
|
||||||
// assert.ErrorContainsf(t, err, expectedErrorSubString, "error message %s", "formatted")
|
// assert.ErrorContainsf(t, err, expectedErrorSubString, "error message %s", "formatted")
|
||||||
func ErrorContainsf(t TestingT, theError error, contains string, msg string, args ...interface{}) bool {
|
func ErrorContainsf(t TestingT, theError error, contains string, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -147,7 +164,7 @@ func ErrorIsf(t TestingT, err error, target error, msg string, args ...interface
|
|||||||
// Eventuallyf asserts that given condition will be met in waitFor time,
|
// Eventuallyf asserts that given condition will be met in waitFor time,
|
||||||
// periodically checking target function each tick.
|
// periodically checking target function each tick.
|
||||||
//
|
//
|
||||||
// assert.Eventuallyf(t, func() bool { return true; }, time.Second, 10*time.Millisecond, "error message %s", "formatted")
|
// assert.Eventuallyf(t, func() bool { return true; }, time.Second, 10*time.Millisecond, "error message %s", "formatted")
|
||||||
func Eventuallyf(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool {
|
func Eventuallyf(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -155,9 +172,34 @@ func Eventuallyf(t TestingT, condition func() bool, waitFor time.Duration, tick
|
|||||||
return Eventually(t, condition, waitFor, tick, append([]interface{}{msg}, args...)...)
|
return Eventually(t, condition, waitFor, tick, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// EventuallyWithTf asserts that given condition will be met in waitFor time,
|
||||||
|
// periodically checking target function each tick. In contrast to Eventually,
|
||||||
|
// it supplies a CollectT to the condition function, so that the condition
|
||||||
|
// function can use the CollectT to call other assertions.
|
||||||
|
// The condition is considered "met" if no errors are raised in a tick.
|
||||||
|
// The supplied CollectT collects all errors from one tick (if there are any).
|
||||||
|
// If the condition is not met before waitFor, the collected errors of
|
||||||
|
// the last tick are copied to t.
|
||||||
|
//
|
||||||
|
// externalValue := false
|
||||||
|
// go func() {
|
||||||
|
// time.Sleep(8*time.Second)
|
||||||
|
// externalValue = true
|
||||||
|
// }()
|
||||||
|
// assert.EventuallyWithTf(t, func(c *assert.CollectT, "error message %s", "formatted") {
|
||||||
|
// // add assertions as needed; any assertion failure will fail the current tick
|
||||||
|
// assert.True(c, externalValue, "expected 'externalValue' to be true")
|
||||||
|
// }, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false")
|
||||||
|
func EventuallyWithTf(t TestingT, condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
return EventuallyWithT(t, condition, waitFor, tick, append([]interface{}{msg}, args...)...)
|
||||||
|
}
|
||||||
|
|
||||||
// Exactlyf asserts that two objects are equal in value and type.
|
// Exactlyf asserts that two objects are equal in value and type.
|
||||||
//
|
//
|
||||||
// assert.Exactlyf(t, int32(123), int64(123), "error message %s", "formatted")
|
// assert.Exactlyf(t, int32(123), int64(123), "error message %s", "formatted")
|
||||||
func Exactlyf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool {
|
func Exactlyf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -183,7 +225,7 @@ func FailNowf(t TestingT, failureMessage string, msg string, args ...interface{}
|
|||||||
|
|
||||||
// Falsef asserts that the specified value is false.
|
// Falsef asserts that the specified value is false.
|
||||||
//
|
//
|
||||||
// assert.Falsef(t, myBool, "error message %s", "formatted")
|
// assert.Falsef(t, myBool, "error message %s", "formatted")
|
||||||
func Falsef(t TestingT, value bool, msg string, args ...interface{}) bool {
|
func Falsef(t TestingT, value bool, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -202,9 +244,9 @@ func FileExistsf(t TestingT, path string, msg string, args ...interface{}) bool
|
|||||||
|
|
||||||
// Greaterf asserts that the first element is greater than the second
|
// Greaterf asserts that the first element is greater than the second
|
||||||
//
|
//
|
||||||
// assert.Greaterf(t, 2, 1, "error message %s", "formatted")
|
// assert.Greaterf(t, 2, 1, "error message %s", "formatted")
|
||||||
// assert.Greaterf(t, float64(2), float64(1), "error message %s", "formatted")
|
// assert.Greaterf(t, float64(2), float64(1), "error message %s", "formatted")
|
||||||
// assert.Greaterf(t, "b", "a", "error message %s", "formatted")
|
// assert.Greaterf(t, "b", "a", "error message %s", "formatted")
|
||||||
func Greaterf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool {
|
func Greaterf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -214,10 +256,10 @@ func Greaterf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...in
|
|||||||
|
|
||||||
// GreaterOrEqualf asserts that the first element is greater than or equal to the second
|
// GreaterOrEqualf asserts that the first element is greater than or equal to the second
|
||||||
//
|
//
|
||||||
// assert.GreaterOrEqualf(t, 2, 1, "error message %s", "formatted")
|
// assert.GreaterOrEqualf(t, 2, 1, "error message %s", "formatted")
|
||||||
// assert.GreaterOrEqualf(t, 2, 2, "error message %s", "formatted")
|
// assert.GreaterOrEqualf(t, 2, 2, "error message %s", "formatted")
|
||||||
// assert.GreaterOrEqualf(t, "b", "a", "error message %s", "formatted")
|
// assert.GreaterOrEqualf(t, "b", "a", "error message %s", "formatted")
|
||||||
// assert.GreaterOrEqualf(t, "b", "b", "error message %s", "formatted")
|
// assert.GreaterOrEqualf(t, "b", "b", "error message %s", "formatted")
|
||||||
func GreaterOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool {
|
func GreaterOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -228,7 +270,7 @@ func GreaterOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, arg
|
|||||||
// HTTPBodyContainsf asserts that a specified handler returns a
|
// HTTPBodyContainsf asserts that a specified handler returns a
|
||||||
// body that contains a string.
|
// body that contains a string.
|
||||||
//
|
//
|
||||||
// assert.HTTPBodyContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted")
|
// assert.HTTPBodyContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted")
|
||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
func HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool {
|
func HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool {
|
||||||
@@ -241,7 +283,7 @@ func HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url
|
|||||||
// HTTPBodyNotContainsf asserts that a specified handler returns a
|
// HTTPBodyNotContainsf asserts that a specified handler returns a
|
||||||
// body that does not contain a string.
|
// body that does not contain a string.
|
||||||
//
|
//
|
||||||
// assert.HTTPBodyNotContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted")
|
// assert.HTTPBodyNotContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted")
|
||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool {
|
func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool {
|
||||||
@@ -253,7 +295,7 @@ func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, u
|
|||||||
|
|
||||||
// HTTPErrorf asserts that a specified handler returns an error status code.
|
// HTTPErrorf asserts that a specified handler returns an error status code.
|
||||||
//
|
//
|
||||||
// assert.HTTPErrorf(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}}
|
// assert.HTTPErrorf(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}}
|
||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool {
|
func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool {
|
||||||
@@ -265,7 +307,7 @@ func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string,
|
|||||||
|
|
||||||
// HTTPRedirectf asserts that a specified handler returns a redirect status code.
|
// HTTPRedirectf asserts that a specified handler returns a redirect status code.
|
||||||
//
|
//
|
||||||
// assert.HTTPRedirectf(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}}
|
// assert.HTTPRedirectf(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}}
|
||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool {
|
func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool {
|
||||||
@@ -277,7 +319,7 @@ func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url stri
|
|||||||
|
|
||||||
// HTTPStatusCodef asserts that a specified handler returns a specified status code.
|
// HTTPStatusCodef asserts that a specified handler returns a specified status code.
|
||||||
//
|
//
|
||||||
// assert.HTTPStatusCodef(t, myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted")
|
// assert.HTTPStatusCodef(t, myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted")
|
||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
func HTTPStatusCodef(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msg string, args ...interface{}) bool {
|
func HTTPStatusCodef(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msg string, args ...interface{}) bool {
|
||||||
@@ -289,7 +331,7 @@ func HTTPStatusCodef(t TestingT, handler http.HandlerFunc, method string, url st
|
|||||||
|
|
||||||
// HTTPSuccessf asserts that a specified handler returns a success status code.
|
// HTTPSuccessf asserts that a specified handler returns a success status code.
|
||||||
//
|
//
|
||||||
// assert.HTTPSuccessf(t, myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted")
|
// assert.HTTPSuccessf(t, myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted")
|
||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool {
|
func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool {
|
||||||
@@ -301,7 +343,7 @@ func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url strin
|
|||||||
|
|
||||||
// Implementsf asserts that an object is implemented by the specified interface.
|
// Implementsf asserts that an object is implemented by the specified interface.
|
||||||
//
|
//
|
||||||
// assert.Implementsf(t, (*MyInterface)(nil), new(MyObject), "error message %s", "formatted")
|
// assert.Implementsf(t, (*MyInterface)(nil), new(MyObject), "error message %s", "formatted")
|
||||||
func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool {
|
func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -311,7 +353,7 @@ func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, ms
|
|||||||
|
|
||||||
// InDeltaf asserts that the two numerals are within delta of each other.
|
// InDeltaf asserts that the two numerals are within delta of each other.
|
||||||
//
|
//
|
||||||
// assert.InDeltaf(t, math.Pi, 22/7.0, 0.01, "error message %s", "formatted")
|
// assert.InDeltaf(t, math.Pi, 22/7.0, 0.01, "error message %s", "formatted")
|
||||||
func InDeltaf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool {
|
func InDeltaf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -353,9 +395,9 @@ func InEpsilonSlicef(t TestingT, expected interface{}, actual interface{}, epsil
|
|||||||
|
|
||||||
// IsDecreasingf asserts that the collection is decreasing
|
// IsDecreasingf asserts that the collection is decreasing
|
||||||
//
|
//
|
||||||
// assert.IsDecreasingf(t, []int{2, 1, 0}, "error message %s", "formatted")
|
// assert.IsDecreasingf(t, []int{2, 1, 0}, "error message %s", "formatted")
|
||||||
// assert.IsDecreasingf(t, []float{2, 1}, "error message %s", "formatted")
|
// assert.IsDecreasingf(t, []float{2, 1}, "error message %s", "formatted")
|
||||||
// assert.IsDecreasingf(t, []string{"b", "a"}, "error message %s", "formatted")
|
// assert.IsDecreasingf(t, []string{"b", "a"}, "error message %s", "formatted")
|
||||||
func IsDecreasingf(t TestingT, object interface{}, msg string, args ...interface{}) bool {
|
func IsDecreasingf(t TestingT, object interface{}, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -365,9 +407,9 @@ func IsDecreasingf(t TestingT, object interface{}, msg string, args ...interface
|
|||||||
|
|
||||||
// IsIncreasingf asserts that the collection is increasing
|
// IsIncreasingf asserts that the collection is increasing
|
||||||
//
|
//
|
||||||
// assert.IsIncreasingf(t, []int{1, 2, 3}, "error message %s", "formatted")
|
// assert.IsIncreasingf(t, []int{1, 2, 3}, "error message %s", "formatted")
|
||||||
// assert.IsIncreasingf(t, []float{1, 2}, "error message %s", "formatted")
|
// assert.IsIncreasingf(t, []float{1, 2}, "error message %s", "formatted")
|
||||||
// assert.IsIncreasingf(t, []string{"a", "b"}, "error message %s", "formatted")
|
// assert.IsIncreasingf(t, []string{"a", "b"}, "error message %s", "formatted")
|
||||||
func IsIncreasingf(t TestingT, object interface{}, msg string, args ...interface{}) bool {
|
func IsIncreasingf(t TestingT, object interface{}, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -377,9 +419,9 @@ func IsIncreasingf(t TestingT, object interface{}, msg string, args ...interface
|
|||||||
|
|
||||||
// IsNonDecreasingf asserts that the collection is not decreasing
|
// IsNonDecreasingf asserts that the collection is not decreasing
|
||||||
//
|
//
|
||||||
// assert.IsNonDecreasingf(t, []int{1, 1, 2}, "error message %s", "formatted")
|
// assert.IsNonDecreasingf(t, []int{1, 1, 2}, "error message %s", "formatted")
|
||||||
// assert.IsNonDecreasingf(t, []float{1, 2}, "error message %s", "formatted")
|
// assert.IsNonDecreasingf(t, []float{1, 2}, "error message %s", "formatted")
|
||||||
// assert.IsNonDecreasingf(t, []string{"a", "b"}, "error message %s", "formatted")
|
// assert.IsNonDecreasingf(t, []string{"a", "b"}, "error message %s", "formatted")
|
||||||
func IsNonDecreasingf(t TestingT, object interface{}, msg string, args ...interface{}) bool {
|
func IsNonDecreasingf(t TestingT, object interface{}, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -389,9 +431,9 @@ func IsNonDecreasingf(t TestingT, object interface{}, msg string, args ...interf
|
|||||||
|
|
||||||
// IsNonIncreasingf asserts that the collection is not increasing
|
// IsNonIncreasingf asserts that the collection is not increasing
|
||||||
//
|
//
|
||||||
// assert.IsNonIncreasingf(t, []int{2, 1, 1}, "error message %s", "formatted")
|
// assert.IsNonIncreasingf(t, []int{2, 1, 1}, "error message %s", "formatted")
|
||||||
// assert.IsNonIncreasingf(t, []float{2, 1}, "error message %s", "formatted")
|
// assert.IsNonIncreasingf(t, []float{2, 1}, "error message %s", "formatted")
|
||||||
// assert.IsNonIncreasingf(t, []string{"b", "a"}, "error message %s", "formatted")
|
// assert.IsNonIncreasingf(t, []string{"b", "a"}, "error message %s", "formatted")
|
||||||
func IsNonIncreasingf(t TestingT, object interface{}, msg string, args ...interface{}) bool {
|
func IsNonIncreasingf(t TestingT, object interface{}, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -409,7 +451,7 @@ func IsTypef(t TestingT, expectedType interface{}, object interface{}, msg strin
|
|||||||
|
|
||||||
// JSONEqf asserts that two JSON strings are equivalent.
|
// JSONEqf asserts that two JSON strings are equivalent.
|
||||||
//
|
//
|
||||||
// assert.JSONEqf(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted")
|
// assert.JSONEqf(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted")
|
||||||
func JSONEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) bool {
|
func JSONEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -420,7 +462,7 @@ func JSONEqf(t TestingT, expected string, actual string, msg string, args ...int
|
|||||||
// Lenf asserts that the specified object has specific length.
|
// Lenf asserts that the specified object has specific length.
|
||||||
// Lenf also fails if the object has a type that len() not accept.
|
// Lenf also fails if the object has a type that len() not accept.
|
||||||
//
|
//
|
||||||
// assert.Lenf(t, mySlice, 3, "error message %s", "formatted")
|
// assert.Lenf(t, mySlice, 3, "error message %s", "formatted")
|
||||||
func Lenf(t TestingT, object interface{}, length int, msg string, args ...interface{}) bool {
|
func Lenf(t TestingT, object interface{}, length int, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -430,9 +472,9 @@ func Lenf(t TestingT, object interface{}, length int, msg string, args ...interf
|
|||||||
|
|
||||||
// Lessf asserts that the first element is less than the second
|
// Lessf asserts that the first element is less than the second
|
||||||
//
|
//
|
||||||
// assert.Lessf(t, 1, 2, "error message %s", "formatted")
|
// assert.Lessf(t, 1, 2, "error message %s", "formatted")
|
||||||
// assert.Lessf(t, float64(1), float64(2), "error message %s", "formatted")
|
// assert.Lessf(t, float64(1), float64(2), "error message %s", "formatted")
|
||||||
// assert.Lessf(t, "a", "b", "error message %s", "formatted")
|
// assert.Lessf(t, "a", "b", "error message %s", "formatted")
|
||||||
func Lessf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool {
|
func Lessf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -442,10 +484,10 @@ func Lessf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...inter
|
|||||||
|
|
||||||
// LessOrEqualf asserts that the first element is less than or equal to the second
|
// LessOrEqualf asserts that the first element is less than or equal to the second
|
||||||
//
|
//
|
||||||
// assert.LessOrEqualf(t, 1, 2, "error message %s", "formatted")
|
// assert.LessOrEqualf(t, 1, 2, "error message %s", "formatted")
|
||||||
// assert.LessOrEqualf(t, 2, 2, "error message %s", "formatted")
|
// assert.LessOrEqualf(t, 2, 2, "error message %s", "formatted")
|
||||||
// assert.LessOrEqualf(t, "a", "b", "error message %s", "formatted")
|
// assert.LessOrEqualf(t, "a", "b", "error message %s", "formatted")
|
||||||
// assert.LessOrEqualf(t, "b", "b", "error message %s", "formatted")
|
// assert.LessOrEqualf(t, "b", "b", "error message %s", "formatted")
|
||||||
func LessOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool {
|
func LessOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -455,8 +497,8 @@ func LessOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args .
|
|||||||
|
|
||||||
// Negativef asserts that the specified element is negative
|
// Negativef asserts that the specified element is negative
|
||||||
//
|
//
|
||||||
// assert.Negativef(t, -1, "error message %s", "formatted")
|
// assert.Negativef(t, -1, "error message %s", "formatted")
|
||||||
// assert.Negativef(t, -1.23, "error message %s", "formatted")
|
// assert.Negativef(t, -1.23, "error message %s", "formatted")
|
||||||
func Negativef(t TestingT, e interface{}, msg string, args ...interface{}) bool {
|
func Negativef(t TestingT, e interface{}, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -467,7 +509,7 @@ func Negativef(t TestingT, e interface{}, msg string, args ...interface{}) bool
|
|||||||
// Neverf asserts that the given condition doesn't satisfy in waitFor time,
|
// Neverf asserts that the given condition doesn't satisfy in waitFor time,
|
||||||
// periodically checking the target function each tick.
|
// periodically checking the target function each tick.
|
||||||
//
|
//
|
||||||
// assert.Neverf(t, func() bool { return false; }, time.Second, 10*time.Millisecond, "error message %s", "formatted")
|
// assert.Neverf(t, func() bool { return false; }, time.Second, 10*time.Millisecond, "error message %s", "formatted")
|
||||||
func Neverf(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool {
|
func Neverf(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -477,7 +519,7 @@ func Neverf(t TestingT, condition func() bool, waitFor time.Duration, tick time.
|
|||||||
|
|
||||||
// Nilf asserts that the specified object is nil.
|
// Nilf asserts that the specified object is nil.
|
||||||
//
|
//
|
||||||
// assert.Nilf(t, err, "error message %s", "formatted")
|
// assert.Nilf(t, err, "error message %s", "formatted")
|
||||||
func Nilf(t TestingT, object interface{}, msg string, args ...interface{}) bool {
|
func Nilf(t TestingT, object interface{}, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -496,10 +538,10 @@ func NoDirExistsf(t TestingT, path string, msg string, args ...interface{}) bool
|
|||||||
|
|
||||||
// NoErrorf asserts that a function returned no error (i.e. `nil`).
|
// NoErrorf asserts that a function returned no error (i.e. `nil`).
|
||||||
//
|
//
|
||||||
// actualObj, err := SomeFunction()
|
// actualObj, err := SomeFunction()
|
||||||
// if assert.NoErrorf(t, err, "error message %s", "formatted") {
|
// if assert.NoErrorf(t, err, "error message %s", "formatted") {
|
||||||
// assert.Equal(t, expectedObj, actualObj)
|
// assert.Equal(t, expectedObj, actualObj)
|
||||||
// }
|
// }
|
||||||
func NoErrorf(t TestingT, err error, msg string, args ...interface{}) bool {
|
func NoErrorf(t TestingT, err error, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -519,9 +561,9 @@ func NoFileExistsf(t TestingT, path string, msg string, args ...interface{}) boo
|
|||||||
// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the
|
// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the
|
||||||
// specified substring or element.
|
// specified substring or element.
|
||||||
//
|
//
|
||||||
// assert.NotContainsf(t, "Hello World", "Earth", "error message %s", "formatted")
|
// assert.NotContainsf(t, "Hello World", "Earth", "error message %s", "formatted")
|
||||||
// assert.NotContainsf(t, ["Hello", "World"], "Earth", "error message %s", "formatted")
|
// assert.NotContainsf(t, ["Hello", "World"], "Earth", "error message %s", "formatted")
|
||||||
// assert.NotContainsf(t, {"Hello": "World"}, "Earth", "error message %s", "formatted")
|
// assert.NotContainsf(t, {"Hello": "World"}, "Earth", "error message %s", "formatted")
|
||||||
func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) bool {
|
func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -532,9 +574,9 @@ func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, a
|
|||||||
// NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either
|
// NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either
|
||||||
// a slice or a channel with len == 0.
|
// a slice or a channel with len == 0.
|
||||||
//
|
//
|
||||||
// if assert.NotEmptyf(t, obj, "error message %s", "formatted") {
|
// if assert.NotEmptyf(t, obj, "error message %s", "formatted") {
|
||||||
// assert.Equal(t, "two", obj[1])
|
// assert.Equal(t, "two", obj[1])
|
||||||
// }
|
// }
|
||||||
func NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{}) bool {
|
func NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -544,7 +586,7 @@ func NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{})
|
|||||||
|
|
||||||
// NotEqualf asserts that the specified values are NOT equal.
|
// NotEqualf asserts that the specified values are NOT equal.
|
||||||
//
|
//
|
||||||
// assert.NotEqualf(t, obj1, obj2, "error message %s", "formatted")
|
// assert.NotEqualf(t, obj1, obj2, "error message %s", "formatted")
|
||||||
//
|
//
|
||||||
// Pointer variable equality is determined based on the equality of the
|
// Pointer variable equality is determined based on the equality of the
|
||||||
// referenced values (as opposed to the memory addresses).
|
// referenced values (as opposed to the memory addresses).
|
||||||
@@ -557,7 +599,7 @@ func NotEqualf(t TestingT, expected interface{}, actual interface{}, msg string,
|
|||||||
|
|
||||||
// NotEqualValuesf asserts that two objects are not equal even when converted to the same type
|
// NotEqualValuesf asserts that two objects are not equal even when converted to the same type
|
||||||
//
|
//
|
||||||
// assert.NotEqualValuesf(t, obj1, obj2, "error message %s", "formatted")
|
// assert.NotEqualValuesf(t, obj1, obj2, "error message %s", "formatted")
|
||||||
func NotEqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool {
|
func NotEqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -576,7 +618,7 @@ func NotErrorIsf(t TestingT, err error, target error, msg string, args ...interf
|
|||||||
|
|
||||||
// NotNilf asserts that the specified object is not nil.
|
// NotNilf asserts that the specified object is not nil.
|
||||||
//
|
//
|
||||||
// assert.NotNilf(t, err, "error message %s", "formatted")
|
// assert.NotNilf(t, err, "error message %s", "formatted")
|
||||||
func NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) bool {
|
func NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -586,7 +628,7 @@ func NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) bo
|
|||||||
|
|
||||||
// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic.
|
// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic.
|
||||||
//
|
//
|
||||||
// assert.NotPanicsf(t, func(){ RemainCalm() }, "error message %s", "formatted")
|
// assert.NotPanicsf(t, func(){ RemainCalm() }, "error message %s", "formatted")
|
||||||
func NotPanicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool {
|
func NotPanicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -596,8 +638,8 @@ func NotPanicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bo
|
|||||||
|
|
||||||
// NotRegexpf asserts that a specified regexp does not match a string.
|
// NotRegexpf asserts that a specified regexp does not match a string.
|
||||||
//
|
//
|
||||||
// assert.NotRegexpf(t, regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted")
|
// assert.NotRegexpf(t, regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted")
|
||||||
// assert.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted")
|
// assert.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted")
|
||||||
func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool {
|
func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -607,7 +649,7 @@ func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ..
|
|||||||
|
|
||||||
// NotSamef asserts that two pointers do not reference the same object.
|
// NotSamef asserts that two pointers do not reference the same object.
|
||||||
//
|
//
|
||||||
// assert.NotSamef(t, ptr1, ptr2, "error message %s", "formatted")
|
// assert.NotSamef(t, ptr1, ptr2, "error message %s", "formatted")
|
||||||
//
|
//
|
||||||
// Both arguments must be pointer variables. Pointer variable sameness is
|
// Both arguments must be pointer variables. Pointer variable sameness is
|
||||||
// determined based on the equality of both type and value.
|
// determined based on the equality of both type and value.
|
||||||
@@ -621,7 +663,7 @@ func NotSamef(t TestingT, expected interface{}, actual interface{}, msg string,
|
|||||||
// NotSubsetf asserts that the specified list(array, slice...) contains not all
|
// NotSubsetf asserts that the specified list(array, slice...) contains not all
|
||||||
// elements given in the specified subset(array, slice...).
|
// elements given in the specified subset(array, slice...).
|
||||||
//
|
//
|
||||||
// assert.NotSubsetf(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted")
|
// assert.NotSubsetf(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted")
|
||||||
func NotSubsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) bool {
|
func NotSubsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -639,7 +681,7 @@ func NotZerof(t TestingT, i interface{}, msg string, args ...interface{}) bool {
|
|||||||
|
|
||||||
// Panicsf asserts that the code inside the specified PanicTestFunc panics.
|
// Panicsf asserts that the code inside the specified PanicTestFunc panics.
|
||||||
//
|
//
|
||||||
// assert.Panicsf(t, func(){ GoCrazy() }, "error message %s", "formatted")
|
// assert.Panicsf(t, func(){ GoCrazy() }, "error message %s", "formatted")
|
||||||
func Panicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool {
|
func Panicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -651,7 +693,7 @@ func Panicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool
|
|||||||
// panics, and that the recovered panic value is an error that satisfies the
|
// panics, and that the recovered panic value is an error that satisfies the
|
||||||
// EqualError comparison.
|
// EqualError comparison.
|
||||||
//
|
//
|
||||||
// assert.PanicsWithErrorf(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted")
|
// assert.PanicsWithErrorf(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted")
|
||||||
func PanicsWithErrorf(t TestingT, errString string, f PanicTestFunc, msg string, args ...interface{}) bool {
|
func PanicsWithErrorf(t TestingT, errString string, f PanicTestFunc, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -662,7 +704,7 @@ func PanicsWithErrorf(t TestingT, errString string, f PanicTestFunc, msg string,
|
|||||||
// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that
|
// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that
|
||||||
// the recovered panic value equals the expected panic value.
|
// the recovered panic value equals the expected panic value.
|
||||||
//
|
//
|
||||||
// assert.PanicsWithValuef(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted")
|
// assert.PanicsWithValuef(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted")
|
||||||
func PanicsWithValuef(t TestingT, expected interface{}, f PanicTestFunc, msg string, args ...interface{}) bool {
|
func PanicsWithValuef(t TestingT, expected interface{}, f PanicTestFunc, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -672,8 +714,8 @@ func PanicsWithValuef(t TestingT, expected interface{}, f PanicTestFunc, msg str
|
|||||||
|
|
||||||
// Positivef asserts that the specified element is positive
|
// Positivef asserts that the specified element is positive
|
||||||
//
|
//
|
||||||
// assert.Positivef(t, 1, "error message %s", "formatted")
|
// assert.Positivef(t, 1, "error message %s", "formatted")
|
||||||
// assert.Positivef(t, 1.23, "error message %s", "formatted")
|
// assert.Positivef(t, 1.23, "error message %s", "formatted")
|
||||||
func Positivef(t TestingT, e interface{}, msg string, args ...interface{}) bool {
|
func Positivef(t TestingT, e interface{}, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -683,8 +725,8 @@ func Positivef(t TestingT, e interface{}, msg string, args ...interface{}) bool
|
|||||||
|
|
||||||
// Regexpf asserts that a specified regexp matches a string.
|
// Regexpf asserts that a specified regexp matches a string.
|
||||||
//
|
//
|
||||||
// assert.Regexpf(t, regexp.MustCompile("start"), "it's starting", "error message %s", "formatted")
|
// assert.Regexpf(t, regexp.MustCompile("start"), "it's starting", "error message %s", "formatted")
|
||||||
// assert.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted")
|
// assert.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted")
|
||||||
func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool {
|
func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -694,7 +736,7 @@ func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...in
|
|||||||
|
|
||||||
// Samef asserts that two pointers reference the same object.
|
// Samef asserts that two pointers reference the same object.
|
||||||
//
|
//
|
||||||
// assert.Samef(t, ptr1, ptr2, "error message %s", "formatted")
|
// assert.Samef(t, ptr1, ptr2, "error message %s", "formatted")
|
||||||
//
|
//
|
||||||
// Both arguments must be pointer variables. Pointer variable sameness is
|
// Both arguments must be pointer variables. Pointer variable sameness is
|
||||||
// determined based on the equality of both type and value.
|
// determined based on the equality of both type and value.
|
||||||
@@ -708,7 +750,7 @@ func Samef(t TestingT, expected interface{}, actual interface{}, msg string, arg
|
|||||||
// Subsetf asserts that the specified list(array, slice...) contains all
|
// Subsetf asserts that the specified list(array, slice...) contains all
|
||||||
// elements given in the specified subset(array, slice...).
|
// elements given in the specified subset(array, slice...).
|
||||||
//
|
//
|
||||||
// assert.Subsetf(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted")
|
// assert.Subsetf(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted")
|
||||||
func Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) bool {
|
func Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -718,7 +760,7 @@ func Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args
|
|||||||
|
|
||||||
// Truef asserts that the specified value is true.
|
// Truef asserts that the specified value is true.
|
||||||
//
|
//
|
||||||
// assert.Truef(t, myBool, "error message %s", "formatted")
|
// assert.Truef(t, myBool, "error message %s", "formatted")
|
||||||
func Truef(t TestingT, value bool, msg string, args ...interface{}) bool {
|
func Truef(t TestingT, value bool, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -728,7 +770,7 @@ func Truef(t TestingT, value bool, msg string, args ...interface{}) bool {
|
|||||||
|
|
||||||
// WithinDurationf asserts that the two times are within duration delta of each other.
|
// WithinDurationf asserts that the two times are within duration delta of each other.
|
||||||
//
|
//
|
||||||
// assert.WithinDurationf(t, time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted")
|
// assert.WithinDurationf(t, time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted")
|
||||||
func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) bool {
|
func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -738,7 +780,7 @@ func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta tim
|
|||||||
|
|
||||||
// WithinRangef asserts that a time is within a time range (inclusive).
|
// WithinRangef asserts that a time is within a time range (inclusive).
|
||||||
//
|
//
|
||||||
// assert.WithinRangef(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second), "error message %s", "formatted")
|
// assert.WithinRangef(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second), "error message %s", "formatted")
|
||||||
func WithinRangef(t TestingT, actual time.Time, start time.Time, end time.Time, msg string, args ...interface{}) bool {
|
func WithinRangef(t TestingT, actual time.Time, start time.Time, end time.Time, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
|
|||||||
+258
-174
File diff suppressed because it is too large
Load Diff
+12
-12
@@ -46,36 +46,36 @@ func isOrdered(t TestingT, object interface{}, allowedComparesResults []CompareT
|
|||||||
|
|
||||||
// IsIncreasing asserts that the collection is increasing
|
// IsIncreasing asserts that the collection is increasing
|
||||||
//
|
//
|
||||||
// assert.IsIncreasing(t, []int{1, 2, 3})
|
// assert.IsIncreasing(t, []int{1, 2, 3})
|
||||||
// assert.IsIncreasing(t, []float{1, 2})
|
// assert.IsIncreasing(t, []float{1, 2})
|
||||||
// assert.IsIncreasing(t, []string{"a", "b"})
|
// assert.IsIncreasing(t, []string{"a", "b"})
|
||||||
func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
||||||
return isOrdered(t, object, []CompareType{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs...)
|
return isOrdered(t, object, []CompareType{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsNonIncreasing asserts that the collection is not increasing
|
// IsNonIncreasing asserts that the collection is not increasing
|
||||||
//
|
//
|
||||||
// assert.IsNonIncreasing(t, []int{2, 1, 1})
|
// assert.IsNonIncreasing(t, []int{2, 1, 1})
|
||||||
// assert.IsNonIncreasing(t, []float{2, 1})
|
// assert.IsNonIncreasing(t, []float{2, 1})
|
||||||
// assert.IsNonIncreasing(t, []string{"b", "a"})
|
// assert.IsNonIncreasing(t, []string{"b", "a"})
|
||||||
func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
||||||
return isOrdered(t, object, []CompareType{compareEqual, compareGreater}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs...)
|
return isOrdered(t, object, []CompareType{compareEqual, compareGreater}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsDecreasing asserts that the collection is decreasing
|
// IsDecreasing asserts that the collection is decreasing
|
||||||
//
|
//
|
||||||
// assert.IsDecreasing(t, []int{2, 1, 0})
|
// assert.IsDecreasing(t, []int{2, 1, 0})
|
||||||
// assert.IsDecreasing(t, []float{2, 1})
|
// assert.IsDecreasing(t, []float{2, 1})
|
||||||
// assert.IsDecreasing(t, []string{"b", "a"})
|
// assert.IsDecreasing(t, []string{"b", "a"})
|
||||||
func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
||||||
return isOrdered(t, object, []CompareType{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs...)
|
return isOrdered(t, object, []CompareType{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsNonDecreasing asserts that the collection is not decreasing
|
// IsNonDecreasing asserts that the collection is not decreasing
|
||||||
//
|
//
|
||||||
// assert.IsNonDecreasing(t, []int{1, 1, 2})
|
// assert.IsNonDecreasing(t, []int{1, 1, 2})
|
||||||
// assert.IsNonDecreasing(t, []float{1, 2})
|
// assert.IsNonDecreasing(t, []float{1, 2})
|
||||||
// assert.IsNonDecreasing(t, []string{"a", "b"})
|
// assert.IsNonDecreasing(t, []string{"a", "b"})
|
||||||
func IsNonDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
func IsNonDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
||||||
return isOrdered(t, object, []CompareType{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs...)
|
return isOrdered(t, object, []CompareType{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|||||||
+252
-54
@@ -75,6 +75,77 @@ func ObjectsAreEqual(expected, actual interface{}) bool {
|
|||||||
return bytes.Equal(exp, act)
|
return bytes.Equal(exp, act)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// copyExportedFields iterates downward through nested data structures and creates a copy
|
||||||
|
// that only contains the exported struct fields.
|
||||||
|
func copyExportedFields(expected interface{}) interface{} {
|
||||||
|
if isNil(expected) {
|
||||||
|
return expected
|
||||||
|
}
|
||||||
|
|
||||||
|
expectedType := reflect.TypeOf(expected)
|
||||||
|
expectedKind := expectedType.Kind()
|
||||||
|
expectedValue := reflect.ValueOf(expected)
|
||||||
|
|
||||||
|
switch expectedKind {
|
||||||
|
case reflect.Struct:
|
||||||
|
result := reflect.New(expectedType).Elem()
|
||||||
|
for i := 0; i < expectedType.NumField(); i++ {
|
||||||
|
field := expectedType.Field(i)
|
||||||
|
isExported := field.IsExported()
|
||||||
|
if isExported {
|
||||||
|
fieldValue := expectedValue.Field(i)
|
||||||
|
if isNil(fieldValue) || isNil(fieldValue.Interface()) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
newValue := copyExportedFields(fieldValue.Interface())
|
||||||
|
result.Field(i).Set(reflect.ValueOf(newValue))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result.Interface()
|
||||||
|
|
||||||
|
case reflect.Ptr:
|
||||||
|
result := reflect.New(expectedType.Elem())
|
||||||
|
unexportedRemoved := copyExportedFields(expectedValue.Elem().Interface())
|
||||||
|
result.Elem().Set(reflect.ValueOf(unexportedRemoved))
|
||||||
|
return result.Interface()
|
||||||
|
|
||||||
|
case reflect.Array, reflect.Slice:
|
||||||
|
result := reflect.MakeSlice(expectedType, expectedValue.Len(), expectedValue.Len())
|
||||||
|
for i := 0; i < expectedValue.Len(); i++ {
|
||||||
|
index := expectedValue.Index(i)
|
||||||
|
if isNil(index) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
unexportedRemoved := copyExportedFields(index.Interface())
|
||||||
|
result.Index(i).Set(reflect.ValueOf(unexportedRemoved))
|
||||||
|
}
|
||||||
|
return result.Interface()
|
||||||
|
|
||||||
|
case reflect.Map:
|
||||||
|
result := reflect.MakeMap(expectedType)
|
||||||
|
for _, k := range expectedValue.MapKeys() {
|
||||||
|
index := expectedValue.MapIndex(k)
|
||||||
|
unexportedRemoved := copyExportedFields(index.Interface())
|
||||||
|
result.SetMapIndex(k, reflect.ValueOf(unexportedRemoved))
|
||||||
|
}
|
||||||
|
return result.Interface()
|
||||||
|
|
||||||
|
default:
|
||||||
|
return expected
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ObjectsExportedFieldsAreEqual determines if the exported (public) fields of two objects are
|
||||||
|
// considered equal. This comparison of only exported fields is applied recursively to nested data
|
||||||
|
// structures.
|
||||||
|
//
|
||||||
|
// This function does no assertion of any kind.
|
||||||
|
func ObjectsExportedFieldsAreEqual(expected, actual interface{}) bool {
|
||||||
|
expectedCleaned := copyExportedFields(expected)
|
||||||
|
actualCleaned := copyExportedFields(actual)
|
||||||
|
return ObjectsAreEqualValues(expectedCleaned, actualCleaned)
|
||||||
|
}
|
||||||
|
|
||||||
// ObjectsAreEqualValues gets whether two objects are equal, or if their
|
// ObjectsAreEqualValues gets whether two objects are equal, or if their
|
||||||
// values are equal.
|
// values are equal.
|
||||||
func ObjectsAreEqualValues(expected, actual interface{}) bool {
|
func ObjectsAreEqualValues(expected, actual interface{}) bool {
|
||||||
@@ -271,7 +342,7 @@ type labeledContent struct {
|
|||||||
|
|
||||||
// labeledOutput returns a string consisting of the provided labeledContent. Each labeled output is appended in the following manner:
|
// labeledOutput returns a string consisting of the provided labeledContent. Each labeled output is appended in the following manner:
|
||||||
//
|
//
|
||||||
// \t{{label}}:{{align_spaces}}\t{{content}}\n
|
// \t{{label}}:{{align_spaces}}\t{{content}}\n
|
||||||
//
|
//
|
||||||
// The initial carriage return is required to undo/erase any padding added by testing.T.Errorf. The "\t{{label}}:" is for the label.
|
// The initial carriage return is required to undo/erase any padding added by testing.T.Errorf. The "\t{{label}}:" is for the label.
|
||||||
// If a label is shorter than the longest label provided, padding spaces are added to make all the labels match in length. Once this
|
// If a label is shorter than the longest label provided, padding spaces are added to make all the labels match in length. Once this
|
||||||
@@ -294,7 +365,7 @@ func labeledOutput(content ...labeledContent) string {
|
|||||||
|
|
||||||
// Implements asserts that an object is implemented by the specified interface.
|
// Implements asserts that an object is implemented by the specified interface.
|
||||||
//
|
//
|
||||||
// assert.Implements(t, (*MyInterface)(nil), new(MyObject))
|
// assert.Implements(t, (*MyInterface)(nil), new(MyObject))
|
||||||
func Implements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool {
|
func Implements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -326,7 +397,7 @@ func IsType(t TestingT, expectedType interface{}, object interface{}, msgAndArgs
|
|||||||
|
|
||||||
// Equal asserts that two objects are equal.
|
// Equal asserts that two objects are equal.
|
||||||
//
|
//
|
||||||
// assert.Equal(t, 123, 123)
|
// assert.Equal(t, 123, 123)
|
||||||
//
|
//
|
||||||
// Pointer variable equality is determined based on the equality of the
|
// Pointer variable equality is determined based on the equality of the
|
||||||
// referenced values (as opposed to the memory addresses). Function equality
|
// referenced values (as opposed to the memory addresses). Function equality
|
||||||
@@ -367,7 +438,7 @@ func validateEqualArgs(expected, actual interface{}) error {
|
|||||||
|
|
||||||
// Same asserts that two pointers reference the same object.
|
// Same asserts that two pointers reference the same object.
|
||||||
//
|
//
|
||||||
// assert.Same(t, ptr1, ptr2)
|
// assert.Same(t, ptr1, ptr2)
|
||||||
//
|
//
|
||||||
// Both arguments must be pointer variables. Pointer variable sameness is
|
// Both arguments must be pointer variables. Pointer variable sameness is
|
||||||
// determined based on the equality of both type and value.
|
// determined based on the equality of both type and value.
|
||||||
@@ -387,7 +458,7 @@ func Same(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) b
|
|||||||
|
|
||||||
// NotSame asserts that two pointers do not reference the same object.
|
// NotSame asserts that two pointers do not reference the same object.
|
||||||
//
|
//
|
||||||
// assert.NotSame(t, ptr1, ptr2)
|
// assert.NotSame(t, ptr1, ptr2)
|
||||||
//
|
//
|
||||||
// Both arguments must be pointer variables. Pointer variable sameness is
|
// Both arguments must be pointer variables. Pointer variable sameness is
|
||||||
// determined based on the equality of both type and value.
|
// determined based on the equality of both type and value.
|
||||||
@@ -455,7 +526,7 @@ func truncatingFormat(data interface{}) string {
|
|||||||
// EqualValues asserts that two objects are equal or convertable to the same types
|
// EqualValues asserts that two objects are equal or convertable to the same types
|
||||||
// and equal.
|
// and equal.
|
||||||
//
|
//
|
||||||
// assert.EqualValues(t, uint32(123), int32(123))
|
// assert.EqualValues(t, uint32(123), int32(123))
|
||||||
func EqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {
|
func EqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -473,9 +544,53 @@ func EqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interfa
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// EqualExportedValues asserts that the types of two objects are equal and their public
|
||||||
|
// fields are also equal. This is useful for comparing structs that have private fields
|
||||||
|
// that could potentially differ.
|
||||||
|
//
|
||||||
|
// type S struct {
|
||||||
|
// Exported int
|
||||||
|
// notExported int
|
||||||
|
// }
|
||||||
|
// assert.EqualExportedValues(t, S{1, 2}, S{1, 3}) => true
|
||||||
|
// assert.EqualExportedValues(t, S{1, 2}, S{2, 3}) => false
|
||||||
|
func EqualExportedValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
|
||||||
|
aType := reflect.TypeOf(expected)
|
||||||
|
bType := reflect.TypeOf(actual)
|
||||||
|
|
||||||
|
if aType != bType {
|
||||||
|
return Fail(t, fmt.Sprintf("Types expected to match exactly\n\t%v != %v", aType, bType), msgAndArgs...)
|
||||||
|
}
|
||||||
|
|
||||||
|
if aType.Kind() != reflect.Struct {
|
||||||
|
return Fail(t, fmt.Sprintf("Types expected to both be struct \n\t%v != %v", aType.Kind(), reflect.Struct), msgAndArgs...)
|
||||||
|
}
|
||||||
|
|
||||||
|
if bType.Kind() != reflect.Struct {
|
||||||
|
return Fail(t, fmt.Sprintf("Types expected to both be struct \n\t%v != %v", bType.Kind(), reflect.Struct), msgAndArgs...)
|
||||||
|
}
|
||||||
|
|
||||||
|
expected = copyExportedFields(expected)
|
||||||
|
actual = copyExportedFields(actual)
|
||||||
|
|
||||||
|
if !ObjectsAreEqualValues(expected, actual) {
|
||||||
|
diff := diff(expected, actual)
|
||||||
|
expected, actual = formatUnequalValues(expected, actual)
|
||||||
|
return Fail(t, fmt.Sprintf("Not equal (comparing only exported fields): \n"+
|
||||||
|
"expected: %s\n"+
|
||||||
|
"actual : %s%s", expected, actual, diff), msgAndArgs...)
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
// Exactly asserts that two objects are equal in value and type.
|
// Exactly asserts that two objects are equal in value and type.
|
||||||
//
|
//
|
||||||
// assert.Exactly(t, int32(123), int64(123))
|
// assert.Exactly(t, int32(123), int64(123))
|
||||||
func Exactly(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {
|
func Exactly(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -494,7 +609,7 @@ func Exactly(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}
|
|||||||
|
|
||||||
// NotNil asserts that the specified object is not nil.
|
// NotNil asserts that the specified object is not nil.
|
||||||
//
|
//
|
||||||
// assert.NotNil(t, err)
|
// assert.NotNil(t, err)
|
||||||
func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
||||||
if !isNil(object) {
|
if !isNil(object) {
|
||||||
return true
|
return true
|
||||||
@@ -540,7 +655,7 @@ func isNil(object interface{}) bool {
|
|||||||
|
|
||||||
// Nil asserts that the specified object is nil.
|
// Nil asserts that the specified object is nil.
|
||||||
//
|
//
|
||||||
// assert.Nil(t, err)
|
// assert.Nil(t, err)
|
||||||
func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
||||||
if isNil(object) {
|
if isNil(object) {
|
||||||
return true
|
return true
|
||||||
@@ -583,7 +698,7 @@ func isEmpty(object interface{}) bool {
|
|||||||
// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either
|
// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either
|
||||||
// a slice or a channel with len == 0.
|
// a slice or a channel with len == 0.
|
||||||
//
|
//
|
||||||
// assert.Empty(t, obj)
|
// assert.Empty(t, obj)
|
||||||
func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
||||||
pass := isEmpty(object)
|
pass := isEmpty(object)
|
||||||
if !pass {
|
if !pass {
|
||||||
@@ -600,9 +715,9 @@ func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
|||||||
// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either
|
// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either
|
||||||
// a slice or a channel with len == 0.
|
// a slice or a channel with len == 0.
|
||||||
//
|
//
|
||||||
// if assert.NotEmpty(t, obj) {
|
// if assert.NotEmpty(t, obj) {
|
||||||
// assert.Equal(t, "two", obj[1])
|
// assert.Equal(t, "two", obj[1])
|
||||||
// }
|
// }
|
||||||
func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
||||||
pass := !isEmpty(object)
|
pass := !isEmpty(object)
|
||||||
if !pass {
|
if !pass {
|
||||||
@@ -631,7 +746,7 @@ func getLen(x interface{}) (ok bool, length int) {
|
|||||||
// Len asserts that the specified object has specific length.
|
// Len asserts that the specified object has specific length.
|
||||||
// Len also fails if the object has a type that len() not accept.
|
// Len also fails if the object has a type that len() not accept.
|
||||||
//
|
//
|
||||||
// assert.Len(t, mySlice, 3)
|
// assert.Len(t, mySlice, 3)
|
||||||
func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) bool {
|
func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -649,7 +764,7 @@ func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{})
|
|||||||
|
|
||||||
// True asserts that the specified value is true.
|
// True asserts that the specified value is true.
|
||||||
//
|
//
|
||||||
// assert.True(t, myBool)
|
// assert.True(t, myBool)
|
||||||
func True(t TestingT, value bool, msgAndArgs ...interface{}) bool {
|
func True(t TestingT, value bool, msgAndArgs ...interface{}) bool {
|
||||||
if !value {
|
if !value {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
@@ -664,7 +779,7 @@ func True(t TestingT, value bool, msgAndArgs ...interface{}) bool {
|
|||||||
|
|
||||||
// False asserts that the specified value is false.
|
// False asserts that the specified value is false.
|
||||||
//
|
//
|
||||||
// assert.False(t, myBool)
|
// assert.False(t, myBool)
|
||||||
func False(t TestingT, value bool, msgAndArgs ...interface{}) bool {
|
func False(t TestingT, value bool, msgAndArgs ...interface{}) bool {
|
||||||
if value {
|
if value {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
@@ -679,7 +794,7 @@ func False(t TestingT, value bool, msgAndArgs ...interface{}) bool {
|
|||||||
|
|
||||||
// NotEqual asserts that the specified values are NOT equal.
|
// NotEqual asserts that the specified values are NOT equal.
|
||||||
//
|
//
|
||||||
// assert.NotEqual(t, obj1, obj2)
|
// assert.NotEqual(t, obj1, obj2)
|
||||||
//
|
//
|
||||||
// Pointer variable equality is determined based on the equality of the
|
// Pointer variable equality is determined based on the equality of the
|
||||||
// referenced values (as opposed to the memory addresses).
|
// referenced values (as opposed to the memory addresses).
|
||||||
@@ -702,7 +817,7 @@ func NotEqual(t TestingT, expected, actual interface{}, msgAndArgs ...interface{
|
|||||||
|
|
||||||
// NotEqualValues asserts that two objects are not equal even when converted to the same type
|
// NotEqualValues asserts that two objects are not equal even when converted to the same type
|
||||||
//
|
//
|
||||||
// assert.NotEqualValues(t, obj1, obj2)
|
// assert.NotEqualValues(t, obj1, obj2)
|
||||||
func NotEqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {
|
func NotEqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -761,9 +876,9 @@ func containsElement(list interface{}, element interface{}) (ok, found bool) {
|
|||||||
// Contains asserts that the specified string, list(array, slice...) or map contains the
|
// Contains asserts that the specified string, list(array, slice...) or map contains the
|
||||||
// specified substring or element.
|
// specified substring or element.
|
||||||
//
|
//
|
||||||
// assert.Contains(t, "Hello World", "World")
|
// assert.Contains(t, "Hello World", "World")
|
||||||
// assert.Contains(t, ["Hello", "World"], "World")
|
// assert.Contains(t, ["Hello", "World"], "World")
|
||||||
// assert.Contains(t, {"Hello": "World"}, "Hello")
|
// assert.Contains(t, {"Hello": "World"}, "Hello")
|
||||||
func Contains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool {
|
func Contains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -784,9 +899,9 @@ func Contains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bo
|
|||||||
// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the
|
// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the
|
||||||
// specified substring or element.
|
// specified substring or element.
|
||||||
//
|
//
|
||||||
// assert.NotContains(t, "Hello World", "Earth")
|
// assert.NotContains(t, "Hello World", "Earth")
|
||||||
// assert.NotContains(t, ["Hello", "World"], "Earth")
|
// assert.NotContains(t, ["Hello", "World"], "Earth")
|
||||||
// assert.NotContains(t, {"Hello": "World"}, "Earth")
|
// assert.NotContains(t, {"Hello": "World"}, "Earth")
|
||||||
func NotContains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool {
|
func NotContains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -794,10 +909,10 @@ func NotContains(t TestingT, s, contains interface{}, msgAndArgs ...interface{})
|
|||||||
|
|
||||||
ok, found := containsElement(s, contains)
|
ok, found := containsElement(s, contains)
|
||||||
if !ok {
|
if !ok {
|
||||||
return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", s), msgAndArgs...)
|
return Fail(t, fmt.Sprintf("%#v could not be applied builtin len()", s), msgAndArgs...)
|
||||||
}
|
}
|
||||||
if found {
|
if found {
|
||||||
return Fail(t, fmt.Sprintf("\"%s\" should not contain \"%s\"", s, contains), msgAndArgs...)
|
return Fail(t, fmt.Sprintf("%#v should not contain %#v", s, contains), msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
return true
|
return true
|
||||||
@@ -807,7 +922,7 @@ func NotContains(t TestingT, s, contains interface{}, msgAndArgs ...interface{})
|
|||||||
// Subset asserts that the specified list(array, slice...) contains all
|
// Subset asserts that the specified list(array, slice...) contains all
|
||||||
// elements given in the specified subset(array, slice...).
|
// elements given in the specified subset(array, slice...).
|
||||||
//
|
//
|
||||||
// assert.Subset(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]")
|
// assert.Subset(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]")
|
||||||
func Subset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok bool) {
|
func Subset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok bool) {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -863,7 +978,7 @@ func Subset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok
|
|||||||
// NotSubset asserts that the specified list(array, slice...) contains not all
|
// NotSubset asserts that the specified list(array, slice...) contains not all
|
||||||
// elements given in the specified subset(array, slice...).
|
// elements given in the specified subset(array, slice...).
|
||||||
//
|
//
|
||||||
// assert.NotSubset(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]")
|
// assert.NotSubset(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]")
|
||||||
func NotSubset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok bool) {
|
func NotSubset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok bool) {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -1048,7 +1163,7 @@ func didPanic(f PanicTestFunc) (didPanic bool, message interface{}, stack string
|
|||||||
|
|
||||||
// Panics asserts that the code inside the specified PanicTestFunc panics.
|
// Panics asserts that the code inside the specified PanicTestFunc panics.
|
||||||
//
|
//
|
||||||
// assert.Panics(t, func(){ GoCrazy() })
|
// assert.Panics(t, func(){ GoCrazy() })
|
||||||
func Panics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool {
|
func Panics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -1064,7 +1179,7 @@ func Panics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool {
|
|||||||
// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that
|
// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that
|
||||||
// the recovered panic value equals the expected panic value.
|
// the recovered panic value equals the expected panic value.
|
||||||
//
|
//
|
||||||
// assert.PanicsWithValue(t, "crazy error", func(){ GoCrazy() })
|
// assert.PanicsWithValue(t, "crazy error", func(){ GoCrazy() })
|
||||||
func PanicsWithValue(t TestingT, expected interface{}, f PanicTestFunc, msgAndArgs ...interface{}) bool {
|
func PanicsWithValue(t TestingT, expected interface{}, f PanicTestFunc, msgAndArgs ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -1085,7 +1200,7 @@ func PanicsWithValue(t TestingT, expected interface{}, f PanicTestFunc, msgAndAr
|
|||||||
// panics, and that the recovered panic value is an error that satisfies the
|
// panics, and that the recovered panic value is an error that satisfies the
|
||||||
// EqualError comparison.
|
// EqualError comparison.
|
||||||
//
|
//
|
||||||
// assert.PanicsWithError(t, "crazy error", func(){ GoCrazy() })
|
// assert.PanicsWithError(t, "crazy error", func(){ GoCrazy() })
|
||||||
func PanicsWithError(t TestingT, errString string, f PanicTestFunc, msgAndArgs ...interface{}) bool {
|
func PanicsWithError(t TestingT, errString string, f PanicTestFunc, msgAndArgs ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -1105,7 +1220,7 @@ func PanicsWithError(t TestingT, errString string, f PanicTestFunc, msgAndArgs .
|
|||||||
|
|
||||||
// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic.
|
// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic.
|
||||||
//
|
//
|
||||||
// assert.NotPanics(t, func(){ RemainCalm() })
|
// assert.NotPanics(t, func(){ RemainCalm() })
|
||||||
func NotPanics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool {
|
func NotPanics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -1120,7 +1235,7 @@ func NotPanics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool {
|
|||||||
|
|
||||||
// WithinDuration asserts that the two times are within duration delta of each other.
|
// WithinDuration asserts that the two times are within duration delta of each other.
|
||||||
//
|
//
|
||||||
// assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second)
|
// assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second)
|
||||||
func WithinDuration(t TestingT, expected, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) bool {
|
func WithinDuration(t TestingT, expected, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -1136,7 +1251,7 @@ func WithinDuration(t TestingT, expected, actual time.Time, delta time.Duration,
|
|||||||
|
|
||||||
// WithinRange asserts that a time is within a time range (inclusive).
|
// WithinRange asserts that a time is within a time range (inclusive).
|
||||||
//
|
//
|
||||||
// assert.WithinRange(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second))
|
// assert.WithinRange(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second))
|
||||||
func WithinRange(t TestingT, actual, start, end time.Time, msgAndArgs ...interface{}) bool {
|
func WithinRange(t TestingT, actual, start, end time.Time, msgAndArgs ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -1195,7 +1310,7 @@ func toFloat(x interface{}) (float64, bool) {
|
|||||||
|
|
||||||
// InDelta asserts that the two numerals are within delta of each other.
|
// InDelta asserts that the two numerals are within delta of each other.
|
||||||
//
|
//
|
||||||
// assert.InDelta(t, math.Pi, 22/7.0, 0.01)
|
// assert.InDelta(t, math.Pi, 22/7.0, 0.01)
|
||||||
func InDelta(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {
|
func InDelta(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -1368,10 +1483,10 @@ func InEpsilonSlice(t TestingT, expected, actual interface{}, epsilon float64, m
|
|||||||
|
|
||||||
// NoError asserts that a function returned no error (i.e. `nil`).
|
// NoError asserts that a function returned no error (i.e. `nil`).
|
||||||
//
|
//
|
||||||
// actualObj, err := SomeFunction()
|
// actualObj, err := SomeFunction()
|
||||||
// if assert.NoError(t, err) {
|
// if assert.NoError(t, err) {
|
||||||
// assert.Equal(t, expectedObj, actualObj)
|
// assert.Equal(t, expectedObj, actualObj)
|
||||||
// }
|
// }
|
||||||
func NoError(t TestingT, err error, msgAndArgs ...interface{}) bool {
|
func NoError(t TestingT, err error, msgAndArgs ...interface{}) bool {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
@@ -1385,10 +1500,10 @@ func NoError(t TestingT, err error, msgAndArgs ...interface{}) bool {
|
|||||||
|
|
||||||
// Error asserts that a function returned an error (i.e. not `nil`).
|
// Error asserts that a function returned an error (i.e. not `nil`).
|
||||||
//
|
//
|
||||||
// actualObj, err := SomeFunction()
|
// actualObj, err := SomeFunction()
|
||||||
// if assert.Error(t, err) {
|
// if assert.Error(t, err) {
|
||||||
// assert.Equal(t, expectedError, err)
|
// assert.Equal(t, expectedError, err)
|
||||||
// }
|
// }
|
||||||
func Error(t TestingT, err error, msgAndArgs ...interface{}) bool {
|
func Error(t TestingT, err error, msgAndArgs ...interface{}) bool {
|
||||||
if err == nil {
|
if err == nil {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
@@ -1403,8 +1518,8 @@ func Error(t TestingT, err error, msgAndArgs ...interface{}) bool {
|
|||||||
// EqualError asserts that a function returned an error (i.e. not `nil`)
|
// EqualError asserts that a function returned an error (i.e. not `nil`)
|
||||||
// and that it is equal to the provided error.
|
// and that it is equal to the provided error.
|
||||||
//
|
//
|
||||||
// actualObj, err := SomeFunction()
|
// actualObj, err := SomeFunction()
|
||||||
// assert.EqualError(t, err, expectedErrorString)
|
// assert.EqualError(t, err, expectedErrorString)
|
||||||
func EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) bool {
|
func EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -1426,8 +1541,8 @@ func EqualError(t TestingT, theError error, errString string, msgAndArgs ...inte
|
|||||||
// ErrorContains asserts that a function returned an error (i.e. not `nil`)
|
// ErrorContains asserts that a function returned an error (i.e. not `nil`)
|
||||||
// and that the error contains the specified substring.
|
// and that the error contains the specified substring.
|
||||||
//
|
//
|
||||||
// actualObj, err := SomeFunction()
|
// actualObj, err := SomeFunction()
|
||||||
// assert.ErrorContains(t, err, expectedErrorSubString)
|
// assert.ErrorContains(t, err, expectedErrorSubString)
|
||||||
func ErrorContains(t TestingT, theError error, contains string, msgAndArgs ...interface{}) bool {
|
func ErrorContains(t TestingT, theError error, contains string, msgAndArgs ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -1460,8 +1575,8 @@ func matchRegexp(rx interface{}, str interface{}) bool {
|
|||||||
|
|
||||||
// Regexp asserts that a specified regexp matches a string.
|
// Regexp asserts that a specified regexp matches a string.
|
||||||
//
|
//
|
||||||
// assert.Regexp(t, regexp.MustCompile("start"), "it's starting")
|
// assert.Regexp(t, regexp.MustCompile("start"), "it's starting")
|
||||||
// assert.Regexp(t, "start...$", "it's not starting")
|
// assert.Regexp(t, "start...$", "it's not starting")
|
||||||
func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) bool {
|
func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -1478,8 +1593,8 @@ func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface
|
|||||||
|
|
||||||
// NotRegexp asserts that a specified regexp does not match a string.
|
// NotRegexp asserts that a specified regexp does not match a string.
|
||||||
//
|
//
|
||||||
// assert.NotRegexp(t, regexp.MustCompile("starts"), "it's starting")
|
// assert.NotRegexp(t, regexp.MustCompile("starts"), "it's starting")
|
||||||
// assert.NotRegexp(t, "^start", "it's not starting")
|
// assert.NotRegexp(t, "^start", "it's not starting")
|
||||||
func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) bool {
|
func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -1591,7 +1706,7 @@ func NoDirExists(t TestingT, path string, msgAndArgs ...interface{}) bool {
|
|||||||
|
|
||||||
// JSONEq asserts that two JSON strings are equivalent.
|
// JSONEq asserts that two JSON strings are equivalent.
|
||||||
//
|
//
|
||||||
// assert.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`)
|
// assert.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`)
|
||||||
func JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) bool {
|
func JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -1714,7 +1829,7 @@ type tHelper interface {
|
|||||||
// Eventually asserts that given condition will be met in waitFor time,
|
// Eventually asserts that given condition will be met in waitFor time,
|
||||||
// periodically checking target function each tick.
|
// periodically checking target function each tick.
|
||||||
//
|
//
|
||||||
// assert.Eventually(t, func() bool { return true; }, time.Second, 10*time.Millisecond)
|
// assert.Eventually(t, func() bool { return true; }, time.Second, 10*time.Millisecond)
|
||||||
func Eventually(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool {
|
func Eventually(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@@ -1744,10 +1859,93 @@ func Eventually(t TestingT, condition func() bool, waitFor time.Duration, tick t
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CollectT implements the TestingT interface and collects all errors.
|
||||||
|
type CollectT struct {
|
||||||
|
errors []error
|
||||||
|
}
|
||||||
|
|
||||||
|
// Errorf collects the error.
|
||||||
|
func (c *CollectT) Errorf(format string, args ...interface{}) {
|
||||||
|
c.errors = append(c.errors, fmt.Errorf(format, args...))
|
||||||
|
}
|
||||||
|
|
||||||
|
// FailNow panics.
|
||||||
|
func (c *CollectT) FailNow() {
|
||||||
|
panic("Assertion failed")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset clears the collected errors.
|
||||||
|
func (c *CollectT) Reset() {
|
||||||
|
c.errors = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy copies the collected errors to the supplied t.
|
||||||
|
func (c *CollectT) Copy(t TestingT) {
|
||||||
|
if tt, ok := t.(tHelper); ok {
|
||||||
|
tt.Helper()
|
||||||
|
}
|
||||||
|
for _, err := range c.errors {
|
||||||
|
t.Errorf("%v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// EventuallyWithT asserts that given condition will be met in waitFor time,
|
||||||
|
// periodically checking target function each tick. In contrast to Eventually,
|
||||||
|
// it supplies a CollectT to the condition function, so that the condition
|
||||||
|
// function can use the CollectT to call other assertions.
|
||||||
|
// The condition is considered "met" if no errors are raised in a tick.
|
||||||
|
// The supplied CollectT collects all errors from one tick (if there are any).
|
||||||
|
// If the condition is not met before waitFor, the collected errors of
|
||||||
|
// the last tick are copied to t.
|
||||||
|
//
|
||||||
|
// externalValue := false
|
||||||
|
// go func() {
|
||||||
|
// time.Sleep(8*time.Second)
|
||||||
|
// externalValue = true
|
||||||
|
// }()
|
||||||
|
// assert.EventuallyWithT(t, func(c *assert.CollectT) {
|
||||||
|
// // add assertions as needed; any assertion failure will fail the current tick
|
||||||
|
// assert.True(c, externalValue, "expected 'externalValue' to be true")
|
||||||
|
// }, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false")
|
||||||
|
func EventuallyWithT(t TestingT, condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
|
||||||
|
collect := new(CollectT)
|
||||||
|
ch := make(chan bool, 1)
|
||||||
|
|
||||||
|
timer := time.NewTimer(waitFor)
|
||||||
|
defer timer.Stop()
|
||||||
|
|
||||||
|
ticker := time.NewTicker(tick)
|
||||||
|
defer ticker.Stop()
|
||||||
|
|
||||||
|
for tick := ticker.C; ; {
|
||||||
|
select {
|
||||||
|
case <-timer.C:
|
||||||
|
collect.Copy(t)
|
||||||
|
return Fail(t, "Condition never satisfied", msgAndArgs...)
|
||||||
|
case <-tick:
|
||||||
|
tick = nil
|
||||||
|
collect.Reset()
|
||||||
|
go func() {
|
||||||
|
condition(collect)
|
||||||
|
ch <- len(collect.errors) == 0
|
||||||
|
}()
|
||||||
|
case v := <-ch:
|
||||||
|
if v {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
tick = ticker.C
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Never asserts that the given condition doesn't satisfy in waitFor time,
|
// Never asserts that the given condition doesn't satisfy in waitFor time,
|
||||||
// periodically checking the target function each tick.
|
// periodically checking the target function each tick.
|
||||||
//
|
//
|
||||||
// assert.Never(t, func() bool { return false; }, time.Second, 10*time.Millisecond)
|
// assert.Never(t, func() bool { return false; }, time.Second, 10*time.Millisecond)
|
||||||
func Never(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool {
|
func Never(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
|
|||||||
+22
-21
@@ -1,39 +1,40 @@
|
|||||||
// Package assert provides a set of comprehensive testing tools for use with the normal Go testing system.
|
// Package assert provides a set of comprehensive testing tools for use with the normal Go testing system.
|
||||||
//
|
//
|
||||||
// Example Usage
|
// # Example Usage
|
||||||
//
|
//
|
||||||
// The following is a complete example using assert in a standard test function:
|
// The following is a complete example using assert in a standard test function:
|
||||||
// import (
|
|
||||||
// "testing"
|
|
||||||
// "github.com/stretchr/testify/assert"
|
|
||||||
// )
|
|
||||||
//
|
//
|
||||||
// func TestSomething(t *testing.T) {
|
// import (
|
||||||
|
// "testing"
|
||||||
|
// "github.com/stretchr/testify/assert"
|
||||||
|
// )
|
||||||
//
|
//
|
||||||
// var a string = "Hello"
|
// func TestSomething(t *testing.T) {
|
||||||
// var b string = "Hello"
|
|
||||||
//
|
//
|
||||||
// assert.Equal(t, a, b, "The two words should be the same.")
|
// var a string = "Hello"
|
||||||
|
// var b string = "Hello"
|
||||||
//
|
//
|
||||||
// }
|
// assert.Equal(t, a, b, "The two words should be the same.")
|
||||||
|
//
|
||||||
|
// }
|
||||||
//
|
//
|
||||||
// if you assert many times, use the format below:
|
// if you assert many times, use the format below:
|
||||||
//
|
//
|
||||||
// import (
|
// import (
|
||||||
// "testing"
|
// "testing"
|
||||||
// "github.com/stretchr/testify/assert"
|
// "github.com/stretchr/testify/assert"
|
||||||
// )
|
// )
|
||||||
//
|
//
|
||||||
// func TestSomething(t *testing.T) {
|
// func TestSomething(t *testing.T) {
|
||||||
// assert := assert.New(t)
|
// assert := assert.New(t)
|
||||||
//
|
//
|
||||||
// var a string = "Hello"
|
// var a string = "Hello"
|
||||||
// var b string = "Hello"
|
// var b string = "Hello"
|
||||||
//
|
//
|
||||||
// assert.Equal(a, b, "The two words should be the same.")
|
// assert.Equal(a, b, "The two words should be the same.")
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// Assertions
|
// # Assertions
|
||||||
//
|
//
|
||||||
// Assertions allow you to easily write test code, and are global funcs in the `assert` package.
|
// Assertions allow you to easily write test code, and are global funcs in the `assert` package.
|
||||||
// All assertion functions take, as the first argument, the `*testing.T` object provided by the
|
// All assertion functions take, as the first argument, the `*testing.T` object provided by the
|
||||||
|
|||||||
+6
-6
@@ -23,7 +23,7 @@ func httpCode(handler http.HandlerFunc, method, url string, values url.Values) (
|
|||||||
|
|
||||||
// HTTPSuccess asserts that a specified handler returns a success status code.
|
// HTTPSuccess asserts that a specified handler returns a success status code.
|
||||||
//
|
//
|
||||||
// assert.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil)
|
// assert.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil)
|
||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
func HTTPSuccess(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, msgAndArgs ...interface{}) bool {
|
func HTTPSuccess(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, msgAndArgs ...interface{}) bool {
|
||||||
@@ -45,7 +45,7 @@ func HTTPSuccess(t TestingT, handler http.HandlerFunc, method, url string, value
|
|||||||
|
|
||||||
// HTTPRedirect asserts that a specified handler returns a redirect status code.
|
// HTTPRedirect asserts that a specified handler returns a redirect status code.
|
||||||
//
|
//
|
||||||
// assert.HTTPRedirect(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}}
|
// assert.HTTPRedirect(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}}
|
||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
func HTTPRedirect(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, msgAndArgs ...interface{}) bool {
|
func HTTPRedirect(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, msgAndArgs ...interface{}) bool {
|
||||||
@@ -67,7 +67,7 @@ func HTTPRedirect(t TestingT, handler http.HandlerFunc, method, url string, valu
|
|||||||
|
|
||||||
// HTTPError asserts that a specified handler returns an error status code.
|
// HTTPError asserts that a specified handler returns an error status code.
|
||||||
//
|
//
|
||||||
// assert.HTTPError(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}}
|
// assert.HTTPError(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}}
|
||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
func HTTPError(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, msgAndArgs ...interface{}) bool {
|
func HTTPError(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, msgAndArgs ...interface{}) bool {
|
||||||
@@ -89,7 +89,7 @@ func HTTPError(t TestingT, handler http.HandlerFunc, method, url string, values
|
|||||||
|
|
||||||
// HTTPStatusCode asserts that a specified handler returns a specified status code.
|
// HTTPStatusCode asserts that a specified handler returns a specified status code.
|
||||||
//
|
//
|
||||||
// assert.HTTPStatusCode(t, myHandler, "GET", "/notImplemented", nil, 501)
|
// assert.HTTPStatusCode(t, myHandler, "GET", "/notImplemented", nil, 501)
|
||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
func HTTPStatusCode(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, statuscode int, msgAndArgs ...interface{}) bool {
|
func HTTPStatusCode(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, statuscode int, msgAndArgs ...interface{}) bool {
|
||||||
@@ -124,7 +124,7 @@ func HTTPBody(handler http.HandlerFunc, method, url string, values url.Values) s
|
|||||||
// HTTPBodyContains asserts that a specified handler returns a
|
// HTTPBodyContains asserts that a specified handler returns a
|
||||||
// body that contains a string.
|
// body that contains a string.
|
||||||
//
|
//
|
||||||
// assert.HTTPBodyContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky")
|
// assert.HTTPBodyContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky")
|
||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool {
|
func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool {
|
||||||
@@ -144,7 +144,7 @@ func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method, url string,
|
|||||||
// HTTPBodyNotContains asserts that a specified handler returns a
|
// HTTPBodyNotContains asserts that a specified handler returns a
|
||||||
// body that does not contain a string.
|
// body that does not contain a string.
|
||||||
//
|
//
|
||||||
// assert.HTTPBodyNotContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky")
|
// assert.HTTPBodyNotContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky")
|
||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool {
|
func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
|||||||
+15
-15
@@ -1,17 +1,17 @@
|
|||||||
// Package mock provides a system by which it is possible to mock your objects
|
// Package mock provides a system by which it is possible to mock your objects
|
||||||
// and verify calls are happening as expected.
|
// and verify calls are happening as expected.
|
||||||
//
|
//
|
||||||
// Example Usage
|
// # Example Usage
|
||||||
//
|
//
|
||||||
// The mock package provides an object, Mock, that tracks activity on another object. It is usually
|
// The mock package provides an object, Mock, that tracks activity on another object. It is usually
|
||||||
// embedded into a test object as shown below:
|
// embedded into a test object as shown below:
|
||||||
//
|
//
|
||||||
// type MyTestObject struct {
|
// type MyTestObject struct {
|
||||||
// // add a Mock object instance
|
// // add a Mock object instance
|
||||||
// mock.Mock
|
// mock.Mock
|
||||||
//
|
//
|
||||||
// // other fields go here as normal
|
// // other fields go here as normal
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// When implementing the methods of an interface, you wire your functions up
|
// When implementing the methods of an interface, you wire your functions up
|
||||||
// to call the Mock.Called(args...) method, and return the appropriate values.
|
// to call the Mock.Called(args...) method, and return the appropriate values.
|
||||||
@@ -19,25 +19,25 @@
|
|||||||
// For example, to mock a method that saves the name and age of a person and returns
|
// For example, to mock a method that saves the name and age of a person and returns
|
||||||
// the year of their birth or an error, you might write this:
|
// the year of their birth or an error, you might write this:
|
||||||
//
|
//
|
||||||
// func (o *MyTestObject) SavePersonDetails(firstname, lastname string, age int) (int, error) {
|
// func (o *MyTestObject) SavePersonDetails(firstname, lastname string, age int) (int, error) {
|
||||||
// args := o.Called(firstname, lastname, age)
|
// args := o.Called(firstname, lastname, age)
|
||||||
// return args.Int(0), args.Error(1)
|
// return args.Int(0), args.Error(1)
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// The Int, Error and Bool methods are examples of strongly typed getters that take the argument
|
// The Int, Error and Bool methods are examples of strongly typed getters that take the argument
|
||||||
// index position. Given this argument list:
|
// index position. Given this argument list:
|
||||||
//
|
//
|
||||||
// (12, true, "Something")
|
// (12, true, "Something")
|
||||||
//
|
//
|
||||||
// You could read them out strongly typed like this:
|
// You could read them out strongly typed like this:
|
||||||
//
|
//
|
||||||
// args.Int(0)
|
// args.Int(0)
|
||||||
// args.Bool(1)
|
// args.Bool(1)
|
||||||
// args.String(2)
|
// args.String(2)
|
||||||
//
|
//
|
||||||
// For objects of your own type, use the generic Arguments.Get(index) method and make a type assertion:
|
// For objects of your own type, use the generic Arguments.Get(index) method and make a type assertion:
|
||||||
//
|
//
|
||||||
// return args.Get(0).(*MyObject), args.Get(1).(*AnotherObjectOfMine)
|
// return args.Get(0).(*MyObject), args.Get(1).(*AnotherObjectOfMine)
|
||||||
//
|
//
|
||||||
// This may cause a panic if the object you are getting is nil (the type assertion will fail), in those
|
// This may cause a panic if the object you are getting is nil (the type assertion will fail), in those
|
||||||
// cases you should check for nil first.
|
// cases you should check for nil first.
|
||||||
|
|||||||
+141
-19
@@ -3,6 +3,7 @@ package mock
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"path"
|
||||||
"reflect"
|
"reflect"
|
||||||
"regexp"
|
"regexp"
|
||||||
"runtime"
|
"runtime"
|
||||||
@@ -13,6 +14,7 @@ import (
|
|||||||
"github.com/davecgh/go-spew/spew"
|
"github.com/davecgh/go-spew/spew"
|
||||||
"github.com/pmezard/go-difflib/difflib"
|
"github.com/pmezard/go-difflib/difflib"
|
||||||
"github.com/stretchr/objx"
|
"github.com/stretchr/objx"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -99,7 +101,7 @@ func (c *Call) unlock() {
|
|||||||
|
|
||||||
// Return specifies the return arguments for the expectation.
|
// Return specifies the return arguments for the expectation.
|
||||||
//
|
//
|
||||||
// Mock.On("DoSomething").Return(errors.New("failed"))
|
// Mock.On("DoSomething").Return(errors.New("failed"))
|
||||||
func (c *Call) Return(returnArguments ...interface{}) *Call {
|
func (c *Call) Return(returnArguments ...interface{}) *Call {
|
||||||
c.lock()
|
c.lock()
|
||||||
defer c.unlock()
|
defer c.unlock()
|
||||||
@@ -111,7 +113,7 @@ func (c *Call) Return(returnArguments ...interface{}) *Call {
|
|||||||
|
|
||||||
// Panic specifies if the functon call should fail and the panic message
|
// Panic specifies if the functon call should fail and the panic message
|
||||||
//
|
//
|
||||||
// Mock.On("DoSomething").Panic("test panic")
|
// Mock.On("DoSomething").Panic("test panic")
|
||||||
func (c *Call) Panic(msg string) *Call {
|
func (c *Call) Panic(msg string) *Call {
|
||||||
c.lock()
|
c.lock()
|
||||||
defer c.unlock()
|
defer c.unlock()
|
||||||
@@ -123,14 +125,14 @@ func (c *Call) Panic(msg string) *Call {
|
|||||||
|
|
||||||
// Once indicates that that the mock should only return the value once.
|
// Once indicates that that the mock should only return the value once.
|
||||||
//
|
//
|
||||||
// Mock.On("MyMethod", arg1, arg2).Return(returnArg1, returnArg2).Once()
|
// Mock.On("MyMethod", arg1, arg2).Return(returnArg1, returnArg2).Once()
|
||||||
func (c *Call) Once() *Call {
|
func (c *Call) Once() *Call {
|
||||||
return c.Times(1)
|
return c.Times(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Twice indicates that that the mock should only return the value twice.
|
// Twice indicates that that the mock should only return the value twice.
|
||||||
//
|
//
|
||||||
// Mock.On("MyMethod", arg1, arg2).Return(returnArg1, returnArg2).Twice()
|
// Mock.On("MyMethod", arg1, arg2).Return(returnArg1, returnArg2).Twice()
|
||||||
func (c *Call) Twice() *Call {
|
func (c *Call) Twice() *Call {
|
||||||
return c.Times(2)
|
return c.Times(2)
|
||||||
}
|
}
|
||||||
@@ -138,7 +140,7 @@ func (c *Call) Twice() *Call {
|
|||||||
// Times indicates that that the mock should only return the indicated number
|
// Times indicates that that the mock should only return the indicated number
|
||||||
// of times.
|
// of times.
|
||||||
//
|
//
|
||||||
// Mock.On("MyMethod", arg1, arg2).Return(returnArg1, returnArg2).Times(5)
|
// Mock.On("MyMethod", arg1, arg2).Return(returnArg1, returnArg2).Times(5)
|
||||||
func (c *Call) Times(i int) *Call {
|
func (c *Call) Times(i int) *Call {
|
||||||
c.lock()
|
c.lock()
|
||||||
defer c.unlock()
|
defer c.unlock()
|
||||||
@@ -149,7 +151,7 @@ func (c *Call) Times(i int) *Call {
|
|||||||
// WaitUntil sets the channel that will block the mock's return until its closed
|
// WaitUntil sets the channel that will block the mock's return until its closed
|
||||||
// or a message is received.
|
// or a message is received.
|
||||||
//
|
//
|
||||||
// Mock.On("MyMethod", arg1, arg2).WaitUntil(time.After(time.Second))
|
// Mock.On("MyMethod", arg1, arg2).WaitUntil(time.After(time.Second))
|
||||||
func (c *Call) WaitUntil(w <-chan time.Time) *Call {
|
func (c *Call) WaitUntil(w <-chan time.Time) *Call {
|
||||||
c.lock()
|
c.lock()
|
||||||
defer c.unlock()
|
defer c.unlock()
|
||||||
@@ -159,7 +161,7 @@ func (c *Call) WaitUntil(w <-chan time.Time) *Call {
|
|||||||
|
|
||||||
// After sets how long to block until the call returns
|
// After sets how long to block until the call returns
|
||||||
//
|
//
|
||||||
// Mock.On("MyMethod", arg1, arg2).After(time.Second)
|
// Mock.On("MyMethod", arg1, arg2).After(time.Second)
|
||||||
func (c *Call) After(d time.Duration) *Call {
|
func (c *Call) After(d time.Duration) *Call {
|
||||||
c.lock()
|
c.lock()
|
||||||
defer c.unlock()
|
defer c.unlock()
|
||||||
@@ -171,10 +173,10 @@ func (c *Call) After(d time.Duration) *Call {
|
|||||||
// mocking a method (such as an unmarshaler) that takes a pointer to a struct and
|
// mocking a method (such as an unmarshaler) that takes a pointer to a struct and
|
||||||
// sets properties in such struct
|
// sets properties in such struct
|
||||||
//
|
//
|
||||||
// Mock.On("Unmarshal", AnythingOfType("*map[string]interface{}")).Return().Run(func(args Arguments) {
|
// Mock.On("Unmarshal", AnythingOfType("*map[string]interface{}")).Return().Run(func(args Arguments) {
|
||||||
// arg := args.Get(0).(*map[string]interface{})
|
// arg := args.Get(0).(*map[string]interface{})
|
||||||
// arg["foo"] = "bar"
|
// arg["foo"] = "bar"
|
||||||
// })
|
// })
|
||||||
func (c *Call) Run(fn func(args Arguments)) *Call {
|
func (c *Call) Run(fn func(args Arguments)) *Call {
|
||||||
c.lock()
|
c.lock()
|
||||||
defer c.unlock()
|
defer c.unlock()
|
||||||
@@ -194,16 +196,18 @@ func (c *Call) Maybe() *Call {
|
|||||||
// On chains a new expectation description onto the mocked interface. This
|
// On chains a new expectation description onto the mocked interface. This
|
||||||
// allows syntax like.
|
// allows syntax like.
|
||||||
//
|
//
|
||||||
// Mock.
|
// Mock.
|
||||||
// On("MyMethod", 1).Return(nil).
|
// On("MyMethod", 1).Return(nil).
|
||||||
// On("MyOtherMethod", 'a', 'b', 'c').Return(errors.New("Some Error"))
|
// On("MyOtherMethod", 'a', 'b', 'c').Return(errors.New("Some Error"))
|
||||||
|
//
|
||||||
//go:noinline
|
//go:noinline
|
||||||
func (c *Call) On(methodName string, arguments ...interface{}) *Call {
|
func (c *Call) On(methodName string, arguments ...interface{}) *Call {
|
||||||
return c.Parent.On(methodName, arguments...)
|
return c.Parent.On(methodName, arguments...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unset removes a mock handler from being called.
|
// Unset removes a mock handler from being called.
|
||||||
// test.On("func", mock.Anything).Unset()
|
//
|
||||||
|
// test.On("func", mock.Anything).Unset()
|
||||||
func (c *Call) Unset() *Call {
|
func (c *Call) Unset() *Call {
|
||||||
var unlockOnce sync.Once
|
var unlockOnce sync.Once
|
||||||
|
|
||||||
@@ -249,9 +253,9 @@ func (c *Call) Unset() *Call {
|
|||||||
// calls have been called as expected. The referenced calls may be from the
|
// calls have been called as expected. The referenced calls may be from the
|
||||||
// same mock instance and/or other mock instances.
|
// same mock instance and/or other mock instances.
|
||||||
//
|
//
|
||||||
// Mock.On("Do").Return(nil).Notbefore(
|
// Mock.On("Do").Return(nil).Notbefore(
|
||||||
// Mock.On("Init").Return(nil)
|
// Mock.On("Init").Return(nil)
|
||||||
// )
|
// )
|
||||||
func (c *Call) NotBefore(calls ...*Call) *Call {
|
func (c *Call) NotBefore(calls ...*Call) *Call {
|
||||||
c.lock()
|
c.lock()
|
||||||
defer c.unlock()
|
defer c.unlock()
|
||||||
@@ -334,7 +338,7 @@ func (m *Mock) fail(format string, args ...interface{}) {
|
|||||||
// On starts a description of an expectation of the specified method
|
// On starts a description of an expectation of the specified method
|
||||||
// being called.
|
// being called.
|
||||||
//
|
//
|
||||||
// Mock.On("MyMethod", arg1, arg2)
|
// Mock.On("MyMethod", arg1, arg2)
|
||||||
func (m *Mock) On(methodName string, arguments ...interface{}) *Call {
|
func (m *Mock) On(methodName string, arguments ...interface{}) *Call {
|
||||||
for _, arg := range arguments {
|
for _, arg := range arguments {
|
||||||
if v := reflect.ValueOf(arg); v.Kind() == reflect.Func {
|
if v := reflect.ValueOf(arg); v.Kind() == reflect.Func {
|
||||||
@@ -424,6 +428,10 @@ func callString(method string, arguments Arguments, includeArgumentValues bool)
|
|||||||
if includeArgumentValues {
|
if includeArgumentValues {
|
||||||
var argVals []string
|
var argVals []string
|
||||||
for argIndex, arg := range arguments {
|
for argIndex, arg := range arguments {
|
||||||
|
if _, ok := arg.(*FunctionalOptionsArgument); ok {
|
||||||
|
argVals = append(argVals, fmt.Sprintf("%d: %s", argIndex, arg))
|
||||||
|
continue
|
||||||
|
}
|
||||||
argVals = append(argVals, fmt.Sprintf("%d: %#v", argIndex, arg))
|
argVals = append(argVals, fmt.Sprintf("%d: %#v", argIndex, arg))
|
||||||
}
|
}
|
||||||
argValsString = fmt.Sprintf("\n\t\t%s", strings.Join(argVals, "\n\t\t"))
|
argValsString = fmt.Sprintf("\n\t\t%s", strings.Join(argVals, "\n\t\t"))
|
||||||
@@ -758,6 +766,7 @@ type AnythingOfTypeArgument string
|
|||||||
// name of the type to check for. Used in Diff and Assert.
|
// name of the type to check for. Used in Diff and Assert.
|
||||||
//
|
//
|
||||||
// For example:
|
// For example:
|
||||||
|
//
|
||||||
// Assert(t, AnythingOfType("string"), AnythingOfType("int"))
|
// Assert(t, AnythingOfType("string"), AnythingOfType("int"))
|
||||||
func AnythingOfType(t string) AnythingOfTypeArgument {
|
func AnythingOfType(t string) AnythingOfTypeArgument {
|
||||||
return AnythingOfTypeArgument(t)
|
return AnythingOfTypeArgument(t)
|
||||||
@@ -780,6 +789,34 @@ func IsType(t interface{}) *IsTypeArgument {
|
|||||||
return &IsTypeArgument{t: t}
|
return &IsTypeArgument{t: t}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FunctionalOptionsArgument is a struct that contains the type and value of an functional option argument
|
||||||
|
// for use when type checking.
|
||||||
|
type FunctionalOptionsArgument struct {
|
||||||
|
value interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// String returns the string representation of FunctionalOptionsArgument
|
||||||
|
func (f *FunctionalOptionsArgument) String() string {
|
||||||
|
var name string
|
||||||
|
tValue := reflect.ValueOf(f.value)
|
||||||
|
if tValue.Len() > 0 {
|
||||||
|
name = "[]" + reflect.TypeOf(tValue.Index(0).Interface()).String()
|
||||||
|
}
|
||||||
|
|
||||||
|
return strings.Replace(fmt.Sprintf("%#v", f.value), "[]interface {}", name, 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FunctionalOptions returns an FunctionalOptionsArgument object containing the functional option type
|
||||||
|
// and the values to check of
|
||||||
|
//
|
||||||
|
// For example:
|
||||||
|
// Assert(t, FunctionalOptions("[]foo.FunctionalOption", foo.Opt1(), foo.Opt2()))
|
||||||
|
func FunctionalOptions(value ...interface{}) *FunctionalOptionsArgument {
|
||||||
|
return &FunctionalOptionsArgument{
|
||||||
|
value: value,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// argumentMatcher performs custom argument matching, returning whether or
|
// argumentMatcher performs custom argument matching, returning whether or
|
||||||
// not the argument is matched by the expectation fixture function.
|
// not the argument is matched by the expectation fixture function.
|
||||||
type argumentMatcher struct {
|
type argumentMatcher struct {
|
||||||
@@ -926,6 +963,29 @@ func (args Arguments) Diff(objects []interface{}) (string, int) {
|
|||||||
differences++
|
differences++
|
||||||
output = fmt.Sprintf("%s\t%d: FAIL: type %s != type %s - %s\n", output, i, reflect.TypeOf(t).Name(), reflect.TypeOf(actual).Name(), actualFmt)
|
output = fmt.Sprintf("%s\t%d: FAIL: type %s != type %s - %s\n", output, i, reflect.TypeOf(t).Name(), reflect.TypeOf(actual).Name(), actualFmt)
|
||||||
}
|
}
|
||||||
|
} else if reflect.TypeOf(expected) == reflect.TypeOf((*FunctionalOptionsArgument)(nil)) {
|
||||||
|
t := expected.(*FunctionalOptionsArgument).value
|
||||||
|
|
||||||
|
var name string
|
||||||
|
tValue := reflect.ValueOf(t)
|
||||||
|
if tValue.Len() > 0 {
|
||||||
|
name = "[]" + reflect.TypeOf(tValue.Index(0).Interface()).String()
|
||||||
|
}
|
||||||
|
|
||||||
|
tName := reflect.TypeOf(t).Name()
|
||||||
|
if name != reflect.TypeOf(actual).String() && tValue.Len() != 0 {
|
||||||
|
differences++
|
||||||
|
output = fmt.Sprintf("%s\t%d: FAIL: type %s != type %s - %s\n", output, i, tName, reflect.TypeOf(actual).Name(), actualFmt)
|
||||||
|
} else {
|
||||||
|
if ef, af := assertOpts(t, actual); ef == "" && af == "" {
|
||||||
|
// match
|
||||||
|
output = fmt.Sprintf("%s\t%d: PASS: %s == %s\n", output, i, tName, tName)
|
||||||
|
} else {
|
||||||
|
// not match
|
||||||
|
differences++
|
||||||
|
output = fmt.Sprintf("%s\t%d: FAIL: %s != %s\n", output, i, af, ef)
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// normal checking
|
// normal checking
|
||||||
|
|
||||||
@@ -1102,3 +1162,65 @@ var spewConfig = spew.ConfigState{
|
|||||||
type tHelper interface {
|
type tHelper interface {
|
||||||
Helper()
|
Helper()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func assertOpts(expected, actual interface{}) (expectedFmt, actualFmt string) {
|
||||||
|
expectedOpts := reflect.ValueOf(expected)
|
||||||
|
actualOpts := reflect.ValueOf(actual)
|
||||||
|
var expectedNames []string
|
||||||
|
for i := 0; i < expectedOpts.Len(); i++ {
|
||||||
|
expectedNames = append(expectedNames, funcName(expectedOpts.Index(i).Interface()))
|
||||||
|
}
|
||||||
|
var actualNames []string
|
||||||
|
for i := 0; i < actualOpts.Len(); i++ {
|
||||||
|
actualNames = append(actualNames, funcName(actualOpts.Index(i).Interface()))
|
||||||
|
}
|
||||||
|
if !assert.ObjectsAreEqual(expectedNames, actualNames) {
|
||||||
|
expectedFmt = fmt.Sprintf("%v", expectedNames)
|
||||||
|
actualFmt = fmt.Sprintf("%v", actualNames)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < expectedOpts.Len(); i++ {
|
||||||
|
expectedOpt := expectedOpts.Index(i).Interface()
|
||||||
|
actualOpt := actualOpts.Index(i).Interface()
|
||||||
|
|
||||||
|
expectedFunc := expectedNames[i]
|
||||||
|
actualFunc := actualNames[i]
|
||||||
|
if expectedFunc != actualFunc {
|
||||||
|
expectedFmt = expectedFunc
|
||||||
|
actualFmt = actualFunc
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
ot := reflect.TypeOf(expectedOpt)
|
||||||
|
var expectedValues []reflect.Value
|
||||||
|
var actualValues []reflect.Value
|
||||||
|
if ot.NumIn() == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < ot.NumIn(); i++ {
|
||||||
|
vt := ot.In(i).Elem()
|
||||||
|
expectedValues = append(expectedValues, reflect.New(vt))
|
||||||
|
actualValues = append(actualValues, reflect.New(vt))
|
||||||
|
}
|
||||||
|
|
||||||
|
reflect.ValueOf(expectedOpt).Call(expectedValues)
|
||||||
|
reflect.ValueOf(actualOpt).Call(actualValues)
|
||||||
|
|
||||||
|
for i := 0; i < ot.NumIn(); i++ {
|
||||||
|
if !assert.ObjectsAreEqual(expectedValues[i].Interface(), actualValues[i].Interface()) {
|
||||||
|
expectedFmt = fmt.Sprintf("%s %+v", expectedNames[i], expectedValues[i].Interface())
|
||||||
|
actualFmt = fmt.Sprintf("%s %+v", expectedNames[i], actualValues[i].Interface())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return "", ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func funcName(opt interface{}) string {
|
||||||
|
n := runtime.FuncForPC(reflect.ValueOf(opt).Pointer()).Name()
|
||||||
|
return strings.TrimSuffix(path.Base(n), path.Ext(n))
|
||||||
|
}
|
||||||
|
|||||||
+12
-11
@@ -1,24 +1,25 @@
|
|||||||
// Package require implements the same assertions as the `assert` package but
|
// Package require implements the same assertions as the `assert` package but
|
||||||
// stops test execution when a test fails.
|
// stops test execution when a test fails.
|
||||||
//
|
//
|
||||||
// Example Usage
|
// # Example Usage
|
||||||
//
|
//
|
||||||
// The following is a complete example using require in a standard test function:
|
// The following is a complete example using require in a standard test function:
|
||||||
// import (
|
|
||||||
// "testing"
|
|
||||||
// "github.com/stretchr/testify/require"
|
|
||||||
// )
|
|
||||||
//
|
//
|
||||||
// func TestSomething(t *testing.T) {
|
// import (
|
||||||
|
// "testing"
|
||||||
|
// "github.com/stretchr/testify/require"
|
||||||
|
// )
|
||||||
//
|
//
|
||||||
// var a string = "Hello"
|
// func TestSomething(t *testing.T) {
|
||||||
// var b string = "Hello"
|
|
||||||
//
|
//
|
||||||
// require.Equal(t, a, b, "The two words should be the same.")
|
// var a string = "Hello"
|
||||||
|
// var b string = "Hello"
|
||||||
//
|
//
|
||||||
// }
|
// require.Equal(t, a, b, "The two words should be the same.")
|
||||||
//
|
//
|
||||||
// Assertions
|
// }
|
||||||
|
//
|
||||||
|
// # Assertions
|
||||||
//
|
//
|
||||||
// The `require` package have same global functions as in the `assert` package,
|
// The `require` package have same global functions as in the `assert` package,
|
||||||
// but instead of returning a boolean result they call `t.FailNow()`.
|
// but instead of returning a boolean result they call `t.FailNow()`.
|
||||||
|
|||||||
+270
-174
File diff suppressed because it is too large
Load Diff
+258
-174
File diff suppressed because it is too large
Load Diff
+5
@@ -0,0 +1,5 @@
|
|||||||
|
ot
|
||||||
|
fo
|
||||||
|
te
|
||||||
|
collison
|
||||||
|
consequentially
|
||||||
+10
@@ -0,0 +1,10 @@
|
|||||||
|
# https://github.com/codespell-project/codespell
|
||||||
|
[codespell]
|
||||||
|
builtin = clear,rare,informal
|
||||||
|
check-filenames =
|
||||||
|
check-hidden =
|
||||||
|
ignore-words = .codespellignore
|
||||||
|
interactive = 1
|
||||||
|
skip = .git,go.mod,go.sum,semconv,venv,.tools
|
||||||
|
uri-ignore-words-list = *
|
||||||
|
write =
|
||||||
+1
@@ -2,6 +2,7 @@
|
|||||||
Thumbs.db
|
Thumbs.db
|
||||||
|
|
||||||
.tools/
|
.tools/
|
||||||
|
venv/
|
||||||
.idea/
|
.idea/
|
||||||
.vscode/
|
.vscode/
|
||||||
*.iml
|
*.iml
|
||||||
|
|||||||
+1
-1
@@ -113,7 +113,7 @@ linters-settings:
|
|||||||
- name: constant-logical-expr
|
- name: constant-logical-expr
|
||||||
disabled: false
|
disabled: false
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#context-as-argument
|
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#context-as-argument
|
||||||
# TODO (#3372) reenable linter when it is compatible. https://github.com/golangci/golangci-lint/issues/3280
|
# TODO (#3372) re-enable linter when it is compatible. https://github.com/golangci/golangci-lint/issues/3280
|
||||||
- name: context-as-argument
|
- name: context-as-argument
|
||||||
disabled: true
|
disabled: true
|
||||||
arguments:
|
arguments:
|
||||||
|
|||||||
+54
-1
@@ -8,6 +8,55 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [1.16.0/0.39.0] 2023-05-18
|
||||||
|
|
||||||
|
This release contains the first stable release of the OpenTelemetry Go [metric API].
|
||||||
|
Our project stability guarantees now apply to the `go.opentelemetry.io/otel/metric` package.
|
||||||
|
See our [versioning policy](VERSIONING.md) for more information about these stability guarantees.
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- The `go.opentelemetry.io/otel/semconv/v1.19.0` package.
|
||||||
|
The package contains semantic conventions from the `v1.19.0` version of the OpenTelemetry specification. (#3848)
|
||||||
|
- The `go.opentelemetry.io/otel/semconv/v1.20.0` package.
|
||||||
|
The package contains semantic conventions from the `v1.20.0` version of the OpenTelemetry specification. (#4078)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Use `strings.Cut()` instead of `string.SplitN()` for better readability and memory use. (#4049)
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- The deprecated `go.opentelemetry.io/otel/metric/instrument` package is removed.
|
||||||
|
Use `go.opentelemetry.io/otel/metric` instead. (#4055)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix build for BSD based systems in `go.opentelemetry.io/otel/sdk/resource`. (#4077)
|
||||||
|
|
||||||
|
## [1.16.0-rc.1/0.39.0-rc.1] 2023-05-03
|
||||||
|
|
||||||
|
This is a release candidate for the v1.16.0/v0.39.0 release.
|
||||||
|
That release is expected to include the `v1` release of the OpenTelemetry Go metric API and will provide stability guarantees of that API.
|
||||||
|
See our [versioning policy](VERSIONING.md) for more information about these stability guarantees.
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Support global `MeterProvider` in `go.opentelemetry.io/otel`. (#4039)
|
||||||
|
- Use `Meter` for a `metric.Meter` from the global `metric.MeterProvider`.
|
||||||
|
- Use `GetMeterProivder` for a global `metric.MeterProvider`.
|
||||||
|
- Use `SetMeterProivder` to set the global `metric.MeterProvider`.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Move the `go.opentelemetry.io/otel/metric` module to the `stable-v1` module set.
|
||||||
|
This stages the metric API to be released as a stable module. (#4038)
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- The `go.opentelemetry.io/otel/metric/global` package is removed.
|
||||||
|
Use `go.opentelemetry.io/otel` instead. (#4039)
|
||||||
|
|
||||||
## [1.15.1/0.38.1] 2023-05-02
|
## [1.15.1/0.38.1] 2023-05-02
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
@@ -2443,7 +2492,9 @@ It contains api and sdk for trace and meter.
|
|||||||
- CircleCI build CI manifest files.
|
- CircleCI build CI manifest files.
|
||||||
- CODEOWNERS file to track owners of this project.
|
- CODEOWNERS file to track owners of this project.
|
||||||
|
|
||||||
[Unreleased]: https://github.com/open-telemetry/opentelemetry-go/compare/v1.15.1...HEAD
|
[Unreleased]: https://github.com/open-telemetry/opentelemetry-go/compare/v1.16.0...HEAD
|
||||||
|
[1.16.0/0.39.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.16.0
|
||||||
|
[1.16.0-rc.1/0.39.0-rc.1]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.16.0-rc.1
|
||||||
[1.15.1/0.38.1]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.15.1
|
[1.15.1/0.38.1]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.15.1
|
||||||
[1.15.0/0.38.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.15.0
|
[1.15.0/0.38.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.15.0
|
||||||
[1.15.0-rc.2/0.38.0-rc.2]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.15.0-rc.2
|
[1.15.0-rc.2/0.38.0-rc.2]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.15.0-rc.2
|
||||||
@@ -2512,3 +2563,5 @@ It contains api and sdk for trace and meter.
|
|||||||
[Go 1.20]: https://go.dev/doc/go1.20
|
[Go 1.20]: https://go.dev/doc/go1.20
|
||||||
[Go 1.19]: https://go.dev/doc/go1.19
|
[Go 1.19]: https://go.dev/doc/go1.19
|
||||||
[Go 1.18]: https://go.dev/doc/go1.18
|
[Go 1.18]: https://go.dev/doc/go1.18
|
||||||
|
|
||||||
|
[metric API]:https://pkg.go.dev/go.opentelemetry.io/otel/metric
|
||||||
|
|||||||
+7
-2
@@ -28,6 +28,11 @@ precommit` - the `precommit` target is the default).
|
|||||||
The `precommit` target also fixes the formatting of the code and
|
The `precommit` target also fixes the formatting of the code and
|
||||||
checks the status of the go module files.
|
checks the status of the go module files.
|
||||||
|
|
||||||
|
Additionally, there is a `codespell` target that checks for common
|
||||||
|
typos in the code. It is not run by default, but you can run it
|
||||||
|
manually with `make codespell`. It will set up a virtual environment
|
||||||
|
in `venv` and install `codespell` there.
|
||||||
|
|
||||||
If after running `make precommit` the output of `git status` contains
|
If after running `make precommit` the output of `git status` contains
|
||||||
`nothing to commit, working tree clean` then it means that everything
|
`nothing to commit, working tree clean` then it means that everything
|
||||||
is up-to-date and properly formatted.
|
is up-to-date and properly formatted.
|
||||||
@@ -150,10 +155,10 @@ Any [Maintainer] can merge the PR once the above criteria have been met.
|
|||||||
## Design Choices
|
## Design Choices
|
||||||
|
|
||||||
As with other OpenTelemetry clients, opentelemetry-go follows the
|
As with other OpenTelemetry clients, opentelemetry-go follows the
|
||||||
[opentelemetry-specification](https://github.com/open-telemetry/opentelemetry-specification).
|
[OpenTelemetry Specification](https://opentelemetry.io/docs/specs/otel).
|
||||||
|
|
||||||
It's especially valuable to read through the [library
|
It's especially valuable to read through the [library
|
||||||
guidelines](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/library-guidelines.md).
|
guidelines](https://opentelemetry.io/docs/specs/otel/library-guidelines).
|
||||||
|
|
||||||
### Focus on Capabilities, Not Structure Compliance
|
### Focus on Capabilities, Not Structure Compliance
|
||||||
|
|
||||||
|
|||||||
+47
-5
@@ -25,8 +25,8 @@ TIMEOUT = 60
|
|||||||
.DEFAULT_GOAL := precommit
|
.DEFAULT_GOAL := precommit
|
||||||
|
|
||||||
.PHONY: precommit ci
|
.PHONY: precommit ci
|
||||||
precommit: dependabot-generate license-check vanity-import-fix misspell go-mod-tidy golangci-lint-fix test-default
|
precommit: generate dependabot-generate license-check vanity-import-fix misspell go-mod-tidy golangci-lint-fix test-default
|
||||||
ci: dependabot-check license-check lint vanity-import-check build test-default check-clean-work-tree test-coverage
|
ci: generate dependabot-check license-check lint vanity-import-check build test-default check-clean-work-tree test-coverage
|
||||||
|
|
||||||
# Tools
|
# Tools
|
||||||
|
|
||||||
@@ -74,9 +74,42 @@ $(TOOLS)/gojq: PACKAGE=github.com/itchyny/gojq/cmd/gojq
|
|||||||
.PHONY: tools
|
.PHONY: tools
|
||||||
tools: $(CROSSLINK) $(DBOTCONF) $(GOLANGCI_LINT) $(MISSPELL) $(GOCOVMERGE) $(STRINGER) $(PORTO) $(GOJQ) $(SEMCONVGEN) $(MULTIMOD) $(SEMCONVKIT)
|
tools: $(CROSSLINK) $(DBOTCONF) $(GOLANGCI_LINT) $(MISSPELL) $(GOCOVMERGE) $(STRINGER) $(PORTO) $(GOJQ) $(SEMCONVGEN) $(MULTIMOD) $(SEMCONVKIT)
|
||||||
|
|
||||||
# Build
|
# Virtualized python tools via docker
|
||||||
|
|
||||||
.PHONY: generate build
|
# The directory where the virtual environment is created.
|
||||||
|
VENVDIR := venv
|
||||||
|
|
||||||
|
# The directory where the python tools are installed.
|
||||||
|
PYTOOLS := $(VENVDIR)/bin
|
||||||
|
|
||||||
|
# The pip executable in the virtual environment.
|
||||||
|
PIP := $(PYTOOLS)/pip
|
||||||
|
|
||||||
|
# The directory in the docker image where the current directory is mounted.
|
||||||
|
WORKDIR := /workdir
|
||||||
|
|
||||||
|
# The python image to use for the virtual environment.
|
||||||
|
PYTHONIMAGE := python:3.11.3-slim-bullseye
|
||||||
|
|
||||||
|
# Run the python image with the current directory mounted.
|
||||||
|
DOCKERPY := docker run --rm -v "$(CURDIR):$(WORKDIR)" -w $(WORKDIR) $(PYTHONIMAGE)
|
||||||
|
|
||||||
|
# Create a virtual environment for Python tools.
|
||||||
|
$(PYTOOLS):
|
||||||
|
# The `--upgrade` flag is needed to ensure that the virtual environment is
|
||||||
|
# created with the latest pip version.
|
||||||
|
@$(DOCKERPY) bash -c "python3 -m venv $(VENVDIR) && $(PIP) install --upgrade pip"
|
||||||
|
|
||||||
|
# Install python packages into the virtual environment.
|
||||||
|
$(PYTOOLS)/%: | $(PYTOOLS)
|
||||||
|
@$(DOCKERPY) $(PIP) install -r requirements.txt
|
||||||
|
|
||||||
|
CODESPELL = $(PYTOOLS)/codespell
|
||||||
|
$(CODESPELL): PACKAGE=codespell
|
||||||
|
|
||||||
|
# Generate
|
||||||
|
|
||||||
|
.PHONY: generate
|
||||||
|
|
||||||
generate: $(OTEL_GO_MOD_DIRS:%=generate/%)
|
generate: $(OTEL_GO_MOD_DIRS:%=generate/%)
|
||||||
generate/%: DIR=$*
|
generate/%: DIR=$*
|
||||||
@@ -85,7 +118,11 @@ generate/%: | $(STRINGER) $(PORTO)
|
|||||||
&& cd $(DIR) \
|
&& cd $(DIR) \
|
||||||
&& PATH="$(TOOLS):$${PATH}" $(GO) generate ./... && $(PORTO) -w .
|
&& PATH="$(TOOLS):$${PATH}" $(GO) generate ./... && $(PORTO) -w .
|
||||||
|
|
||||||
build: generate $(OTEL_GO_MOD_DIRS:%=build/%) $(OTEL_GO_MOD_DIRS:%=build-tests/%)
|
# Build
|
||||||
|
|
||||||
|
.PHONY: build
|
||||||
|
|
||||||
|
build: $(OTEL_GO_MOD_DIRS:%=build/%) $(OTEL_GO_MOD_DIRS:%=build-tests/%)
|
||||||
build/%: DIR=$*
|
build/%: DIR=$*
|
||||||
build/%:
|
build/%:
|
||||||
@echo "$(GO) build $(DIR)/..." \
|
@echo "$(GO) build $(DIR)/..." \
|
||||||
@@ -176,6 +213,10 @@ vanity-import-fix: | $(PORTO)
|
|||||||
misspell: | $(MISSPELL)
|
misspell: | $(MISSPELL)
|
||||||
@$(MISSPELL) -w $(ALL_DOCS)
|
@$(MISSPELL) -w $(ALL_DOCS)
|
||||||
|
|
||||||
|
.PHONY: codespell
|
||||||
|
codespell: | $(CODESPELL)
|
||||||
|
@$(DOCKERPY) $(CODESPELL)
|
||||||
|
|
||||||
.PHONY: license-check
|
.PHONY: license-check
|
||||||
license-check:
|
license-check:
|
||||||
@licRes=$$(for f in $$(find . -type f \( -iname '*.go' -o -iname '*.sh' \) ! -path '**/third_party/*' ! -path './.git/*' ) ; do \
|
@licRes=$$(for f in $$(find . -type f \( -iname '*.go' -o -iname '*.sh' \) ! -path '**/third_party/*' ! -path './.git/*' ) ; do \
|
||||||
@@ -211,6 +252,7 @@ semconv-generate: | $(SEMCONVGEN) $(SEMCONVKIT)
|
|||||||
[ "$(TAG)" ] || ( echo "TAG unset: missing opentelemetry specification tag"; exit 1 )
|
[ "$(TAG)" ] || ( echo "TAG unset: missing opentelemetry specification tag"; exit 1 )
|
||||||
[ "$(OTEL_SPEC_REPO)" ] || ( echo "OTEL_SPEC_REPO unset: missing path to opentelemetry specification repo"; exit 1 )
|
[ "$(OTEL_SPEC_REPO)" ] || ( echo "OTEL_SPEC_REPO unset: missing path to opentelemetry specification repo"; exit 1 )
|
||||||
$(SEMCONVGEN) -i "$(OTEL_SPEC_REPO)/semantic_conventions/." --only=span -p conventionType=trace -f trace.go -t "$(SEMCONVPKG)/template.j2" -s "$(TAG)"
|
$(SEMCONVGEN) -i "$(OTEL_SPEC_REPO)/semantic_conventions/." --only=span -p conventionType=trace -f trace.go -t "$(SEMCONVPKG)/template.j2" -s "$(TAG)"
|
||||||
|
$(SEMCONVGEN) -i "$(OTEL_SPEC_REPO)/semantic_conventions/." --only=attribute_group -p conventionType=trace -f attribute_group.go -t "$(SEMCONVPKG)/template.j2" -s "$(TAG)"
|
||||||
$(SEMCONVGEN) -i "$(OTEL_SPEC_REPO)/semantic_conventions/." --only=event -p conventionType=event -f event.go -t "$(SEMCONVPKG)/template.j2" -s "$(TAG)"
|
$(SEMCONVGEN) -i "$(OTEL_SPEC_REPO)/semantic_conventions/." --only=event -p conventionType=event -f event.go -t "$(SEMCONVPKG)/template.j2" -s "$(TAG)"
|
||||||
$(SEMCONVGEN) -i "$(OTEL_SPEC_REPO)/semantic_conventions/." --only=resource -p conventionType=resource -f resource.go -t "$(SEMCONVPKG)/template.j2" -s "$(TAG)"
|
$(SEMCONVGEN) -i "$(OTEL_SPEC_REPO)/semantic_conventions/." --only=resource -p conventionType=resource -f resource.go -t "$(SEMCONVPKG)/template.j2" -s "$(TAG)"
|
||||||
$(SEMCONVKIT) -output "$(SEMCONVPKG)/$(TAG)" -tag "$(TAG)"
|
$(SEMCONVKIT) -output "$(SEMCONVPKG)/$(TAG)" -tag "$(TAG)"
|
||||||
|
|||||||
+3
-4
@@ -2,10 +2,10 @@
|
|||||||
|
|
||||||
## Semantic Convention Generation
|
## Semantic Convention Generation
|
||||||
|
|
||||||
New versions of the [OpenTelemetry specification] mean new versions of the `semconv` package need to be generated.
|
New versions of the [OpenTelemetry Specification] mean new versions of the `semconv` package need to be generated.
|
||||||
The `semconv-generate` make target is used for this.
|
The `semconv-generate` make target is used for this.
|
||||||
|
|
||||||
1. Checkout a local copy of the [OpenTelemetry specification] to the desired release tag.
|
1. Checkout a local copy of the [OpenTelemetry Specification] to the desired release tag.
|
||||||
2. Pull the latest `otel/semconvgen` image: `docker pull otel/semconvgen:latest`
|
2. Pull the latest `otel/semconvgen` image: `docker pull otel/semconvgen:latest`
|
||||||
3. Run the `make semconv-generate ...` target from this repository.
|
3. Run the `make semconv-generate ...` target from this repository.
|
||||||
|
|
||||||
@@ -14,7 +14,6 @@ For example,
|
|||||||
```sh
|
```sh
|
||||||
export TAG="v1.13.0" # Change to the release version you are generating.
|
export TAG="v1.13.0" # Change to the release version you are generating.
|
||||||
export OTEL_SPEC_REPO="/absolute/path/to/opentelemetry-specification"
|
export OTEL_SPEC_REPO="/absolute/path/to/opentelemetry-specification"
|
||||||
git -C "$OTEL_SPEC_REPO" checkout "tags/$TAG" -b "$TAG"
|
|
||||||
docker pull otel/semconvgen:latest
|
docker pull otel/semconvgen:latest
|
||||||
make semconv-generate # Uses the exported TAG and OTEL_SPEC_REPO.
|
make semconv-generate # Uses the exported TAG and OTEL_SPEC_REPO.
|
||||||
```
|
```
|
||||||
@@ -124,4 +123,4 @@ Once verified be sure to [make a release for the `contrib` repository](https://g
|
|||||||
Update [the documentation](./website_docs) for [the OpenTelemetry website](https://opentelemetry.io/docs/go/).
|
Update [the documentation](./website_docs) for [the OpenTelemetry website](https://opentelemetry.io/docs/go/).
|
||||||
Importantly, bump any package versions referenced to be the latest one you just released and ensure all code examples still compile and are accurate.
|
Importantly, bump any package versions referenced to be the latest one you just released and ensure all code examples still compile and are accurate.
|
||||||
|
|
||||||
[OpenTelemetry specification]: https://github.com/open-telemetry/opentelemetry-specification
|
[OpenTelemetry Specification]: https://github.com/open-telemetry/opentelemetry-specification
|
||||||
|
|||||||
+23
-31
@@ -289,45 +289,37 @@ func parseMember(member string) (Member, error) {
|
|||||||
props properties
|
props properties
|
||||||
)
|
)
|
||||||
|
|
||||||
parts := strings.SplitN(member, propertyDelimiter, 2)
|
keyValue, properties, found := strings.Cut(member, propertyDelimiter)
|
||||||
switch len(parts) {
|
if found {
|
||||||
case 2:
|
|
||||||
// Parse the member properties.
|
// Parse the member properties.
|
||||||
for _, pStr := range strings.Split(parts[1], propertyDelimiter) {
|
for _, pStr := range strings.Split(properties, propertyDelimiter) {
|
||||||
p, err := parseProperty(pStr)
|
p, err := parseProperty(pStr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return newInvalidMember(), err
|
return newInvalidMember(), err
|
||||||
}
|
}
|
||||||
props = append(props, p)
|
props = append(props, p)
|
||||||
}
|
}
|
||||||
fallthrough
|
}
|
||||||
case 1:
|
// Parse the member key/value pair.
|
||||||
// Parse the member key/value pair.
|
|
||||||
|
|
||||||
// Take into account a value can contain equal signs (=).
|
// Take into account a value can contain equal signs (=).
|
||||||
kv := strings.SplitN(parts[0], keyValueDelimiter, 2)
|
k, v, found := strings.Cut(keyValue, keyValueDelimiter)
|
||||||
if len(kv) != 2 {
|
if !found {
|
||||||
return newInvalidMember(), fmt.Errorf("%w: %q", errInvalidMember, member)
|
return newInvalidMember(), fmt.Errorf("%w: %q", errInvalidMember, member)
|
||||||
}
|
}
|
||||||
// "Leading and trailing whitespaces are allowed but MUST be trimmed
|
// "Leading and trailing whitespaces are allowed but MUST be trimmed
|
||||||
// when converting the header into a data structure."
|
// when converting the header into a data structure."
|
||||||
key = strings.TrimSpace(kv[0])
|
key = strings.TrimSpace(k)
|
||||||
var err error
|
var err error
|
||||||
value, err = url.QueryUnescape(strings.TrimSpace(kv[1]))
|
value, err = url.QueryUnescape(strings.TrimSpace(v))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return newInvalidMember(), fmt.Errorf("%w: %q", err, value)
|
return newInvalidMember(), fmt.Errorf("%w: %q", err, value)
|
||||||
}
|
}
|
||||||
if !keyRe.MatchString(key) {
|
if !keyRe.MatchString(key) {
|
||||||
return newInvalidMember(), fmt.Errorf("%w: %q", errInvalidKey, key)
|
return newInvalidMember(), fmt.Errorf("%w: %q", errInvalidKey, key)
|
||||||
}
|
}
|
||||||
if !valueRe.MatchString(value) {
|
if !valueRe.MatchString(value) {
|
||||||
return newInvalidMember(), fmt.Errorf("%w: %q", errInvalidValue, value)
|
return newInvalidMember(), fmt.Errorf("%w: %q", errInvalidValue, value)
|
||||||
}
|
|
||||||
default:
|
|
||||||
// This should never happen unless a developer has changed the string
|
|
||||||
// splitting somehow. Panic instead of failing silently and allowing
|
|
||||||
// the bug to slip past the CI checks.
|
|
||||||
panic("failed to parse baggage member")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return Member{key: key, value: value, properties: props, hasData: true}, nil
|
return Member{key: key, value: value, properties: props, hasData: true}, nil
|
||||||
|
|||||||
+1
-1
@@ -16,6 +16,6 @@
|
|||||||
Package codes defines the canonical error codes used by OpenTelemetry.
|
Package codes defines the canonical error codes used by OpenTelemetry.
|
||||||
|
|
||||||
It conforms to [the OpenTelemetry
|
It conforms to [the OpenTelemetry
|
||||||
specification](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/api.md#statuscanonicalcode).
|
specification](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.20.0/specification/trace/api.md#set-status).
|
||||||
*/
|
*/
|
||||||
package codes // import "go.opentelemetry.io/otel/codes"
|
package codes // import "go.opentelemetry.io/otel/codes"
|
||||||
|
|||||||
+7
-7
@@ -166,20 +166,20 @@ func stringToHeader(value string) map[string]string {
|
|||||||
headers := make(map[string]string)
|
headers := make(map[string]string)
|
||||||
|
|
||||||
for _, header := range headersPairs {
|
for _, header := range headersPairs {
|
||||||
nameValue := strings.SplitN(header, "=", 2)
|
n, v, found := strings.Cut(header, "=")
|
||||||
if len(nameValue) < 2 {
|
if !found {
|
||||||
global.Error(errors.New("missing '="), "parse headers", "input", nameValue)
|
global.Error(errors.New("missing '="), "parse headers", "input", header)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
name, err := url.QueryUnescape(nameValue[0])
|
name, err := url.QueryUnescape(n)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
global.Error(err, "escape header key", "key", nameValue[0])
|
global.Error(err, "escape header key", "key", n)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
trimmedName := strings.TrimSpace(name)
|
trimmedName := strings.TrimSpace(name)
|
||||||
value, err := url.QueryUnescape(nameValue[1])
|
value, err := url.QueryUnescape(v)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
global.Error(err, "escape header value", "value", nameValue[1])
|
global.Error(err, "escape header value", "value", v)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
trimmedValue := strings.TrimSpace(value)
|
trimmedValue := strings.TrimSpace(value)
|
||||||
|
|||||||
+359
@@ -0,0 +1,359 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package global // import "go.opentelemetry.io/otel/internal/global"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"sync/atomic"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/metric"
|
||||||
|
"go.opentelemetry.io/otel/metric/embedded"
|
||||||
|
)
|
||||||
|
|
||||||
|
// unwrapper unwraps to return the underlying instrument implementation.
|
||||||
|
type unwrapper interface {
|
||||||
|
Unwrap() metric.Observable
|
||||||
|
}
|
||||||
|
|
||||||
|
type afCounter struct {
|
||||||
|
embedded.Float64ObservableCounter
|
||||||
|
metric.Float64Observable
|
||||||
|
|
||||||
|
name string
|
||||||
|
opts []metric.Float64ObservableCounterOption
|
||||||
|
|
||||||
|
delegate atomic.Value //metric.Float64ObservableCounter
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ unwrapper = (*afCounter)(nil)
|
||||||
|
var _ metric.Float64ObservableCounter = (*afCounter)(nil)
|
||||||
|
|
||||||
|
func (i *afCounter) setDelegate(m metric.Meter) {
|
||||||
|
ctr, err := m.Float64ObservableCounter(i.name, i.opts...)
|
||||||
|
if err != nil {
|
||||||
|
GetErrorHandler().Handle(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i.delegate.Store(ctr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *afCounter) Unwrap() metric.Observable {
|
||||||
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
|
return ctr.(metric.Float64ObservableCounter)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type afUpDownCounter struct {
|
||||||
|
embedded.Float64ObservableUpDownCounter
|
||||||
|
metric.Float64Observable
|
||||||
|
|
||||||
|
name string
|
||||||
|
opts []metric.Float64ObservableUpDownCounterOption
|
||||||
|
|
||||||
|
delegate atomic.Value //metric.Float64ObservableUpDownCounter
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ unwrapper = (*afUpDownCounter)(nil)
|
||||||
|
var _ metric.Float64ObservableUpDownCounter = (*afUpDownCounter)(nil)
|
||||||
|
|
||||||
|
func (i *afUpDownCounter) setDelegate(m metric.Meter) {
|
||||||
|
ctr, err := m.Float64ObservableUpDownCounter(i.name, i.opts...)
|
||||||
|
if err != nil {
|
||||||
|
GetErrorHandler().Handle(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i.delegate.Store(ctr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *afUpDownCounter) Unwrap() metric.Observable {
|
||||||
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
|
return ctr.(metric.Float64ObservableUpDownCounter)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type afGauge struct {
|
||||||
|
embedded.Float64ObservableGauge
|
||||||
|
metric.Float64Observable
|
||||||
|
|
||||||
|
name string
|
||||||
|
opts []metric.Float64ObservableGaugeOption
|
||||||
|
|
||||||
|
delegate atomic.Value //metric.Float64ObservableGauge
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ unwrapper = (*afGauge)(nil)
|
||||||
|
var _ metric.Float64ObservableGauge = (*afGauge)(nil)
|
||||||
|
|
||||||
|
func (i *afGauge) setDelegate(m metric.Meter) {
|
||||||
|
ctr, err := m.Float64ObservableGauge(i.name, i.opts...)
|
||||||
|
if err != nil {
|
||||||
|
GetErrorHandler().Handle(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i.delegate.Store(ctr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *afGauge) Unwrap() metric.Observable {
|
||||||
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
|
return ctr.(metric.Float64ObservableGauge)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type aiCounter struct {
|
||||||
|
embedded.Int64ObservableCounter
|
||||||
|
metric.Int64Observable
|
||||||
|
|
||||||
|
name string
|
||||||
|
opts []metric.Int64ObservableCounterOption
|
||||||
|
|
||||||
|
delegate atomic.Value //metric.Int64ObservableCounter
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ unwrapper = (*aiCounter)(nil)
|
||||||
|
var _ metric.Int64ObservableCounter = (*aiCounter)(nil)
|
||||||
|
|
||||||
|
func (i *aiCounter) setDelegate(m metric.Meter) {
|
||||||
|
ctr, err := m.Int64ObservableCounter(i.name, i.opts...)
|
||||||
|
if err != nil {
|
||||||
|
GetErrorHandler().Handle(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i.delegate.Store(ctr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *aiCounter) Unwrap() metric.Observable {
|
||||||
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
|
return ctr.(metric.Int64ObservableCounter)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type aiUpDownCounter struct {
|
||||||
|
embedded.Int64ObservableUpDownCounter
|
||||||
|
metric.Int64Observable
|
||||||
|
|
||||||
|
name string
|
||||||
|
opts []metric.Int64ObservableUpDownCounterOption
|
||||||
|
|
||||||
|
delegate atomic.Value //metric.Int64ObservableUpDownCounter
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ unwrapper = (*aiUpDownCounter)(nil)
|
||||||
|
var _ metric.Int64ObservableUpDownCounter = (*aiUpDownCounter)(nil)
|
||||||
|
|
||||||
|
func (i *aiUpDownCounter) setDelegate(m metric.Meter) {
|
||||||
|
ctr, err := m.Int64ObservableUpDownCounter(i.name, i.opts...)
|
||||||
|
if err != nil {
|
||||||
|
GetErrorHandler().Handle(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i.delegate.Store(ctr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *aiUpDownCounter) Unwrap() metric.Observable {
|
||||||
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
|
return ctr.(metric.Int64ObservableUpDownCounter)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type aiGauge struct {
|
||||||
|
embedded.Int64ObservableGauge
|
||||||
|
metric.Int64Observable
|
||||||
|
|
||||||
|
name string
|
||||||
|
opts []metric.Int64ObservableGaugeOption
|
||||||
|
|
||||||
|
delegate atomic.Value //metric.Int64ObservableGauge
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ unwrapper = (*aiGauge)(nil)
|
||||||
|
var _ metric.Int64ObservableGauge = (*aiGauge)(nil)
|
||||||
|
|
||||||
|
func (i *aiGauge) setDelegate(m metric.Meter) {
|
||||||
|
ctr, err := m.Int64ObservableGauge(i.name, i.opts...)
|
||||||
|
if err != nil {
|
||||||
|
GetErrorHandler().Handle(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i.delegate.Store(ctr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *aiGauge) Unwrap() metric.Observable {
|
||||||
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
|
return ctr.(metric.Int64ObservableGauge)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sync Instruments.
|
||||||
|
type sfCounter struct {
|
||||||
|
embedded.Float64Counter
|
||||||
|
|
||||||
|
name string
|
||||||
|
opts []metric.Float64CounterOption
|
||||||
|
|
||||||
|
delegate atomic.Value //metric.Float64Counter
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ metric.Float64Counter = (*sfCounter)(nil)
|
||||||
|
|
||||||
|
func (i *sfCounter) setDelegate(m metric.Meter) {
|
||||||
|
ctr, err := m.Float64Counter(i.name, i.opts...)
|
||||||
|
if err != nil {
|
||||||
|
GetErrorHandler().Handle(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i.delegate.Store(ctr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *sfCounter) Add(ctx context.Context, incr float64, opts ...metric.AddOption) {
|
||||||
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
|
ctr.(metric.Float64Counter).Add(ctx, incr, opts...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type sfUpDownCounter struct {
|
||||||
|
embedded.Float64UpDownCounter
|
||||||
|
|
||||||
|
name string
|
||||||
|
opts []metric.Float64UpDownCounterOption
|
||||||
|
|
||||||
|
delegate atomic.Value //metric.Float64UpDownCounter
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ metric.Float64UpDownCounter = (*sfUpDownCounter)(nil)
|
||||||
|
|
||||||
|
func (i *sfUpDownCounter) setDelegate(m metric.Meter) {
|
||||||
|
ctr, err := m.Float64UpDownCounter(i.name, i.opts...)
|
||||||
|
if err != nil {
|
||||||
|
GetErrorHandler().Handle(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i.delegate.Store(ctr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *sfUpDownCounter) Add(ctx context.Context, incr float64, opts ...metric.AddOption) {
|
||||||
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
|
ctr.(metric.Float64UpDownCounter).Add(ctx, incr, opts...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type sfHistogram struct {
|
||||||
|
embedded.Float64Histogram
|
||||||
|
|
||||||
|
name string
|
||||||
|
opts []metric.Float64HistogramOption
|
||||||
|
|
||||||
|
delegate atomic.Value //metric.Float64Histogram
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ metric.Float64Histogram = (*sfHistogram)(nil)
|
||||||
|
|
||||||
|
func (i *sfHistogram) setDelegate(m metric.Meter) {
|
||||||
|
ctr, err := m.Float64Histogram(i.name, i.opts...)
|
||||||
|
if err != nil {
|
||||||
|
GetErrorHandler().Handle(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i.delegate.Store(ctr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *sfHistogram) Record(ctx context.Context, x float64, opts ...metric.RecordOption) {
|
||||||
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
|
ctr.(metric.Float64Histogram).Record(ctx, x, opts...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type siCounter struct {
|
||||||
|
embedded.Int64Counter
|
||||||
|
|
||||||
|
name string
|
||||||
|
opts []metric.Int64CounterOption
|
||||||
|
|
||||||
|
delegate atomic.Value //metric.Int64Counter
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ metric.Int64Counter = (*siCounter)(nil)
|
||||||
|
|
||||||
|
func (i *siCounter) setDelegate(m metric.Meter) {
|
||||||
|
ctr, err := m.Int64Counter(i.name, i.opts...)
|
||||||
|
if err != nil {
|
||||||
|
GetErrorHandler().Handle(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i.delegate.Store(ctr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *siCounter) Add(ctx context.Context, x int64, opts ...metric.AddOption) {
|
||||||
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
|
ctr.(metric.Int64Counter).Add(ctx, x, opts...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type siUpDownCounter struct {
|
||||||
|
embedded.Int64UpDownCounter
|
||||||
|
|
||||||
|
name string
|
||||||
|
opts []metric.Int64UpDownCounterOption
|
||||||
|
|
||||||
|
delegate atomic.Value //metric.Int64UpDownCounter
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ metric.Int64UpDownCounter = (*siUpDownCounter)(nil)
|
||||||
|
|
||||||
|
func (i *siUpDownCounter) setDelegate(m metric.Meter) {
|
||||||
|
ctr, err := m.Int64UpDownCounter(i.name, i.opts...)
|
||||||
|
if err != nil {
|
||||||
|
GetErrorHandler().Handle(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i.delegate.Store(ctr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *siUpDownCounter) Add(ctx context.Context, x int64, opts ...metric.AddOption) {
|
||||||
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
|
ctr.(metric.Int64UpDownCounter).Add(ctx, x, opts...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type siHistogram struct {
|
||||||
|
embedded.Int64Histogram
|
||||||
|
|
||||||
|
name string
|
||||||
|
opts []metric.Int64HistogramOption
|
||||||
|
|
||||||
|
delegate atomic.Value //metric.Int64Histogram
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ metric.Int64Histogram = (*siHistogram)(nil)
|
||||||
|
|
||||||
|
func (i *siHistogram) setDelegate(m metric.Meter) {
|
||||||
|
ctr, err := m.Int64Histogram(i.name, i.opts...)
|
||||||
|
if err != nil {
|
||||||
|
GetErrorHandler().Handle(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i.delegate.Store(ctr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *siHistogram) Record(ctx context.Context, x int64, opts ...metric.RecordOption) {
|
||||||
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
|
ctr.(metric.Int64Histogram).Record(ctx, x, opts...)
|
||||||
|
}
|
||||||
|
}
|
||||||
+354
@@ -0,0 +1,354 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package global // import "go.opentelemetry.io/otel/internal/global"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"container/list"
|
||||||
|
"sync"
|
||||||
|
"sync/atomic"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/metric"
|
||||||
|
"go.opentelemetry.io/otel/metric/embedded"
|
||||||
|
)
|
||||||
|
|
||||||
|
// meterProvider is a placeholder for a configured SDK MeterProvider.
|
||||||
|
//
|
||||||
|
// All MeterProvider functionality is forwarded to a delegate once
|
||||||
|
// configured.
|
||||||
|
type meterProvider struct {
|
||||||
|
embedded.MeterProvider
|
||||||
|
|
||||||
|
mtx sync.Mutex
|
||||||
|
meters map[il]*meter
|
||||||
|
|
||||||
|
delegate metric.MeterProvider
|
||||||
|
}
|
||||||
|
|
||||||
|
// setDelegate configures p to delegate all MeterProvider functionality to
|
||||||
|
// provider.
|
||||||
|
//
|
||||||
|
// All Meters provided prior to this function call are switched out to be
|
||||||
|
// Meters provided by provider. All instruments and callbacks are recreated and
|
||||||
|
// delegated.
|
||||||
|
//
|
||||||
|
// It is guaranteed by the caller that this happens only once.
|
||||||
|
func (p *meterProvider) setDelegate(provider metric.MeterProvider) {
|
||||||
|
p.mtx.Lock()
|
||||||
|
defer p.mtx.Unlock()
|
||||||
|
|
||||||
|
p.delegate = provider
|
||||||
|
|
||||||
|
if len(p.meters) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, meter := range p.meters {
|
||||||
|
meter.setDelegate(provider)
|
||||||
|
}
|
||||||
|
|
||||||
|
p.meters = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Meter implements MeterProvider.
|
||||||
|
func (p *meterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter {
|
||||||
|
p.mtx.Lock()
|
||||||
|
defer p.mtx.Unlock()
|
||||||
|
|
||||||
|
if p.delegate != nil {
|
||||||
|
return p.delegate.Meter(name, opts...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// At this moment it is guaranteed that no sdk is installed, save the meter in the meters map.
|
||||||
|
|
||||||
|
c := metric.NewMeterConfig(opts...)
|
||||||
|
key := il{
|
||||||
|
name: name,
|
||||||
|
version: c.InstrumentationVersion(),
|
||||||
|
}
|
||||||
|
|
||||||
|
if p.meters == nil {
|
||||||
|
p.meters = make(map[il]*meter)
|
||||||
|
}
|
||||||
|
|
||||||
|
if val, ok := p.meters[key]; ok {
|
||||||
|
return val
|
||||||
|
}
|
||||||
|
|
||||||
|
t := &meter{name: name, opts: opts}
|
||||||
|
p.meters[key] = t
|
||||||
|
return t
|
||||||
|
}
|
||||||
|
|
||||||
|
// meter is a placeholder for a metric.Meter.
|
||||||
|
//
|
||||||
|
// All Meter functionality is forwarded to a delegate once configured.
|
||||||
|
// Otherwise, all functionality is forwarded to a NoopMeter.
|
||||||
|
type meter struct {
|
||||||
|
embedded.Meter
|
||||||
|
|
||||||
|
name string
|
||||||
|
opts []metric.MeterOption
|
||||||
|
|
||||||
|
mtx sync.Mutex
|
||||||
|
instruments []delegatedInstrument
|
||||||
|
|
||||||
|
registry list.List
|
||||||
|
|
||||||
|
delegate atomic.Value // metric.Meter
|
||||||
|
}
|
||||||
|
|
||||||
|
type delegatedInstrument interface {
|
||||||
|
setDelegate(metric.Meter)
|
||||||
|
}
|
||||||
|
|
||||||
|
// setDelegate configures m to delegate all Meter functionality to Meters
|
||||||
|
// created by provider.
|
||||||
|
//
|
||||||
|
// All subsequent calls to the Meter methods will be passed to the delegate.
|
||||||
|
//
|
||||||
|
// It is guaranteed by the caller that this happens only once.
|
||||||
|
func (m *meter) setDelegate(provider metric.MeterProvider) {
|
||||||
|
meter := provider.Meter(m.name, m.opts...)
|
||||||
|
m.delegate.Store(meter)
|
||||||
|
|
||||||
|
m.mtx.Lock()
|
||||||
|
defer m.mtx.Unlock()
|
||||||
|
|
||||||
|
for _, inst := range m.instruments {
|
||||||
|
inst.setDelegate(meter)
|
||||||
|
}
|
||||||
|
|
||||||
|
for e := m.registry.Front(); e != nil; e = e.Next() {
|
||||||
|
r := e.Value.(*registration)
|
||||||
|
r.setDelegate(meter)
|
||||||
|
m.registry.Remove(e)
|
||||||
|
}
|
||||||
|
|
||||||
|
m.instruments = nil
|
||||||
|
m.registry.Init()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *meter) Int64Counter(name string, options ...metric.Int64CounterOption) (metric.Int64Counter, error) {
|
||||||
|
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
||||||
|
return del.Int64Counter(name, options...)
|
||||||
|
}
|
||||||
|
m.mtx.Lock()
|
||||||
|
defer m.mtx.Unlock()
|
||||||
|
i := &siCounter{name: name, opts: options}
|
||||||
|
m.instruments = append(m.instruments, i)
|
||||||
|
return i, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *meter) Int64UpDownCounter(name string, options ...metric.Int64UpDownCounterOption) (metric.Int64UpDownCounter, error) {
|
||||||
|
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
||||||
|
return del.Int64UpDownCounter(name, options...)
|
||||||
|
}
|
||||||
|
m.mtx.Lock()
|
||||||
|
defer m.mtx.Unlock()
|
||||||
|
i := &siUpDownCounter{name: name, opts: options}
|
||||||
|
m.instruments = append(m.instruments, i)
|
||||||
|
return i, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *meter) Int64Histogram(name string, options ...metric.Int64HistogramOption) (metric.Int64Histogram, error) {
|
||||||
|
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
||||||
|
return del.Int64Histogram(name, options...)
|
||||||
|
}
|
||||||
|
m.mtx.Lock()
|
||||||
|
defer m.mtx.Unlock()
|
||||||
|
i := &siHistogram{name: name, opts: options}
|
||||||
|
m.instruments = append(m.instruments, i)
|
||||||
|
return i, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *meter) Int64ObservableCounter(name string, options ...metric.Int64ObservableCounterOption) (metric.Int64ObservableCounter, error) {
|
||||||
|
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
||||||
|
return del.Int64ObservableCounter(name, options...)
|
||||||
|
}
|
||||||
|
m.mtx.Lock()
|
||||||
|
defer m.mtx.Unlock()
|
||||||
|
i := &aiCounter{name: name, opts: options}
|
||||||
|
m.instruments = append(m.instruments, i)
|
||||||
|
return i, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *meter) Int64ObservableUpDownCounter(name string, options ...metric.Int64ObservableUpDownCounterOption) (metric.Int64ObservableUpDownCounter, error) {
|
||||||
|
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
||||||
|
return del.Int64ObservableUpDownCounter(name, options...)
|
||||||
|
}
|
||||||
|
m.mtx.Lock()
|
||||||
|
defer m.mtx.Unlock()
|
||||||
|
i := &aiUpDownCounter{name: name, opts: options}
|
||||||
|
m.instruments = append(m.instruments, i)
|
||||||
|
return i, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *meter) Int64ObservableGauge(name string, options ...metric.Int64ObservableGaugeOption) (metric.Int64ObservableGauge, error) {
|
||||||
|
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
||||||
|
return del.Int64ObservableGauge(name, options...)
|
||||||
|
}
|
||||||
|
m.mtx.Lock()
|
||||||
|
defer m.mtx.Unlock()
|
||||||
|
i := &aiGauge{name: name, opts: options}
|
||||||
|
m.instruments = append(m.instruments, i)
|
||||||
|
return i, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *meter) Float64Counter(name string, options ...metric.Float64CounterOption) (metric.Float64Counter, error) {
|
||||||
|
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
||||||
|
return del.Float64Counter(name, options...)
|
||||||
|
}
|
||||||
|
m.mtx.Lock()
|
||||||
|
defer m.mtx.Unlock()
|
||||||
|
i := &sfCounter{name: name, opts: options}
|
||||||
|
m.instruments = append(m.instruments, i)
|
||||||
|
return i, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *meter) Float64UpDownCounter(name string, options ...metric.Float64UpDownCounterOption) (metric.Float64UpDownCounter, error) {
|
||||||
|
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
||||||
|
return del.Float64UpDownCounter(name, options...)
|
||||||
|
}
|
||||||
|
m.mtx.Lock()
|
||||||
|
defer m.mtx.Unlock()
|
||||||
|
i := &sfUpDownCounter{name: name, opts: options}
|
||||||
|
m.instruments = append(m.instruments, i)
|
||||||
|
return i, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *meter) Float64Histogram(name string, options ...metric.Float64HistogramOption) (metric.Float64Histogram, error) {
|
||||||
|
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
||||||
|
return del.Float64Histogram(name, options...)
|
||||||
|
}
|
||||||
|
m.mtx.Lock()
|
||||||
|
defer m.mtx.Unlock()
|
||||||
|
i := &sfHistogram{name: name, opts: options}
|
||||||
|
m.instruments = append(m.instruments, i)
|
||||||
|
return i, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *meter) Float64ObservableCounter(name string, options ...metric.Float64ObservableCounterOption) (metric.Float64ObservableCounter, error) {
|
||||||
|
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
||||||
|
return del.Float64ObservableCounter(name, options...)
|
||||||
|
}
|
||||||
|
m.mtx.Lock()
|
||||||
|
defer m.mtx.Unlock()
|
||||||
|
i := &afCounter{name: name, opts: options}
|
||||||
|
m.instruments = append(m.instruments, i)
|
||||||
|
return i, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *meter) Float64ObservableUpDownCounter(name string, options ...metric.Float64ObservableUpDownCounterOption) (metric.Float64ObservableUpDownCounter, error) {
|
||||||
|
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
||||||
|
return del.Float64ObservableUpDownCounter(name, options...)
|
||||||
|
}
|
||||||
|
m.mtx.Lock()
|
||||||
|
defer m.mtx.Unlock()
|
||||||
|
i := &afUpDownCounter{name: name, opts: options}
|
||||||
|
m.instruments = append(m.instruments, i)
|
||||||
|
return i, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *meter) Float64ObservableGauge(name string, options ...metric.Float64ObservableGaugeOption) (metric.Float64ObservableGauge, error) {
|
||||||
|
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
||||||
|
return del.Float64ObservableGauge(name, options...)
|
||||||
|
}
|
||||||
|
m.mtx.Lock()
|
||||||
|
defer m.mtx.Unlock()
|
||||||
|
i := &afGauge{name: name, opts: options}
|
||||||
|
m.instruments = append(m.instruments, i)
|
||||||
|
return i, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// RegisterCallback captures the function that will be called during Collect.
|
||||||
|
func (m *meter) RegisterCallback(f metric.Callback, insts ...metric.Observable) (metric.Registration, error) {
|
||||||
|
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
||||||
|
insts = unwrapInstruments(insts)
|
||||||
|
return del.RegisterCallback(f, insts...)
|
||||||
|
}
|
||||||
|
|
||||||
|
m.mtx.Lock()
|
||||||
|
defer m.mtx.Unlock()
|
||||||
|
|
||||||
|
reg := ®istration{instruments: insts, function: f}
|
||||||
|
e := m.registry.PushBack(reg)
|
||||||
|
reg.unreg = func() error {
|
||||||
|
m.mtx.Lock()
|
||||||
|
_ = m.registry.Remove(e)
|
||||||
|
m.mtx.Unlock()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return reg, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type wrapped interface {
|
||||||
|
unwrap() metric.Observable
|
||||||
|
}
|
||||||
|
|
||||||
|
func unwrapInstruments(instruments []metric.Observable) []metric.Observable {
|
||||||
|
out := make([]metric.Observable, 0, len(instruments))
|
||||||
|
|
||||||
|
for _, inst := range instruments {
|
||||||
|
if in, ok := inst.(wrapped); ok {
|
||||||
|
out = append(out, in.unwrap())
|
||||||
|
} else {
|
||||||
|
out = append(out, inst)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
type registration struct {
|
||||||
|
embedded.Registration
|
||||||
|
|
||||||
|
instruments []metric.Observable
|
||||||
|
function metric.Callback
|
||||||
|
|
||||||
|
unreg func() error
|
||||||
|
unregMu sync.Mutex
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *registration) setDelegate(m metric.Meter) {
|
||||||
|
insts := unwrapInstruments(c.instruments)
|
||||||
|
|
||||||
|
c.unregMu.Lock()
|
||||||
|
defer c.unregMu.Unlock()
|
||||||
|
|
||||||
|
if c.unreg == nil {
|
||||||
|
// Unregister already called.
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
reg, err := m.RegisterCallback(c.function, insts...)
|
||||||
|
if err != nil {
|
||||||
|
GetErrorHandler().Handle(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
c.unreg = reg.Unregister
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *registration) Unregister() error {
|
||||||
|
c.unregMu.Lock()
|
||||||
|
defer c.unregMu.Unlock()
|
||||||
|
if c.unreg == nil {
|
||||||
|
// Unregister already called.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var err error
|
||||||
|
err, c.unreg = c.unreg(), nil
|
||||||
|
return err
|
||||||
|
}
|
||||||
+43
-2
@@ -19,6 +19,7 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/metric"
|
||||||
"go.opentelemetry.io/otel/propagation"
|
"go.opentelemetry.io/otel/propagation"
|
||||||
"go.opentelemetry.io/otel/trace"
|
"go.opentelemetry.io/otel/trace"
|
||||||
)
|
)
|
||||||
@@ -31,14 +32,20 @@ type (
|
|||||||
propagatorsHolder struct {
|
propagatorsHolder struct {
|
||||||
tm propagation.TextMapPropagator
|
tm propagation.TextMapPropagator
|
||||||
}
|
}
|
||||||
|
|
||||||
|
meterProviderHolder struct {
|
||||||
|
mp metric.MeterProvider
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
globalTracer = defaultTracerValue()
|
globalTracer = defaultTracerValue()
|
||||||
globalPropagators = defaultPropagatorsValue()
|
globalPropagators = defaultPropagatorsValue()
|
||||||
|
globalMeterProvider = defaultMeterProvider()
|
||||||
|
|
||||||
delegateTraceOnce sync.Once
|
delegateTraceOnce sync.Once
|
||||||
delegateTextMapPropagatorOnce sync.Once
|
delegateTextMapPropagatorOnce sync.Once
|
||||||
|
delegateMeterOnce sync.Once
|
||||||
)
|
)
|
||||||
|
|
||||||
// TracerProvider is the internal implementation for global.TracerProvider.
|
// TracerProvider is the internal implementation for global.TracerProvider.
|
||||||
@@ -102,6 +109,34 @@ func SetTextMapPropagator(p propagation.TextMapPropagator) {
|
|||||||
globalPropagators.Store(propagatorsHolder{tm: p})
|
globalPropagators.Store(propagatorsHolder{tm: p})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MeterProvider is the internal implementation for global.MeterProvider.
|
||||||
|
func MeterProvider() metric.MeterProvider {
|
||||||
|
return globalMeterProvider.Load().(meterProviderHolder).mp
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetMeterProvider is the internal implementation for global.SetMeterProvider.
|
||||||
|
func SetMeterProvider(mp metric.MeterProvider) {
|
||||||
|
current := MeterProvider()
|
||||||
|
if _, cOk := current.(*meterProvider); cOk {
|
||||||
|
if _, mpOk := mp.(*meterProvider); mpOk && current == mp {
|
||||||
|
// Do not assign the default delegating MeterProvider to delegate
|
||||||
|
// to itself.
|
||||||
|
Error(
|
||||||
|
errors.New("no delegate configured in meter provider"),
|
||||||
|
"Setting meter provider to it's current value. No delegate will be configured",
|
||||||
|
)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delegateMeterOnce.Do(func() {
|
||||||
|
if def, ok := current.(*meterProvider); ok {
|
||||||
|
def.setDelegate(mp)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
globalMeterProvider.Store(meterProviderHolder{mp: mp})
|
||||||
|
}
|
||||||
|
|
||||||
func defaultTracerValue() *atomic.Value {
|
func defaultTracerValue() *atomic.Value {
|
||||||
v := &atomic.Value{}
|
v := &atomic.Value{}
|
||||||
v.Store(tracerProviderHolder{tp: &tracerProvider{}})
|
v.Store(tracerProviderHolder{tp: &tracerProvider{}})
|
||||||
@@ -113,3 +148,9 @@ func defaultPropagatorsValue() *atomic.Value {
|
|||||||
v.Store(propagatorsHolder{tm: newTextMapPropagator()})
|
v.Store(propagatorsHolder{tm: newTextMapPropagator()})
|
||||||
return v
|
return v
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func defaultMeterProvider() *atomic.Value {
|
||||||
|
v := &atomic.Value{}
|
||||||
|
v.Store(meterProviderHolder{mp: &meterProvider{}})
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
|||||||
+53
@@ -0,0 +1,53 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package otel // import "go.opentelemetry.io/otel"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"go.opentelemetry.io/otel/internal/global"
|
||||||
|
"go.opentelemetry.io/otel/metric"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Meter returns a Meter from the global MeterProvider. The name must be the
|
||||||
|
// name of the library providing instrumentation. This name may be the same as
|
||||||
|
// the instrumented code only if that code provides built-in instrumentation.
|
||||||
|
// If the name is empty, then a implementation defined default name will be
|
||||||
|
// used instead.
|
||||||
|
//
|
||||||
|
// If this is called before a global MeterProvider is registered the returned
|
||||||
|
// Meter will be a No-op implementation of a Meter. When a global MeterProvider
|
||||||
|
// is registered for the first time, the returned Meter, and all the
|
||||||
|
// instruments it has created or will create, are recreated automatically from
|
||||||
|
// the new MeterProvider.
|
||||||
|
//
|
||||||
|
// This is short for GetMeterProvider().Meter(name).
|
||||||
|
func Meter(name string, opts ...metric.MeterOption) metric.Meter {
|
||||||
|
return GetMeterProvider().Meter(name, opts...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetMeterProvider returns the registered global meter provider.
|
||||||
|
//
|
||||||
|
// If no global GetMeterProvider has been registered, a No-op GetMeterProvider
|
||||||
|
// implementation is returned. When a global GetMeterProvider is registered for
|
||||||
|
// the first time, the returned GetMeterProvider, and all the Meters it has
|
||||||
|
// created or will create, are recreated automatically from the new
|
||||||
|
// GetMeterProvider.
|
||||||
|
func GetMeterProvider() metric.MeterProvider {
|
||||||
|
return global.MeterProvider()
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetMeterProvider registers mp as the global MeterProvider.
|
||||||
|
func SetMeterProvider(mp metric.MeterProvider) {
|
||||||
|
global.SetMeterProvider(mp)
|
||||||
|
}
|
||||||
+201
@@ -0,0 +1,201 @@
|
|||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
+271
@@ -0,0 +1,271 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package metric // import "go.opentelemetry.io/otel/metric"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/metric/embedded"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Float64Observable describes a set of instruments used asynchronously to
|
||||||
|
// record float64 measurements once per collection cycle. Observations of
|
||||||
|
// these instruments are only made within a callback.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases.
|
||||||
|
type Float64Observable interface {
|
||||||
|
Observable
|
||||||
|
|
||||||
|
float64Observable()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64ObservableCounter is an instrument used to asynchronously record
|
||||||
|
// increasing float64 measurements once per collection cycle. Observations are
|
||||||
|
// only made within a callback for this instrument. The value observed is
|
||||||
|
// assumed the to be the cumulative sum of the count.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for
|
||||||
|
// unimplemented methods.
|
||||||
|
type Float64ObservableCounter interface {
|
||||||
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
|
// by implementations of this interface. See the "API Implementations"
|
||||||
|
// section of the package documentation for more information.
|
||||||
|
embedded.Float64ObservableCounter
|
||||||
|
|
||||||
|
Float64Observable
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64ObservableCounterConfig contains options for asynchronous counter
|
||||||
|
// instruments that record int64 values.
|
||||||
|
type Float64ObservableCounterConfig struct {
|
||||||
|
description string
|
||||||
|
unit string
|
||||||
|
callbacks []Float64Callback
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewFloat64ObservableCounterConfig returns a new
|
||||||
|
// [Float64ObservableCounterConfig] with all opts applied.
|
||||||
|
func NewFloat64ObservableCounterConfig(opts ...Float64ObservableCounterOption) Float64ObservableCounterConfig {
|
||||||
|
var config Float64ObservableCounterConfig
|
||||||
|
for _, o := range opts {
|
||||||
|
config = o.applyFloat64ObservableCounter(config)
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
// Description returns the configured description.
|
||||||
|
func (c Float64ObservableCounterConfig) Description() string {
|
||||||
|
return c.description
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unit returns the configured unit.
|
||||||
|
func (c Float64ObservableCounterConfig) Unit() string {
|
||||||
|
return c.unit
|
||||||
|
}
|
||||||
|
|
||||||
|
// Callbacks returns the configured callbacks.
|
||||||
|
func (c Float64ObservableCounterConfig) Callbacks() []Float64Callback {
|
||||||
|
return c.callbacks
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64ObservableCounterOption applies options to a
|
||||||
|
// [Float64ObservableCounterConfig]. See [Float64ObservableOption] and
|
||||||
|
// [InstrumentOption] for other options that can be used as a
|
||||||
|
// Float64ObservableCounterOption.
|
||||||
|
type Float64ObservableCounterOption interface {
|
||||||
|
applyFloat64ObservableCounter(Float64ObservableCounterConfig) Float64ObservableCounterConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64ObservableUpDownCounter is an instrument used to asynchronously
|
||||||
|
// record float64 measurements once per collection cycle. Observations are only
|
||||||
|
// made within a callback for this instrument. The value observed is assumed
|
||||||
|
// the to be the cumulative sum of the count.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for unimplemented methods.
|
||||||
|
type Float64ObservableUpDownCounter interface {
|
||||||
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
|
// by implementations of this interface. See the "API Implementations"
|
||||||
|
// section of the package documentation for more information.
|
||||||
|
embedded.Float64ObservableUpDownCounter
|
||||||
|
|
||||||
|
Float64Observable
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64ObservableUpDownCounterConfig contains options for asynchronous
|
||||||
|
// counter instruments that record int64 values.
|
||||||
|
type Float64ObservableUpDownCounterConfig struct {
|
||||||
|
description string
|
||||||
|
unit string
|
||||||
|
callbacks []Float64Callback
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewFloat64ObservableUpDownCounterConfig returns a new
|
||||||
|
// [Float64ObservableUpDownCounterConfig] with all opts applied.
|
||||||
|
func NewFloat64ObservableUpDownCounterConfig(opts ...Float64ObservableUpDownCounterOption) Float64ObservableUpDownCounterConfig {
|
||||||
|
var config Float64ObservableUpDownCounterConfig
|
||||||
|
for _, o := range opts {
|
||||||
|
config = o.applyFloat64ObservableUpDownCounter(config)
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
// Description returns the configured description.
|
||||||
|
func (c Float64ObservableUpDownCounterConfig) Description() string {
|
||||||
|
return c.description
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unit returns the configured unit.
|
||||||
|
func (c Float64ObservableUpDownCounterConfig) Unit() string {
|
||||||
|
return c.unit
|
||||||
|
}
|
||||||
|
|
||||||
|
// Callbacks returns the configured callbacks.
|
||||||
|
func (c Float64ObservableUpDownCounterConfig) Callbacks() []Float64Callback {
|
||||||
|
return c.callbacks
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64ObservableUpDownCounterOption applies options to a
|
||||||
|
// [Float64ObservableUpDownCounterConfig]. See [Float64ObservableOption] and
|
||||||
|
// [InstrumentOption] for other options that can be used as a
|
||||||
|
// Float64ObservableUpDownCounterOption.
|
||||||
|
type Float64ObservableUpDownCounterOption interface {
|
||||||
|
applyFloat64ObservableUpDownCounter(Float64ObservableUpDownCounterConfig) Float64ObservableUpDownCounterConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64ObservableGauge is an instrument used to asynchronously record
|
||||||
|
// instantaneous float64 measurements once per collection cycle. Observations
|
||||||
|
// are only made within a callback for this instrument.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for unimplemented methods.
|
||||||
|
type Float64ObservableGauge interface {
|
||||||
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
|
// by implementations of this interface. See the "API Implementations"
|
||||||
|
// section of the package documentation for more information.
|
||||||
|
embedded.Float64ObservableGauge
|
||||||
|
|
||||||
|
Float64Observable
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64ObservableGaugeConfig contains options for asynchronous counter
|
||||||
|
// instruments that record int64 values.
|
||||||
|
type Float64ObservableGaugeConfig struct {
|
||||||
|
description string
|
||||||
|
unit string
|
||||||
|
callbacks []Float64Callback
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewFloat64ObservableGaugeConfig returns a new [Float64ObservableGaugeConfig]
|
||||||
|
// with all opts applied.
|
||||||
|
func NewFloat64ObservableGaugeConfig(opts ...Float64ObservableGaugeOption) Float64ObservableGaugeConfig {
|
||||||
|
var config Float64ObservableGaugeConfig
|
||||||
|
for _, o := range opts {
|
||||||
|
config = o.applyFloat64ObservableGauge(config)
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
// Description returns the configured description.
|
||||||
|
func (c Float64ObservableGaugeConfig) Description() string {
|
||||||
|
return c.description
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unit returns the configured unit.
|
||||||
|
func (c Float64ObservableGaugeConfig) Unit() string {
|
||||||
|
return c.unit
|
||||||
|
}
|
||||||
|
|
||||||
|
// Callbacks returns the configured callbacks.
|
||||||
|
func (c Float64ObservableGaugeConfig) Callbacks() []Float64Callback {
|
||||||
|
return c.callbacks
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64ObservableGaugeOption applies options to a
|
||||||
|
// [Float64ObservableGaugeConfig]. See [Float64ObservableOption] and
|
||||||
|
// [InstrumentOption] for other options that can be used as a
|
||||||
|
// Float64ObservableGaugeOption.
|
||||||
|
type Float64ObservableGaugeOption interface {
|
||||||
|
applyFloat64ObservableGauge(Float64ObservableGaugeConfig) Float64ObservableGaugeConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64Observer is a recorder of float64 measurements.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for unimplemented methods.
|
||||||
|
type Float64Observer interface {
|
||||||
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
|
// by implementations of this interface. See the "API Implementations"
|
||||||
|
// section of the package documentation for more information.
|
||||||
|
embedded.Float64Observer
|
||||||
|
|
||||||
|
// Observe records the float64 value.
|
||||||
|
//
|
||||||
|
// Use the WithAttributeSet (or, if performance is not a concern,
|
||||||
|
// the WithAttributes) option to include measurement attributes.
|
||||||
|
Observe(value float64, options ...ObserveOption)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64Callback is a function registered with a Meter that makes
|
||||||
|
// observations for a Float64Observerable instrument it is registered with.
|
||||||
|
// Calls to the Float64Observer record measurement values for the
|
||||||
|
// Float64Observable.
|
||||||
|
//
|
||||||
|
// The function needs to complete in a finite amount of time and the deadline
|
||||||
|
// of the passed context is expected to be honored.
|
||||||
|
//
|
||||||
|
// The function needs to make unique observations across all registered
|
||||||
|
// Float64Callbacks. Meaning, it should not report measurements with the same
|
||||||
|
// attributes as another Float64Callbacks also registered for the same
|
||||||
|
// instrument.
|
||||||
|
//
|
||||||
|
// The function needs to be concurrent safe.
|
||||||
|
type Float64Callback func(context.Context, Float64Observer) error
|
||||||
|
|
||||||
|
// Float64ObservableOption applies options to float64 Observer instruments.
|
||||||
|
type Float64ObservableOption interface {
|
||||||
|
Float64ObservableCounterOption
|
||||||
|
Float64ObservableUpDownCounterOption
|
||||||
|
Float64ObservableGaugeOption
|
||||||
|
}
|
||||||
|
|
||||||
|
type float64CallbackOpt struct {
|
||||||
|
cback Float64Callback
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o float64CallbackOpt) applyFloat64ObservableCounter(cfg Float64ObservableCounterConfig) Float64ObservableCounterConfig {
|
||||||
|
cfg.callbacks = append(cfg.callbacks, o.cback)
|
||||||
|
return cfg
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o float64CallbackOpt) applyFloat64ObservableUpDownCounter(cfg Float64ObservableUpDownCounterConfig) Float64ObservableUpDownCounterConfig {
|
||||||
|
cfg.callbacks = append(cfg.callbacks, o.cback)
|
||||||
|
return cfg
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o float64CallbackOpt) applyFloat64ObservableGauge(cfg Float64ObservableGaugeConfig) Float64ObservableGaugeConfig {
|
||||||
|
cfg.callbacks = append(cfg.callbacks, o.cback)
|
||||||
|
return cfg
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithFloat64Callback adds callback to be called for an instrument.
|
||||||
|
func WithFloat64Callback(callback Float64Callback) Float64ObservableOption {
|
||||||
|
return float64CallbackOpt{callback}
|
||||||
|
}
|
||||||
+269
@@ -0,0 +1,269 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package metric // import "go.opentelemetry.io/otel/metric"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/metric/embedded"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Int64Observable describes a set of instruments used asynchronously to record
|
||||||
|
// int64 measurements once per collection cycle. Observations of these
|
||||||
|
// instruments are only made within a callback.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases.
|
||||||
|
type Int64Observable interface {
|
||||||
|
Observable
|
||||||
|
|
||||||
|
int64Observable()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64ObservableCounter is an instrument used to asynchronously record
|
||||||
|
// increasing int64 measurements once per collection cycle. Observations are
|
||||||
|
// only made within a callback for this instrument. The value observed is
|
||||||
|
// assumed the to be the cumulative sum of the count.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for unimplemented methods.
|
||||||
|
type Int64ObservableCounter interface {
|
||||||
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
|
// by implementations of this interface. See the "API Implementations"
|
||||||
|
// section of the package documentation for more information.
|
||||||
|
embedded.Int64ObservableCounter
|
||||||
|
|
||||||
|
Int64Observable
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64ObservableCounterConfig contains options for asynchronous counter
|
||||||
|
// instruments that record int64 values.
|
||||||
|
type Int64ObservableCounterConfig struct {
|
||||||
|
description string
|
||||||
|
unit string
|
||||||
|
callbacks []Int64Callback
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewInt64ObservableCounterConfig returns a new [Int64ObservableCounterConfig]
|
||||||
|
// with all opts applied.
|
||||||
|
func NewInt64ObservableCounterConfig(opts ...Int64ObservableCounterOption) Int64ObservableCounterConfig {
|
||||||
|
var config Int64ObservableCounterConfig
|
||||||
|
for _, o := range opts {
|
||||||
|
config = o.applyInt64ObservableCounter(config)
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
// Description returns the configured description.
|
||||||
|
func (c Int64ObservableCounterConfig) Description() string {
|
||||||
|
return c.description
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unit returns the configured unit.
|
||||||
|
func (c Int64ObservableCounterConfig) Unit() string {
|
||||||
|
return c.unit
|
||||||
|
}
|
||||||
|
|
||||||
|
// Callbacks returns the configured callbacks.
|
||||||
|
func (c Int64ObservableCounterConfig) Callbacks() []Int64Callback {
|
||||||
|
return c.callbacks
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64ObservableCounterOption applies options to a
|
||||||
|
// [Int64ObservableCounterConfig]. See [Int64ObservableOption] and
|
||||||
|
// [InstrumentOption] for other options that can be used as an
|
||||||
|
// Int64ObservableCounterOption.
|
||||||
|
type Int64ObservableCounterOption interface {
|
||||||
|
applyInt64ObservableCounter(Int64ObservableCounterConfig) Int64ObservableCounterConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64ObservableUpDownCounter is an instrument used to asynchronously record
|
||||||
|
// int64 measurements once per collection cycle. Observations are only made
|
||||||
|
// within a callback for this instrument. The value observed is assumed the to
|
||||||
|
// be the cumulative sum of the count.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for unimplemented methods.
|
||||||
|
type Int64ObservableUpDownCounter interface {
|
||||||
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
|
// by implementations of this interface. See the "API Implementations"
|
||||||
|
// section of the package documentation for more information.
|
||||||
|
embedded.Int64ObservableUpDownCounter
|
||||||
|
|
||||||
|
Int64Observable
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64ObservableUpDownCounterConfig contains options for asynchronous counter
|
||||||
|
// instruments that record int64 values.
|
||||||
|
type Int64ObservableUpDownCounterConfig struct {
|
||||||
|
description string
|
||||||
|
unit string
|
||||||
|
callbacks []Int64Callback
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewInt64ObservableUpDownCounterConfig returns a new
|
||||||
|
// [Int64ObservableUpDownCounterConfig] with all opts applied.
|
||||||
|
func NewInt64ObservableUpDownCounterConfig(opts ...Int64ObservableUpDownCounterOption) Int64ObservableUpDownCounterConfig {
|
||||||
|
var config Int64ObservableUpDownCounterConfig
|
||||||
|
for _, o := range opts {
|
||||||
|
config = o.applyInt64ObservableUpDownCounter(config)
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
// Description returns the configured description.
|
||||||
|
func (c Int64ObservableUpDownCounterConfig) Description() string {
|
||||||
|
return c.description
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unit returns the configured unit.
|
||||||
|
func (c Int64ObservableUpDownCounterConfig) Unit() string {
|
||||||
|
return c.unit
|
||||||
|
}
|
||||||
|
|
||||||
|
// Callbacks returns the configured callbacks.
|
||||||
|
func (c Int64ObservableUpDownCounterConfig) Callbacks() []Int64Callback {
|
||||||
|
return c.callbacks
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64ObservableUpDownCounterOption applies options to a
|
||||||
|
// [Int64ObservableUpDownCounterConfig]. See [Int64ObservableOption] and
|
||||||
|
// [InstrumentOption] for other options that can be used as an
|
||||||
|
// Int64ObservableUpDownCounterOption.
|
||||||
|
type Int64ObservableUpDownCounterOption interface {
|
||||||
|
applyInt64ObservableUpDownCounter(Int64ObservableUpDownCounterConfig) Int64ObservableUpDownCounterConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64ObservableGauge is an instrument used to asynchronously record
|
||||||
|
// instantaneous int64 measurements once per collection cycle. Observations are
|
||||||
|
// only made within a callback for this instrument.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for unimplemented methods.
|
||||||
|
type Int64ObservableGauge interface {
|
||||||
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
|
// by implementations of this interface. See the "API Implementations"
|
||||||
|
// section of the package documentation for more information.
|
||||||
|
embedded.Int64ObservableGauge
|
||||||
|
|
||||||
|
Int64Observable
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64ObservableGaugeConfig contains options for asynchronous counter
|
||||||
|
// instruments that record int64 values.
|
||||||
|
type Int64ObservableGaugeConfig struct {
|
||||||
|
description string
|
||||||
|
unit string
|
||||||
|
callbacks []Int64Callback
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewInt64ObservableGaugeConfig returns a new [Int64ObservableGaugeConfig]
|
||||||
|
// with all opts applied.
|
||||||
|
func NewInt64ObservableGaugeConfig(opts ...Int64ObservableGaugeOption) Int64ObservableGaugeConfig {
|
||||||
|
var config Int64ObservableGaugeConfig
|
||||||
|
for _, o := range opts {
|
||||||
|
config = o.applyInt64ObservableGauge(config)
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
// Description returns the configured description.
|
||||||
|
func (c Int64ObservableGaugeConfig) Description() string {
|
||||||
|
return c.description
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unit returns the configured unit.
|
||||||
|
func (c Int64ObservableGaugeConfig) Unit() string {
|
||||||
|
return c.unit
|
||||||
|
}
|
||||||
|
|
||||||
|
// Callbacks returns the configured callbacks.
|
||||||
|
func (c Int64ObservableGaugeConfig) Callbacks() []Int64Callback {
|
||||||
|
return c.callbacks
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64ObservableGaugeOption applies options to a
|
||||||
|
// [Int64ObservableGaugeConfig]. See [Int64ObservableOption] and
|
||||||
|
// [InstrumentOption] for other options that can be used as an
|
||||||
|
// Int64ObservableGaugeOption.
|
||||||
|
type Int64ObservableGaugeOption interface {
|
||||||
|
applyInt64ObservableGauge(Int64ObservableGaugeConfig) Int64ObservableGaugeConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64Observer is a recorder of int64 measurements.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for unimplemented methods.
|
||||||
|
type Int64Observer interface {
|
||||||
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
|
// by implementations of this interface. See the "API Implementations"
|
||||||
|
// section of the package documentation for more information.
|
||||||
|
embedded.Int64Observer
|
||||||
|
|
||||||
|
// Observe records the int64 value.
|
||||||
|
//
|
||||||
|
// Use the WithAttributeSet (or, if performance is not a concern,
|
||||||
|
// the WithAttributes) option to include measurement attributes.
|
||||||
|
Observe(value int64, options ...ObserveOption)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64Callback is a function registered with a Meter that makes observations
|
||||||
|
// for an Int64Observerable instrument it is registered with. Calls to the
|
||||||
|
// Int64Observer record measurement values for the Int64Observable.
|
||||||
|
//
|
||||||
|
// The function needs to complete in a finite amount of time and the deadline
|
||||||
|
// of the passed context is expected to be honored.
|
||||||
|
//
|
||||||
|
// The function needs to make unique observations across all registered
|
||||||
|
// Int64Callbacks. Meaning, it should not report measurements with the same
|
||||||
|
// attributes as another Int64Callbacks also registered for the same
|
||||||
|
// instrument.
|
||||||
|
//
|
||||||
|
// The function needs to be concurrent safe.
|
||||||
|
type Int64Callback func(context.Context, Int64Observer) error
|
||||||
|
|
||||||
|
// Int64ObservableOption applies options to int64 Observer instruments.
|
||||||
|
type Int64ObservableOption interface {
|
||||||
|
Int64ObservableCounterOption
|
||||||
|
Int64ObservableUpDownCounterOption
|
||||||
|
Int64ObservableGaugeOption
|
||||||
|
}
|
||||||
|
|
||||||
|
type int64CallbackOpt struct {
|
||||||
|
cback Int64Callback
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o int64CallbackOpt) applyInt64ObservableCounter(cfg Int64ObservableCounterConfig) Int64ObservableCounterConfig {
|
||||||
|
cfg.callbacks = append(cfg.callbacks, o.cback)
|
||||||
|
return cfg
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o int64CallbackOpt) applyInt64ObservableUpDownCounter(cfg Int64ObservableUpDownCounterConfig) Int64ObservableUpDownCounterConfig {
|
||||||
|
cfg.callbacks = append(cfg.callbacks, o.cback)
|
||||||
|
return cfg
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o int64CallbackOpt) applyInt64ObservableGauge(cfg Int64ObservableGaugeConfig) Int64ObservableGaugeConfig {
|
||||||
|
cfg.callbacks = append(cfg.callbacks, o.cback)
|
||||||
|
return cfg
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithInt64Callback adds callback to be called for an instrument.
|
||||||
|
func WithInt64Callback(callback Int64Callback) Int64ObservableOption {
|
||||||
|
return int64CallbackOpt{callback}
|
||||||
|
}
|
||||||
+92
@@ -0,0 +1,92 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package metric // import "go.opentelemetry.io/otel/metric"
|
||||||
|
|
||||||
|
import "go.opentelemetry.io/otel/attribute"
|
||||||
|
|
||||||
|
// MeterConfig contains options for Meters.
|
||||||
|
type MeterConfig struct {
|
||||||
|
instrumentationVersion string
|
||||||
|
schemaURL string
|
||||||
|
attrs attribute.Set
|
||||||
|
|
||||||
|
// Ensure forward compatibility by explicitly making this not comparable.
|
||||||
|
noCmp [0]func() //nolint: unused // This is indeed used.
|
||||||
|
}
|
||||||
|
|
||||||
|
// InstrumentationVersion returns the version of the library providing
|
||||||
|
// instrumentation.
|
||||||
|
func (cfg MeterConfig) InstrumentationVersion() string {
|
||||||
|
return cfg.instrumentationVersion
|
||||||
|
}
|
||||||
|
|
||||||
|
// InstrumentationAttributes returns the attributes associated with the library
|
||||||
|
// providing instrumentation.
|
||||||
|
func (cfg MeterConfig) InstrumentationAttributes() attribute.Set {
|
||||||
|
return cfg.attrs
|
||||||
|
}
|
||||||
|
|
||||||
|
// SchemaURL is the schema_url of the library providing instrumentation.
|
||||||
|
func (cfg MeterConfig) SchemaURL() string {
|
||||||
|
return cfg.schemaURL
|
||||||
|
}
|
||||||
|
|
||||||
|
// MeterOption is an interface for applying Meter options.
|
||||||
|
type MeterOption interface {
|
||||||
|
// applyMeter is used to set a MeterOption value of a MeterConfig.
|
||||||
|
applyMeter(MeterConfig) MeterConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewMeterConfig creates a new MeterConfig and applies
|
||||||
|
// all the given options.
|
||||||
|
func NewMeterConfig(opts ...MeterOption) MeterConfig {
|
||||||
|
var config MeterConfig
|
||||||
|
for _, o := range opts {
|
||||||
|
config = o.applyMeter(config)
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
type meterOptionFunc func(MeterConfig) MeterConfig
|
||||||
|
|
||||||
|
func (fn meterOptionFunc) applyMeter(cfg MeterConfig) MeterConfig {
|
||||||
|
return fn(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithInstrumentationVersion sets the instrumentation version.
|
||||||
|
func WithInstrumentationVersion(version string) MeterOption {
|
||||||
|
return meterOptionFunc(func(config MeterConfig) MeterConfig {
|
||||||
|
config.instrumentationVersion = version
|
||||||
|
return config
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithInstrumentationAttributes sets the instrumentation attributes.
|
||||||
|
//
|
||||||
|
// The passed attributes will be de-duplicated.
|
||||||
|
func WithInstrumentationAttributes(attr ...attribute.KeyValue) MeterOption {
|
||||||
|
return meterOptionFunc(func(config MeterConfig) MeterConfig {
|
||||||
|
config.attrs = attribute.NewSet(attr...)
|
||||||
|
return config
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithSchemaURL sets the schema URL.
|
||||||
|
func WithSchemaURL(schemaURL string) MeterOption {
|
||||||
|
return meterOptionFunc(func(config MeterConfig) MeterConfig {
|
||||||
|
config.schemaURL = schemaURL
|
||||||
|
return config
|
||||||
|
})
|
||||||
|
}
|
||||||
+170
@@ -0,0 +1,170 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
/*
|
||||||
|
Package metric provides the OpenTelemetry API used to measure metrics about
|
||||||
|
source code operation.
|
||||||
|
|
||||||
|
This API is separate from its implementation so the instrumentation built from
|
||||||
|
it is reusable. See [go.opentelemetry.io/otel/sdk/metric] for the official
|
||||||
|
OpenTelemetry implementation of this API.
|
||||||
|
|
||||||
|
All measurements made with this package are made via instruments. These
|
||||||
|
instruments are created by a [Meter] which itself is created by a
|
||||||
|
[MeterProvider]. Applications need to accept a [MeterProvider] implementation
|
||||||
|
as a starting point when instrumenting. This can be done directly, or by using
|
||||||
|
the OpenTelemetry global MeterProvider via [GetMeterProvider]. Using an
|
||||||
|
appropriately named [Meter] from the accepted [MeterProvider], instrumentation
|
||||||
|
can then be built from the [Meter]'s instruments.
|
||||||
|
|
||||||
|
# Instruments
|
||||||
|
|
||||||
|
Each instrument is designed to make measurements of a particular type. Broadly,
|
||||||
|
all instruments fall into two overlapping logical categories: asynchronous or
|
||||||
|
synchronous, and int64 or float64.
|
||||||
|
|
||||||
|
All synchronous instruments ([Int64Counter], [Int64UpDownCounter],
|
||||||
|
[Int64Histogram], [Float64Counter], [Float64UpDownCounter], and
|
||||||
|
[Float64Histogram]) are used to measure the operation and performance of source
|
||||||
|
code during the source code execution. These instruments only make measurements
|
||||||
|
when the source code they instrument is run.
|
||||||
|
|
||||||
|
All asynchronous instruments ([Int64ObservableCounter],
|
||||||
|
[Int64ObservableUpDownCounter], [Int64ObservableGauge],
|
||||||
|
[Float64ObservableCounter], [Float64ObservableUpDownCounter], and
|
||||||
|
[Float64ObservableGauge]) are used to measure metrics outside of the execution
|
||||||
|
of source code. They are said to make "observations" via a callback function
|
||||||
|
called once every measurement collection cycle.
|
||||||
|
|
||||||
|
Each instrument is also grouped by the value type it measures. Either int64 or
|
||||||
|
float64. The value being measured will dictate which instrument in these
|
||||||
|
categories to use.
|
||||||
|
|
||||||
|
Outside of these two broad categories, instruments are described by the
|
||||||
|
function they are designed to serve. All Counters ([Int64Counter],
|
||||||
|
[Float64Counter], [Int64ObservableCounter], and [Float64ObservableCounter]) are
|
||||||
|
designed to measure values that never decrease in value, but instead only
|
||||||
|
incrementally increase in value. UpDownCounters ([Int64UpDownCounter],
|
||||||
|
[Float64UpDownCounter], [Int64ObservableUpDownCounter], and
|
||||||
|
[Float64ObservableUpDownCounter]) on the other hand, are designed to measure
|
||||||
|
values that can increase and decrease. When more information needs to be
|
||||||
|
conveyed about all the synchronous measurements made during a collection cycle,
|
||||||
|
a Histogram ([Int64Histogram] and [Float64Histogram]) should be used. Finally,
|
||||||
|
when just the most recent measurement needs to be conveyed about an
|
||||||
|
asynchronous measurement, a Gauge ([Int64ObservableGauge] and
|
||||||
|
[Float64ObservableGauge]) should be used.
|
||||||
|
|
||||||
|
See the [OpenTelemetry documentation] for more information about instruments
|
||||||
|
and their intended use.
|
||||||
|
|
||||||
|
# Measurements
|
||||||
|
|
||||||
|
Measurements are made by recording values and information about the values with
|
||||||
|
an instrument. How these measurements are recorded depends on the instrument.
|
||||||
|
|
||||||
|
Measurements for synchronous instruments ([Int64Counter], [Int64UpDownCounter],
|
||||||
|
[Int64Histogram], [Float64Counter], [Float64UpDownCounter], and
|
||||||
|
[Float64Histogram]) are recorded using the instrument methods directly. All
|
||||||
|
counter instruments have an Add method that is used to measure an increment
|
||||||
|
value, and all histogram instruments have a Record method to measure a data
|
||||||
|
point.
|
||||||
|
|
||||||
|
Asynchronous instruments ([Int64ObservableCounter],
|
||||||
|
[Int64ObservableUpDownCounter], [Int64ObservableGauge],
|
||||||
|
[Float64ObservableCounter], [Float64ObservableUpDownCounter], and
|
||||||
|
[Float64ObservableGauge]) record measurements within a callback function. The
|
||||||
|
callback is registered with the Meter which ensures the callback is called once
|
||||||
|
per collection cycle. A callback can be registered two ways: during the
|
||||||
|
instrument's creation using an option, or later using the RegisterCallback
|
||||||
|
method of the [Meter] that created the instrument.
|
||||||
|
|
||||||
|
If the following criteria are met, an option ([WithInt64Callback] or
|
||||||
|
[WithFloat64Callback]) can be used during the asynchronous instrument's
|
||||||
|
creation to register a callback ([Int64Callback] or [Float64Callback],
|
||||||
|
respectively):
|
||||||
|
|
||||||
|
- The measurement process is known when the instrument is created
|
||||||
|
- Only that instrument will make a measurement within the callback
|
||||||
|
- The callback never needs to be unregistered
|
||||||
|
|
||||||
|
If the criteria are not met, use the RegisterCallback method of the [Meter] that
|
||||||
|
created the instrument to register a [Callback].
|
||||||
|
|
||||||
|
# API Implementations
|
||||||
|
|
||||||
|
This package does not conform to the standard Go versioning policy, all of its
|
||||||
|
interfaces may have methods added to them without a package major version bump.
|
||||||
|
This non-standard API evolution could surprise an uninformed implementation
|
||||||
|
author. They could unknowingly build their implementation in a way that would
|
||||||
|
result in a runtime panic for their users that update to the new API.
|
||||||
|
|
||||||
|
The API is designed to help inform an instrumentation author about this
|
||||||
|
non-standard API evolution. It requires them to choose a default behavior for
|
||||||
|
unimplemented interface methods. There are three behavior choices they can
|
||||||
|
make:
|
||||||
|
|
||||||
|
- Compilation failure
|
||||||
|
- Panic
|
||||||
|
- Default to another implementation
|
||||||
|
|
||||||
|
All interfaces in this API embed a corresponding interface from
|
||||||
|
[go.opentelemetry.io/otel/metric/embedded]. If an author wants the default
|
||||||
|
behavior of their implementations to be a compilation failure, signaling to
|
||||||
|
their users they need to update to the latest version of that implementation,
|
||||||
|
they need to embed the corresponding interface from
|
||||||
|
[go.opentelemetry.io/otel/metric/embedded] in their implementation. For
|
||||||
|
example,
|
||||||
|
|
||||||
|
import "go.opentelemetry.io/otel/metric/embedded"
|
||||||
|
|
||||||
|
type MeterProvider struct {
|
||||||
|
embedded.MeterProvider
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
|
||||||
|
If an author wants the default behavior of their implementations to a panic,
|
||||||
|
they need to embed the API interface directly.
|
||||||
|
|
||||||
|
import "go.opentelemetry.io/otel/metric"
|
||||||
|
|
||||||
|
type MeterProvider struct {
|
||||||
|
metric.MeterProvider
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
|
||||||
|
This is not a recommended behavior as it could lead to publishing packages that
|
||||||
|
contain runtime panics when users update other package that use newer versions
|
||||||
|
of [go.opentelemetry.io/otel/metric].
|
||||||
|
|
||||||
|
Finally, an author can embed another implementation in theirs. The embedded
|
||||||
|
implementation will be used for methods not defined by the author. For example,
|
||||||
|
an author who want to default to silently dropping the call can use
|
||||||
|
[go.opentelemetry.io/otel/metric/noop]:
|
||||||
|
|
||||||
|
import "go.opentelemetry.io/otel/metric/noop"
|
||||||
|
|
||||||
|
type MeterProvider struct {
|
||||||
|
noop.MeterProvider
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
|
||||||
|
It is strongly recommended that authors only embed
|
||||||
|
[go.opentelemetry.io/otel/metric/noop] if they choose this default behavior.
|
||||||
|
That implementation is the only one OpenTelemetry authors can guarantee will
|
||||||
|
fully implement all the API interfaces when a user updates their API.
|
||||||
|
|
||||||
|
[OpenTelemetry documentation]: https://opentelemetry.io/docs/concepts/signals/metrics/
|
||||||
|
[GetMeterProvider]: https://pkg.go.dev/go.opentelemetry.io/otel#GetMeterProvider
|
||||||
|
*/
|
||||||
|
package metric // import "go.opentelemetry.io/otel/metric"
|
||||||
+234
@@ -0,0 +1,234 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
// Package embedded provides interfaces embedded within the [OpenTelemetry
|
||||||
|
// metric API].
|
||||||
|
//
|
||||||
|
// Implementers of the [OpenTelemetry metric API] can embed the relevant type
|
||||||
|
// from this package into their implementation directly. Doing so will result
|
||||||
|
// in a compilation error for users when the [OpenTelemetry metric API] is
|
||||||
|
// extended (which is something that can happen without a major version bump of
|
||||||
|
// the API package).
|
||||||
|
//
|
||||||
|
// [OpenTelemetry metric API]: https://pkg.go.dev/go.opentelemetry.io/otel/metric
|
||||||
|
package embedded // import "go.opentelemetry.io/otel/metric/embedded"
|
||||||
|
|
||||||
|
// MeterProvider is embedded in
|
||||||
|
// [go.opentelemetry.io/otel/metric.MeterProvider].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.MeterProvider] if you want users to
|
||||||
|
// experience a compilation error, signaling they need to update to your latest
|
||||||
|
// implementation, when the [go.opentelemetry.io/otel/metric.MeterProvider]
|
||||||
|
// interface is extended (which is something that can happen without a major
|
||||||
|
// version bump of the API package).
|
||||||
|
type MeterProvider interface{ meterProvider() }
|
||||||
|
|
||||||
|
// Meter is embedded in [go.opentelemetry.io/otel/metric.Meter].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Meter] if you want users to experience a
|
||||||
|
// compilation error, signaling they need to update to your latest
|
||||||
|
// implementation, when the [go.opentelemetry.io/otel/metric.Meter] interface
|
||||||
|
// is extended (which is something that can happen without a major version bump
|
||||||
|
// of the API package).
|
||||||
|
type Meter interface{ meter() }
|
||||||
|
|
||||||
|
// Float64Observer is embedded in
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64Observer].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64Observer] if you want
|
||||||
|
// users to experience a compilation error, signaling they need to update to
|
||||||
|
// your latest implementation, when the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64Observer] interface is
|
||||||
|
// extended (which is something that can happen without a major version bump of
|
||||||
|
// the API package).
|
||||||
|
type Float64Observer interface{ float64Observer() }
|
||||||
|
|
||||||
|
// Int64Observer is embedded in
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64Observer].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64Observer] if you want users
|
||||||
|
// to experience a compilation error, signaling they need to update to your
|
||||||
|
// latest implementation, when the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64Observer] interface is
|
||||||
|
// extended (which is something that can happen without a major version bump of
|
||||||
|
// the API package).
|
||||||
|
type Int64Observer interface{ int64Observer() }
|
||||||
|
|
||||||
|
// Observer is embedded in [go.opentelemetry.io/otel/metric.Observer].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Observer] if you want users to experience a
|
||||||
|
// compilation error, signaling they need to update to your latest
|
||||||
|
// implementation, when the [go.opentelemetry.io/otel/metric.Observer]
|
||||||
|
// interface is extended (which is something that can happen without a major
|
||||||
|
// version bump of the API package).
|
||||||
|
type Observer interface{ observer() }
|
||||||
|
|
||||||
|
// Registration is embedded in [go.opentelemetry.io/otel/metric.Registration].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Registration] if you want users to
|
||||||
|
// experience a compilation error, signaling they need to update to your latest
|
||||||
|
// implementation, when the [go.opentelemetry.io/otel/metric.Registration]
|
||||||
|
// interface is extended (which is something that can happen without a major
|
||||||
|
// version bump of the API package).
|
||||||
|
type Registration interface{ registration() }
|
||||||
|
|
||||||
|
// Float64Counter is embedded in
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64Counter].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64Counter] if you want
|
||||||
|
// users to experience a compilation error, signaling they need to update to
|
||||||
|
// your latest implementation, when the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64Counter] interface is
|
||||||
|
// extended (which is something that can happen without a major version bump of
|
||||||
|
// the API package).
|
||||||
|
type Float64Counter interface{ float64Counter() }
|
||||||
|
|
||||||
|
// Float64Histogram is embedded in
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64Histogram].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64Histogram] if you want
|
||||||
|
// users to experience a compilation error, signaling they need to update to
|
||||||
|
// your latest implementation, when the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64Histogram] interface is
|
||||||
|
// extended (which is something that can happen without a major version bump of
|
||||||
|
// the API package).
|
||||||
|
type Float64Histogram interface{ float64Histogram() }
|
||||||
|
|
||||||
|
// Float64ObservableCounter is embedded in
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64ObservableCounter].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64ObservableCounter] if you
|
||||||
|
// want users to experience a compilation error, signaling they need to update
|
||||||
|
// to your latest implementation, when the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64ObservableCounter]
|
||||||
|
// interface is extended (which is something that can happen without a major
|
||||||
|
// version bump of the API package).
|
||||||
|
type Float64ObservableCounter interface{ float64ObservableCounter() }
|
||||||
|
|
||||||
|
// Float64ObservableGauge is embedded in
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64ObservableGauge].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64ObservableGauge] if you
|
||||||
|
// want users to experience a compilation error, signaling they need to update
|
||||||
|
// to your latest implementation, when the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64ObservableGauge]
|
||||||
|
// interface is extended (which is something that can happen without a major
|
||||||
|
// version bump of the API package).
|
||||||
|
type Float64ObservableGauge interface{ float64ObservableGauge() }
|
||||||
|
|
||||||
|
// Float64ObservableUpDownCounter is embedded in
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64ObservableUpDownCounter].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64ObservableUpDownCounter]
|
||||||
|
// if you want users to experience a compilation error, signaling they need to
|
||||||
|
// update to your latest implementation, when the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64ObservableUpDownCounter]
|
||||||
|
// interface is extended (which is something that can happen without a major
|
||||||
|
// version bump of the API package).
|
||||||
|
type Float64ObservableUpDownCounter interface{ float64ObservableUpDownCounter() }
|
||||||
|
|
||||||
|
// Float64UpDownCounter is embedded in
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64UpDownCounter].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64UpDownCounter] if you
|
||||||
|
// want users to experience a compilation error, signaling they need to update
|
||||||
|
// to your latest implementation, when the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64UpDownCounter] interface
|
||||||
|
// is extended (which is something that can happen without a major version bump
|
||||||
|
// of the API package).
|
||||||
|
type Float64UpDownCounter interface{ float64UpDownCounter() }
|
||||||
|
|
||||||
|
// Int64Counter is embedded in
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64Counter].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64Counter] if you want users
|
||||||
|
// to experience a compilation error, signaling they need to update to your
|
||||||
|
// latest implementation, when the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64Counter] interface is
|
||||||
|
// extended (which is something that can happen without a major version bump of
|
||||||
|
// the API package).
|
||||||
|
type Int64Counter interface{ int64Counter() }
|
||||||
|
|
||||||
|
// Int64Histogram is embedded in
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64Histogram].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64Histogram] if you want
|
||||||
|
// users to experience a compilation error, signaling they need to update to
|
||||||
|
// your latest implementation, when the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64Histogram] interface is
|
||||||
|
// extended (which is something that can happen without a major version bump of
|
||||||
|
// the API package).
|
||||||
|
type Int64Histogram interface{ int64Histogram() }
|
||||||
|
|
||||||
|
// Int64ObservableCounter is embedded in
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64ObservableCounter].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64ObservableCounter] if you
|
||||||
|
// want users to experience a compilation error, signaling they need to update
|
||||||
|
// to your latest implementation, when the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64ObservableCounter]
|
||||||
|
// interface is extended (which is something that can happen without a major
|
||||||
|
// version bump of the API package).
|
||||||
|
type Int64ObservableCounter interface{ int64ObservableCounter() }
|
||||||
|
|
||||||
|
// Int64ObservableGauge is embedded in
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64ObservableGauge].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64ObservableGauge] if you
|
||||||
|
// want users to experience a compilation error, signaling they need to update
|
||||||
|
// to your latest implementation, when the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64ObservableGauge] interface
|
||||||
|
// is extended (which is something that can happen without a major version bump
|
||||||
|
// of the API package).
|
||||||
|
type Int64ObservableGauge interface{ int64ObservableGauge() }
|
||||||
|
|
||||||
|
// Int64ObservableUpDownCounter is embedded in
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64ObservableUpDownCounter].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64ObservableUpDownCounter] if
|
||||||
|
// you want users to experience a compilation error, signaling they need to
|
||||||
|
// update to your latest implementation, when the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64ObservableUpDownCounter]
|
||||||
|
// interface is extended (which is something that can happen without a major
|
||||||
|
// version bump of the API package).
|
||||||
|
type Int64ObservableUpDownCounter interface{ int64ObservableUpDownCounter() }
|
||||||
|
|
||||||
|
// Int64UpDownCounter is embedded in
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64UpDownCounter].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64UpDownCounter] if you want
|
||||||
|
// users to experience a compilation error, signaling they need to update to
|
||||||
|
// your latest implementation, when the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64UpDownCounter] interface is
|
||||||
|
// extended (which is something that can happen without a major version bump of
|
||||||
|
// the API package).
|
||||||
|
type Int64UpDownCounter interface{ int64UpDownCounter() }
|
||||||
+332
@@ -0,0 +1,332 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package metric // import "go.opentelemetry.io/otel/metric"
|
||||||
|
|
||||||
|
import "go.opentelemetry.io/otel/attribute"
|
||||||
|
|
||||||
|
// Observable is used as a grouping mechanism for all instruments that are
|
||||||
|
// updated within a Callback.
|
||||||
|
type Observable interface {
|
||||||
|
observable()
|
||||||
|
}
|
||||||
|
|
||||||
|
// InstrumentOption applies options to all instruments.
|
||||||
|
type InstrumentOption interface {
|
||||||
|
Int64CounterOption
|
||||||
|
Int64UpDownCounterOption
|
||||||
|
Int64HistogramOption
|
||||||
|
Int64ObservableCounterOption
|
||||||
|
Int64ObservableUpDownCounterOption
|
||||||
|
Int64ObservableGaugeOption
|
||||||
|
|
||||||
|
Float64CounterOption
|
||||||
|
Float64UpDownCounterOption
|
||||||
|
Float64HistogramOption
|
||||||
|
Float64ObservableCounterOption
|
||||||
|
Float64ObservableUpDownCounterOption
|
||||||
|
Float64ObservableGaugeOption
|
||||||
|
}
|
||||||
|
|
||||||
|
type descOpt string
|
||||||
|
|
||||||
|
func (o descOpt) applyFloat64Counter(c Float64CounterConfig) Float64CounterConfig {
|
||||||
|
c.description = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o descOpt) applyFloat64UpDownCounter(c Float64UpDownCounterConfig) Float64UpDownCounterConfig {
|
||||||
|
c.description = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o descOpt) applyFloat64Histogram(c Float64HistogramConfig) Float64HistogramConfig {
|
||||||
|
c.description = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o descOpt) applyFloat64ObservableCounter(c Float64ObservableCounterConfig) Float64ObservableCounterConfig {
|
||||||
|
c.description = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o descOpt) applyFloat64ObservableUpDownCounter(c Float64ObservableUpDownCounterConfig) Float64ObservableUpDownCounterConfig {
|
||||||
|
c.description = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o descOpt) applyFloat64ObservableGauge(c Float64ObservableGaugeConfig) Float64ObservableGaugeConfig {
|
||||||
|
c.description = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o descOpt) applyInt64Counter(c Int64CounterConfig) Int64CounterConfig {
|
||||||
|
c.description = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o descOpt) applyInt64UpDownCounter(c Int64UpDownCounterConfig) Int64UpDownCounterConfig {
|
||||||
|
c.description = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o descOpt) applyInt64Histogram(c Int64HistogramConfig) Int64HistogramConfig {
|
||||||
|
c.description = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o descOpt) applyInt64ObservableCounter(c Int64ObservableCounterConfig) Int64ObservableCounterConfig {
|
||||||
|
c.description = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o descOpt) applyInt64ObservableUpDownCounter(c Int64ObservableUpDownCounterConfig) Int64ObservableUpDownCounterConfig {
|
||||||
|
c.description = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o descOpt) applyInt64ObservableGauge(c Int64ObservableGaugeConfig) Int64ObservableGaugeConfig {
|
||||||
|
c.description = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithDescription sets the instrument description.
|
||||||
|
func WithDescription(desc string) InstrumentOption { return descOpt(desc) }
|
||||||
|
|
||||||
|
type unitOpt string
|
||||||
|
|
||||||
|
func (o unitOpt) applyFloat64Counter(c Float64CounterConfig) Float64CounterConfig {
|
||||||
|
c.unit = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o unitOpt) applyFloat64UpDownCounter(c Float64UpDownCounterConfig) Float64UpDownCounterConfig {
|
||||||
|
c.unit = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o unitOpt) applyFloat64Histogram(c Float64HistogramConfig) Float64HistogramConfig {
|
||||||
|
c.unit = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o unitOpt) applyFloat64ObservableCounter(c Float64ObservableCounterConfig) Float64ObservableCounterConfig {
|
||||||
|
c.unit = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o unitOpt) applyFloat64ObservableUpDownCounter(c Float64ObservableUpDownCounterConfig) Float64ObservableUpDownCounterConfig {
|
||||||
|
c.unit = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o unitOpt) applyFloat64ObservableGauge(c Float64ObservableGaugeConfig) Float64ObservableGaugeConfig {
|
||||||
|
c.unit = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o unitOpt) applyInt64Counter(c Int64CounterConfig) Int64CounterConfig {
|
||||||
|
c.unit = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o unitOpt) applyInt64UpDownCounter(c Int64UpDownCounterConfig) Int64UpDownCounterConfig {
|
||||||
|
c.unit = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o unitOpt) applyInt64Histogram(c Int64HistogramConfig) Int64HistogramConfig {
|
||||||
|
c.unit = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o unitOpt) applyInt64ObservableCounter(c Int64ObservableCounterConfig) Int64ObservableCounterConfig {
|
||||||
|
c.unit = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o unitOpt) applyInt64ObservableUpDownCounter(c Int64ObservableUpDownCounterConfig) Int64ObservableUpDownCounterConfig {
|
||||||
|
c.unit = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o unitOpt) applyInt64ObservableGauge(c Int64ObservableGaugeConfig) Int64ObservableGaugeConfig {
|
||||||
|
c.unit = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithUnit sets the instrument unit.
|
||||||
|
func WithUnit(u string) InstrumentOption { return unitOpt(u) }
|
||||||
|
|
||||||
|
// AddOption applies options to an addition measurement. See
|
||||||
|
// [MeasurementOption] for other options that can be used as an AddOption.
|
||||||
|
type AddOption interface {
|
||||||
|
applyAdd(AddConfig) AddConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddConfig contains options for an addition measurement.
|
||||||
|
type AddConfig struct {
|
||||||
|
attrs attribute.Set
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewAddConfig returns a new [AddConfig] with all opts applied.
|
||||||
|
func NewAddConfig(opts []AddOption) AddConfig {
|
||||||
|
config := AddConfig{attrs: *attribute.EmptySet()}
|
||||||
|
for _, o := range opts {
|
||||||
|
config = o.applyAdd(config)
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attributes returns the configured attribute set.
|
||||||
|
func (c AddConfig) Attributes() attribute.Set {
|
||||||
|
return c.attrs
|
||||||
|
}
|
||||||
|
|
||||||
|
// RecordOption applies options to an addition measurement. See
|
||||||
|
// [MeasurementOption] for other options that can be used as a RecordOption.
|
||||||
|
type RecordOption interface {
|
||||||
|
applyRecord(RecordConfig) RecordConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// RecordConfig contains options for a recorded measurement.
|
||||||
|
type RecordConfig struct {
|
||||||
|
attrs attribute.Set
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewRecordConfig returns a new [RecordConfig] with all opts applied.
|
||||||
|
func NewRecordConfig(opts []RecordOption) RecordConfig {
|
||||||
|
config := RecordConfig{attrs: *attribute.EmptySet()}
|
||||||
|
for _, o := range opts {
|
||||||
|
config = o.applyRecord(config)
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attributes returns the configured attribute set.
|
||||||
|
func (c RecordConfig) Attributes() attribute.Set {
|
||||||
|
return c.attrs
|
||||||
|
}
|
||||||
|
|
||||||
|
// ObserveOption applies options to an addition measurement. See
|
||||||
|
// [MeasurementOption] for other options that can be used as a ObserveOption.
|
||||||
|
type ObserveOption interface {
|
||||||
|
applyObserve(ObserveConfig) ObserveConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// ObserveConfig contains options for an observed measurement.
|
||||||
|
type ObserveConfig struct {
|
||||||
|
attrs attribute.Set
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewObserveConfig returns a new [ObserveConfig] with all opts applied.
|
||||||
|
func NewObserveConfig(opts []ObserveOption) ObserveConfig {
|
||||||
|
config := ObserveConfig{attrs: *attribute.EmptySet()}
|
||||||
|
for _, o := range opts {
|
||||||
|
config = o.applyObserve(config)
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attributes returns the configured attribute set.
|
||||||
|
func (c ObserveConfig) Attributes() attribute.Set {
|
||||||
|
return c.attrs
|
||||||
|
}
|
||||||
|
|
||||||
|
// MeasurementOption applies options to all instrument measurement.
|
||||||
|
type MeasurementOption interface {
|
||||||
|
AddOption
|
||||||
|
RecordOption
|
||||||
|
ObserveOption
|
||||||
|
}
|
||||||
|
|
||||||
|
type attrOpt struct {
|
||||||
|
set attribute.Set
|
||||||
|
}
|
||||||
|
|
||||||
|
// mergeSets returns the union of keys between a and b. Any duplicate keys will
|
||||||
|
// use the value associated with b.
|
||||||
|
func mergeSets(a, b attribute.Set) attribute.Set {
|
||||||
|
// NewMergeIterator uses the first value for any duplicates.
|
||||||
|
iter := attribute.NewMergeIterator(&b, &a)
|
||||||
|
merged := make([]attribute.KeyValue, 0, a.Len()+b.Len())
|
||||||
|
for iter.Next() {
|
||||||
|
merged = append(merged, iter.Attribute())
|
||||||
|
}
|
||||||
|
return attribute.NewSet(merged...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o attrOpt) applyAdd(c AddConfig) AddConfig {
|
||||||
|
switch {
|
||||||
|
case o.set.Len() == 0:
|
||||||
|
case c.attrs.Len() == 0:
|
||||||
|
c.attrs = o.set
|
||||||
|
default:
|
||||||
|
c.attrs = mergeSets(c.attrs, o.set)
|
||||||
|
}
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o attrOpt) applyRecord(c RecordConfig) RecordConfig {
|
||||||
|
switch {
|
||||||
|
case o.set.Len() == 0:
|
||||||
|
case c.attrs.Len() == 0:
|
||||||
|
c.attrs = o.set
|
||||||
|
default:
|
||||||
|
c.attrs = mergeSets(c.attrs, o.set)
|
||||||
|
}
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o attrOpt) applyObserve(c ObserveConfig) ObserveConfig {
|
||||||
|
switch {
|
||||||
|
case o.set.Len() == 0:
|
||||||
|
case c.attrs.Len() == 0:
|
||||||
|
c.attrs = o.set
|
||||||
|
default:
|
||||||
|
c.attrs = mergeSets(c.attrs, o.set)
|
||||||
|
}
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithAttributeSet sets the attribute Set associated with a measurement is
|
||||||
|
// made with.
|
||||||
|
//
|
||||||
|
// If multiple WithAttributeSet or WithAttributes options are passed the
|
||||||
|
// attributes will be merged together in the order they are passed. Attributes
|
||||||
|
// with duplicate keys will use the last value passed.
|
||||||
|
func WithAttributeSet(attributes attribute.Set) MeasurementOption {
|
||||||
|
return attrOpt{set: attributes}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithAttributes converts attributes into an attribute Set and sets the Set to
|
||||||
|
// be associated with a measurement. This is shorthand for:
|
||||||
|
//
|
||||||
|
// cp := make([]attribute.KeyValue, len(attributes))
|
||||||
|
// copy(cp, attributes)
|
||||||
|
// WithAttributes(attribute.NewSet(cp...))
|
||||||
|
//
|
||||||
|
// [attribute.NewSet] may modify the passed attributes so this will make a copy
|
||||||
|
// of attributes before creating a set in order to ensure this function is
|
||||||
|
// concurrent safe. This makes this option function less optimized in
|
||||||
|
// comparison to [WithAttributeSet]. Therefore, [WithAttributeSet] should be
|
||||||
|
// preferred for performance sensitive code.
|
||||||
|
//
|
||||||
|
// See [WithAttributeSet] for information about how multiple WithAttributes are
|
||||||
|
// merged.
|
||||||
|
func WithAttributes(attributes ...attribute.KeyValue) MeasurementOption {
|
||||||
|
cp := make([]attribute.KeyValue, len(attributes))
|
||||||
|
copy(cp, attributes)
|
||||||
|
return attrOpt{set: attribute.NewSet(cp...)}
|
||||||
|
}
|
||||||
+210
@@ -0,0 +1,210 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package metric // import "go.opentelemetry.io/otel/metric"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/metric/embedded"
|
||||||
|
)
|
||||||
|
|
||||||
|
// MeterProvider provides access to named Meter instances, for instrumenting
|
||||||
|
// an application or package.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for unimplemented methods.
|
||||||
|
type MeterProvider interface {
|
||||||
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
|
// by implementations of this interface. See the "API Implementations"
|
||||||
|
// section of the package documentation for more information.
|
||||||
|
embedded.MeterProvider
|
||||||
|
|
||||||
|
// Meter returns a new Meter with the provided name and configuration.
|
||||||
|
//
|
||||||
|
// A Meter should be scoped at most to a single package. The name needs to
|
||||||
|
// be unique so it does not collide with other names used by
|
||||||
|
// an application, nor other applications. To achieve this, the import path
|
||||||
|
// of the instrumentation package is recommended to be used as name.
|
||||||
|
//
|
||||||
|
// If the name is empty, then an implementation defined default name will
|
||||||
|
// be used instead.
|
||||||
|
Meter(name string, opts ...MeterOption) Meter
|
||||||
|
}
|
||||||
|
|
||||||
|
// Meter provides access to instrument instances for recording metrics.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for unimplemented methods.
|
||||||
|
type Meter interface {
|
||||||
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
|
// by implementations of this interface. See the "API Implementations"
|
||||||
|
// section of the package documentation for more information.
|
||||||
|
embedded.Meter
|
||||||
|
|
||||||
|
// Int64Counter returns a new Int64Counter instrument identified by name
|
||||||
|
// and configured with options. The instrument is used to synchronously
|
||||||
|
// record increasing int64 measurements during a computational operation.
|
||||||
|
Int64Counter(name string, options ...Int64CounterOption) (Int64Counter, error)
|
||||||
|
// Int64UpDownCounter returns a new Int64UpDownCounter instrument
|
||||||
|
// identified by name and configured with options. The instrument is used
|
||||||
|
// to synchronously record int64 measurements during a computational
|
||||||
|
// operation.
|
||||||
|
Int64UpDownCounter(name string, options ...Int64UpDownCounterOption) (Int64UpDownCounter, error)
|
||||||
|
// Int64Histogram returns a new Int64Histogram instrument identified by
|
||||||
|
// name and configured with options. The instrument is used to
|
||||||
|
// synchronously record the distribution of int64 measurements during a
|
||||||
|
// computational operation.
|
||||||
|
Int64Histogram(name string, options ...Int64HistogramOption) (Int64Histogram, error)
|
||||||
|
// Int64ObservableCounter returns a new Int64ObservableCounter identified
|
||||||
|
// by name and configured with options. The instrument is used to
|
||||||
|
// asynchronously record increasing int64 measurements once per a
|
||||||
|
// measurement collection cycle.
|
||||||
|
//
|
||||||
|
// Measurements for the returned instrument are made via a callback. Use
|
||||||
|
// the WithInt64Callback option to register the callback here, or use the
|
||||||
|
// RegisterCallback method of this Meter to register one later. See the
|
||||||
|
// Measurements section of the package documentation for more information.
|
||||||
|
Int64ObservableCounter(name string, options ...Int64ObservableCounterOption) (Int64ObservableCounter, error)
|
||||||
|
// Int64ObservableUpDownCounter returns a new Int64ObservableUpDownCounter
|
||||||
|
// instrument identified by name and configured with options. The
|
||||||
|
// instrument is used to asynchronously record int64 measurements once per
|
||||||
|
// a measurement collection cycle.
|
||||||
|
//
|
||||||
|
// Measurements for the returned instrument are made via a callback. Use
|
||||||
|
// the WithInt64Callback option to register the callback here, or use the
|
||||||
|
// RegisterCallback method of this Meter to register one later. See the
|
||||||
|
// Measurements section of the package documentation for more information.
|
||||||
|
Int64ObservableUpDownCounter(name string, options ...Int64ObservableUpDownCounterOption) (Int64ObservableUpDownCounter, error)
|
||||||
|
// Int64ObservableGauge returns a new Int64ObservableGauge instrument
|
||||||
|
// identified by name and configured with options. The instrument is used
|
||||||
|
// to asynchronously record instantaneous int64 measurements once per a
|
||||||
|
// measurement collection cycle.
|
||||||
|
//
|
||||||
|
// Measurements for the returned instrument are made via a callback. Use
|
||||||
|
// the WithInt64Callback option to register the callback here, or use the
|
||||||
|
// RegisterCallback method of this Meter to register one later. See the
|
||||||
|
// Measurements section of the package documentation for more information.
|
||||||
|
Int64ObservableGauge(name string, options ...Int64ObservableGaugeOption) (Int64ObservableGauge, error)
|
||||||
|
|
||||||
|
// Float64Counter returns a new Float64Counter instrument identified by
|
||||||
|
// name and configured with options. The instrument is used to
|
||||||
|
// synchronously record increasing float64 measurements during a
|
||||||
|
// computational operation.
|
||||||
|
Float64Counter(name string, options ...Float64CounterOption) (Float64Counter, error)
|
||||||
|
// Float64UpDownCounter returns a new Float64UpDownCounter instrument
|
||||||
|
// identified by name and configured with options. The instrument is used
|
||||||
|
// to synchronously record float64 measurements during a computational
|
||||||
|
// operation.
|
||||||
|
Float64UpDownCounter(name string, options ...Float64UpDownCounterOption) (Float64UpDownCounter, error)
|
||||||
|
// Float64Histogram returns a new Float64Histogram instrument identified by
|
||||||
|
// name and configured with options. The instrument is used to
|
||||||
|
// synchronously record the distribution of float64 measurements during a
|
||||||
|
// computational operation.
|
||||||
|
Float64Histogram(name string, options ...Float64HistogramOption) (Float64Histogram, error)
|
||||||
|
// Float64ObservableCounter returns a new Float64ObservableCounter
|
||||||
|
// instrument identified by name and configured with options. The
|
||||||
|
// instrument is used to asynchronously record increasing float64
|
||||||
|
// measurements once per a measurement collection cycle.
|
||||||
|
//
|
||||||
|
// Measurements for the returned instrument are made via a callback. Use
|
||||||
|
// the WithFloat64Callback option to register the callback here, or use the
|
||||||
|
// RegisterCallback method of this Meter to register one later. See the
|
||||||
|
// Measurements section of the package documentation for more information.
|
||||||
|
Float64ObservableCounter(name string, options ...Float64ObservableCounterOption) (Float64ObservableCounter, error)
|
||||||
|
// Float64ObservableUpDownCounter returns a new
|
||||||
|
// Float64ObservableUpDownCounter instrument identified by name and
|
||||||
|
// configured with options. The instrument is used to asynchronously record
|
||||||
|
// float64 measurements once per a measurement collection cycle.
|
||||||
|
//
|
||||||
|
// Measurements for the returned instrument are made via a callback. Use
|
||||||
|
// the WithFloat64Callback option to register the callback here, or use the
|
||||||
|
// RegisterCallback method of this Meter to register one later. See the
|
||||||
|
// Measurements section of the package documentation for more information.
|
||||||
|
Float64ObservableUpDownCounter(name string, options ...Float64ObservableUpDownCounterOption) (Float64ObservableUpDownCounter, error)
|
||||||
|
// Float64ObservableGauge returns a new Float64ObservableGauge instrument
|
||||||
|
// identified by name and configured with options. The instrument is used
|
||||||
|
// to asynchronously record instantaneous float64 measurements once per a
|
||||||
|
// measurement collection cycle.
|
||||||
|
//
|
||||||
|
// Measurements for the returned instrument are made via a callback. Use
|
||||||
|
// the WithFloat64Callback option to register the callback here, or use the
|
||||||
|
// RegisterCallback method of this Meter to register one later. See the
|
||||||
|
// Measurements section of the package documentation for more information.
|
||||||
|
Float64ObservableGauge(name string, options ...Float64ObservableGaugeOption) (Float64ObservableGauge, error)
|
||||||
|
|
||||||
|
// RegisterCallback registers f to be called during the collection of a
|
||||||
|
// measurement cycle.
|
||||||
|
//
|
||||||
|
// If Unregister of the returned Registration is called, f needs to be
|
||||||
|
// unregistered and not called during collection.
|
||||||
|
//
|
||||||
|
// The instruments f is registered with are the only instruments that f may
|
||||||
|
// observe values for.
|
||||||
|
//
|
||||||
|
// If no instruments are passed, f should not be registered nor called
|
||||||
|
// during collection.
|
||||||
|
RegisterCallback(f Callback, instruments ...Observable) (Registration, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Callback is a function registered with a Meter that makes observations for
|
||||||
|
// the set of instruments it is registered with. The Observer parameter is used
|
||||||
|
// to record measurement observations for these instruments.
|
||||||
|
//
|
||||||
|
// The function needs to complete in a finite amount of time and the deadline
|
||||||
|
// of the passed context is expected to be honored.
|
||||||
|
//
|
||||||
|
// The function needs to make unique observations across all registered
|
||||||
|
// Callbacks. Meaning, it should not report measurements for an instrument with
|
||||||
|
// the same attributes as another Callback will report.
|
||||||
|
//
|
||||||
|
// The function needs to be concurrent safe.
|
||||||
|
type Callback func(context.Context, Observer) error
|
||||||
|
|
||||||
|
// Observer records measurements for multiple instruments in a Callback.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for unimplemented methods.
|
||||||
|
type Observer interface {
|
||||||
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
|
// by implementations of this interface. See the "API Implementations"
|
||||||
|
// section of the package documentation for more information.
|
||||||
|
embedded.Observer
|
||||||
|
|
||||||
|
// ObserveFloat64 records the float64 value for obsrv.
|
||||||
|
ObserveFloat64(obsrv Float64Observable, value float64, opts ...ObserveOption)
|
||||||
|
// ObserveInt64 records the int64 value for obsrv.
|
||||||
|
ObserveInt64(obsrv Int64Observable, value int64, opts ...ObserveOption)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Registration is an token representing the unique registration of a callback
|
||||||
|
// for a set of instruments with a Meter.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for unimplemented methods.
|
||||||
|
type Registration interface {
|
||||||
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
|
// by implementations of this interface. See the "API Implementations"
|
||||||
|
// section of the package documentation for more information.
|
||||||
|
embedded.Registration
|
||||||
|
|
||||||
|
// Unregister removes the callback registration from a Meter.
|
||||||
|
//
|
||||||
|
// This method needs to be idempotent and concurrent safe.
|
||||||
|
Unregister() error
|
||||||
|
}
|
||||||
+179
@@ -0,0 +1,179 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package metric // import "go.opentelemetry.io/otel/metric"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/metric/embedded"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Float64Counter is an instrument that records increasing float64 values.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for unimplemented methods.
|
||||||
|
type Float64Counter interface {
|
||||||
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
|
// by implementations of this interface. See the "API Implementations"
|
||||||
|
// section of the package documentation for more information.
|
||||||
|
embedded.Float64Counter
|
||||||
|
|
||||||
|
// Add records a change to the counter.
|
||||||
|
//
|
||||||
|
// Use the WithAttributeSet (or, if performance is not a concern,
|
||||||
|
// the WithAttributes) option to include measurement attributes.
|
||||||
|
Add(ctx context.Context, incr float64, options ...AddOption)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64CounterConfig contains options for synchronous counter instruments that
|
||||||
|
// record int64 values.
|
||||||
|
type Float64CounterConfig struct {
|
||||||
|
description string
|
||||||
|
unit string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewFloat64CounterConfig returns a new [Float64CounterConfig] with all opts
|
||||||
|
// applied.
|
||||||
|
func NewFloat64CounterConfig(opts ...Float64CounterOption) Float64CounterConfig {
|
||||||
|
var config Float64CounterConfig
|
||||||
|
for _, o := range opts {
|
||||||
|
config = o.applyFloat64Counter(config)
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
// Description returns the configured description.
|
||||||
|
func (c Float64CounterConfig) Description() string {
|
||||||
|
return c.description
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unit returns the configured unit.
|
||||||
|
func (c Float64CounterConfig) Unit() string {
|
||||||
|
return c.unit
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64CounterOption applies options to a [Float64CounterConfig]. See
|
||||||
|
// [InstrumentOption] for other options that can be used as a
|
||||||
|
// Float64CounterOption.
|
||||||
|
type Float64CounterOption interface {
|
||||||
|
applyFloat64Counter(Float64CounterConfig) Float64CounterConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64UpDownCounter is an instrument that records increasing or decreasing
|
||||||
|
// float64 values.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for unimplemented methods.
|
||||||
|
type Float64UpDownCounter interface {
|
||||||
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
|
// by implementations of this interface. See the "API Implementations"
|
||||||
|
// section of the package documentation for more information.
|
||||||
|
embedded.Float64UpDownCounter
|
||||||
|
|
||||||
|
// Add records a change to the counter.
|
||||||
|
//
|
||||||
|
// Use the WithAttributeSet (or, if performance is not a concern,
|
||||||
|
// the WithAttributes) option to include measurement attributes.
|
||||||
|
Add(ctx context.Context, incr float64, options ...AddOption)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64UpDownCounterConfig contains options for synchronous counter
|
||||||
|
// instruments that record int64 values.
|
||||||
|
type Float64UpDownCounterConfig struct {
|
||||||
|
description string
|
||||||
|
unit string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewFloat64UpDownCounterConfig returns a new [Float64UpDownCounterConfig]
|
||||||
|
// with all opts applied.
|
||||||
|
func NewFloat64UpDownCounterConfig(opts ...Float64UpDownCounterOption) Float64UpDownCounterConfig {
|
||||||
|
var config Float64UpDownCounterConfig
|
||||||
|
for _, o := range opts {
|
||||||
|
config = o.applyFloat64UpDownCounter(config)
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
// Description returns the configured description.
|
||||||
|
func (c Float64UpDownCounterConfig) Description() string {
|
||||||
|
return c.description
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unit returns the configured unit.
|
||||||
|
func (c Float64UpDownCounterConfig) Unit() string {
|
||||||
|
return c.unit
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64UpDownCounterOption applies options to a
|
||||||
|
// [Float64UpDownCounterConfig]. See [InstrumentOption] for other options that
|
||||||
|
// can be used as a Float64UpDownCounterOption.
|
||||||
|
type Float64UpDownCounterOption interface {
|
||||||
|
applyFloat64UpDownCounter(Float64UpDownCounterConfig) Float64UpDownCounterConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64Histogram is an instrument that records a distribution of float64
|
||||||
|
// values.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for unimplemented methods.
|
||||||
|
type Float64Histogram interface {
|
||||||
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
|
// by implementations of this interface. See the "API Implementations"
|
||||||
|
// section of the package documentation for more information.
|
||||||
|
embedded.Float64Histogram
|
||||||
|
|
||||||
|
// Record adds an additional value to the distribution.
|
||||||
|
//
|
||||||
|
// Use the WithAttributeSet (or, if performance is not a concern,
|
||||||
|
// the WithAttributes) option to include measurement attributes.
|
||||||
|
Record(ctx context.Context, incr float64, options ...RecordOption)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64HistogramConfig contains options for synchronous counter instruments
|
||||||
|
// that record int64 values.
|
||||||
|
type Float64HistogramConfig struct {
|
||||||
|
description string
|
||||||
|
unit string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewFloat64HistogramConfig returns a new [Float64HistogramConfig] with all
|
||||||
|
// opts applied.
|
||||||
|
func NewFloat64HistogramConfig(opts ...Float64HistogramOption) Float64HistogramConfig {
|
||||||
|
var config Float64HistogramConfig
|
||||||
|
for _, o := range opts {
|
||||||
|
config = o.applyFloat64Histogram(config)
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
// Description returns the configured description.
|
||||||
|
func (c Float64HistogramConfig) Description() string {
|
||||||
|
return c.description
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unit returns the configured unit.
|
||||||
|
func (c Float64HistogramConfig) Unit() string {
|
||||||
|
return c.unit
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64HistogramOption applies options to a [Float64HistogramConfig]. See
|
||||||
|
// [InstrumentOption] for other options that can be used as a
|
||||||
|
// Float64HistogramOption.
|
||||||
|
type Float64HistogramOption interface {
|
||||||
|
applyFloat64Histogram(Float64HistogramConfig) Float64HistogramConfig
|
||||||
|
}
|
||||||
+179
@@ -0,0 +1,179 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package metric // import "go.opentelemetry.io/otel/metric"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/metric/embedded"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Int64Counter is an instrument that records increasing int64 values.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for unimplemented methods.
|
||||||
|
type Int64Counter interface {
|
||||||
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
|
// by implementations of this interface. See the "API Implementations"
|
||||||
|
// section of the package documentation for more information.
|
||||||
|
embedded.Int64Counter
|
||||||
|
|
||||||
|
// Add records a change to the counter.
|
||||||
|
//
|
||||||
|
// Use the WithAttributeSet (or, if performance is not a concern,
|
||||||
|
// the WithAttributes) option to include measurement attributes.
|
||||||
|
Add(ctx context.Context, incr int64, options ...AddOption)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64CounterConfig contains options for synchronous counter instruments that
|
||||||
|
// record int64 values.
|
||||||
|
type Int64CounterConfig struct {
|
||||||
|
description string
|
||||||
|
unit string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewInt64CounterConfig returns a new [Int64CounterConfig] with all opts
|
||||||
|
// applied.
|
||||||
|
func NewInt64CounterConfig(opts ...Int64CounterOption) Int64CounterConfig {
|
||||||
|
var config Int64CounterConfig
|
||||||
|
for _, o := range opts {
|
||||||
|
config = o.applyInt64Counter(config)
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
// Description returns the configured description.
|
||||||
|
func (c Int64CounterConfig) Description() string {
|
||||||
|
return c.description
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unit returns the configured unit.
|
||||||
|
func (c Int64CounterConfig) Unit() string {
|
||||||
|
return c.unit
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64CounterOption applies options to a [Int64CounterConfig]. See
|
||||||
|
// [InstrumentOption] for other options that can be used as an
|
||||||
|
// Int64CounterOption.
|
||||||
|
type Int64CounterOption interface {
|
||||||
|
applyInt64Counter(Int64CounterConfig) Int64CounterConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64UpDownCounter is an instrument that records increasing or decreasing
|
||||||
|
// int64 values.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for unimplemented methods.
|
||||||
|
type Int64UpDownCounter interface {
|
||||||
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
|
// by implementations of this interface. See the "API Implementations"
|
||||||
|
// section of the package documentation for more information.
|
||||||
|
embedded.Int64UpDownCounter
|
||||||
|
|
||||||
|
// Add records a change to the counter.
|
||||||
|
//
|
||||||
|
// Use the WithAttributeSet (or, if performance is not a concern,
|
||||||
|
// the WithAttributes) option to include measurement attributes.
|
||||||
|
Add(ctx context.Context, incr int64, options ...AddOption)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64UpDownCounterConfig contains options for synchronous counter
|
||||||
|
// instruments that record int64 values.
|
||||||
|
type Int64UpDownCounterConfig struct {
|
||||||
|
description string
|
||||||
|
unit string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewInt64UpDownCounterConfig returns a new [Int64UpDownCounterConfig] with
|
||||||
|
// all opts applied.
|
||||||
|
func NewInt64UpDownCounterConfig(opts ...Int64UpDownCounterOption) Int64UpDownCounterConfig {
|
||||||
|
var config Int64UpDownCounterConfig
|
||||||
|
for _, o := range opts {
|
||||||
|
config = o.applyInt64UpDownCounter(config)
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
// Description returns the configured description.
|
||||||
|
func (c Int64UpDownCounterConfig) Description() string {
|
||||||
|
return c.description
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unit returns the configured unit.
|
||||||
|
func (c Int64UpDownCounterConfig) Unit() string {
|
||||||
|
return c.unit
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64UpDownCounterOption applies options to a [Int64UpDownCounterConfig].
|
||||||
|
// See [InstrumentOption] for other options that can be used as an
|
||||||
|
// Int64UpDownCounterOption.
|
||||||
|
type Int64UpDownCounterOption interface {
|
||||||
|
applyInt64UpDownCounter(Int64UpDownCounterConfig) Int64UpDownCounterConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64Histogram is an instrument that records a distribution of int64
|
||||||
|
// values.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for unimplemented methods.
|
||||||
|
type Int64Histogram interface {
|
||||||
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
|
// by implementations of this interface. See the "API Implementations"
|
||||||
|
// section of the package documentation for more information.
|
||||||
|
embedded.Int64Histogram
|
||||||
|
|
||||||
|
// Record adds an additional value to the distribution.
|
||||||
|
//
|
||||||
|
// Use the WithAttributeSet (or, if performance is not a concern,
|
||||||
|
// the WithAttributes) option to include measurement attributes.
|
||||||
|
Record(ctx context.Context, incr int64, options ...RecordOption)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64HistogramConfig contains options for synchronous counter instruments
|
||||||
|
// that record int64 values.
|
||||||
|
type Int64HistogramConfig struct {
|
||||||
|
description string
|
||||||
|
unit string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewInt64HistogramConfig returns a new [Int64HistogramConfig] with all opts
|
||||||
|
// applied.
|
||||||
|
func NewInt64HistogramConfig(opts ...Int64HistogramOption) Int64HistogramConfig {
|
||||||
|
var config Int64HistogramConfig
|
||||||
|
for _, o := range opts {
|
||||||
|
config = o.applyInt64Histogram(config)
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
// Description returns the configured description.
|
||||||
|
func (c Int64HistogramConfig) Description() string {
|
||||||
|
return c.description
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unit returns the configured unit.
|
||||||
|
func (c Int64HistogramConfig) Unit() string {
|
||||||
|
return c.unit
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64HistogramOption applies options to a [Int64HistogramConfig]. See
|
||||||
|
// [InstrumentOption] for other options that can be used as an
|
||||||
|
// Int64HistogramOption.
|
||||||
|
type Int64HistogramOption interface {
|
||||||
|
applyInt64Histogram(Int64HistogramConfig) Int64HistogramConfig
|
||||||
|
}
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
codespell==2.2.4
|
||||||
+5
-3
@@ -232,10 +232,12 @@ func (sc *SemanticConventions) HTTPServerAttributesFromHTTPRequest(serverName, r
|
|||||||
if route != "" {
|
if route != "" {
|
||||||
attrs = append(attrs, sc.HTTPRouteKey.String(route))
|
attrs = append(attrs, sc.HTTPRouteKey.String(route))
|
||||||
}
|
}
|
||||||
if values, ok := request.Header["X-Forwarded-For"]; ok && len(values) > 0 {
|
if values := request.Header["X-Forwarded-For"]; len(values) > 0 {
|
||||||
if addresses := strings.SplitN(values[0], ",", 2); len(addresses) > 0 {
|
addr := values[0]
|
||||||
attrs = append(attrs, sc.HTTPClientIPKey.String(addresses[0]))
|
if i := strings.Index(addr, ","); i > 0 {
|
||||||
|
addr = addr[:i]
|
||||||
}
|
}
|
||||||
|
attrs = append(attrs, sc.HTTPClientIPKey.String(addr))
|
||||||
}
|
}
|
||||||
|
|
||||||
return append(attrs, sc.httpCommonAttributesFromHTTPRequest(request)...)
|
return append(attrs, sc.httpCommonAttributesFromHTTPRequest(request)...)
|
||||||
|
|||||||
+1
-1
@@ -16,5 +16,5 @@ package otel // import "go.opentelemetry.io/otel"
|
|||||||
|
|
||||||
// Version is the current release version of OpenTelemetry in use.
|
// Version is the current release version of OpenTelemetry in use.
|
||||||
func Version() string {
|
func Version() string {
|
||||||
return "1.15.1"
|
return "1.16.0"
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
module-sets:
|
module-sets:
|
||||||
stable-v1:
|
stable-v1:
|
||||||
version: v1.15.1
|
version: v1.16.0
|
||||||
modules:
|
modules:
|
||||||
- go.opentelemetry.io/otel
|
- go.opentelemetry.io/otel
|
||||||
- go.opentelemetry.io/otel/bridge/opentracing
|
- go.opentelemetry.io/otel/bridge/opentracing
|
||||||
@@ -32,10 +32,11 @@ module-sets:
|
|||||||
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp
|
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp
|
||||||
- go.opentelemetry.io/otel/exporters/stdout/stdouttrace
|
- go.opentelemetry.io/otel/exporters/stdout/stdouttrace
|
||||||
- go.opentelemetry.io/otel/exporters/zipkin
|
- go.opentelemetry.io/otel/exporters/zipkin
|
||||||
|
- go.opentelemetry.io/otel/metric
|
||||||
- go.opentelemetry.io/otel/sdk
|
- go.opentelemetry.io/otel/sdk
|
||||||
- go.opentelemetry.io/otel/trace
|
- go.opentelemetry.io/otel/trace
|
||||||
experimental-metrics:
|
experimental-metrics:
|
||||||
version: v0.38.1
|
version: v0.39.0
|
||||||
modules:
|
modules:
|
||||||
- go.opentelemetry.io/otel/example/opencensus
|
- go.opentelemetry.io/otel/example/opencensus
|
||||||
- go.opentelemetry.io/otel/example/prometheus
|
- go.opentelemetry.io/otel/example/prometheus
|
||||||
@@ -44,7 +45,6 @@ module-sets:
|
|||||||
- go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp
|
- go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp
|
||||||
- go.opentelemetry.io/otel/exporters/prometheus
|
- go.opentelemetry.io/otel/exporters/prometheus
|
||||||
- go.opentelemetry.io/otel/exporters/stdout/stdoutmetric
|
- go.opentelemetry.io/otel/exporters/stdout/stdoutmetric
|
||||||
- go.opentelemetry.io/otel/metric
|
|
||||||
- go.opentelemetry.io/otel/sdk/metric
|
- go.opentelemetry.io/otel/sdk/metric
|
||||||
- go.opentelemetry.io/otel/bridge/opencensus
|
- go.opentelemetry.io/otel/bridge/opencensus
|
||||||
- go.opentelemetry.io/otel/bridge/opencensus/test
|
- go.opentelemetry.io/otel/bridge/opencensus/test
|
||||||
|
|||||||
Vendored
+8
-4
@@ -1619,8 +1619,8 @@ github.com/spf13/pflag
|
|||||||
# github.com/stretchr/objx v0.5.0
|
# github.com/stretchr/objx v0.5.0
|
||||||
## explicit; go 1.12
|
## explicit; go 1.12
|
||||||
github.com/stretchr/objx
|
github.com/stretchr/objx
|
||||||
# github.com/stretchr/testify v1.8.2
|
# github.com/stretchr/testify v1.8.3
|
||||||
## explicit; go 1.13
|
## explicit; go 1.20
|
||||||
github.com/stretchr/testify/assert
|
github.com/stretchr/testify/assert
|
||||||
github.com/stretchr/testify/mock
|
github.com/stretchr/testify/mock
|
||||||
github.com/stretchr/testify/require
|
github.com/stretchr/testify/require
|
||||||
@@ -1800,7 +1800,7 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/inte
|
|||||||
## explicit; go 1.19
|
## explicit; go 1.19
|
||||||
go.opentelemetry.io/contrib/zpages
|
go.opentelemetry.io/contrib/zpages
|
||||||
go.opentelemetry.io/contrib/zpages/internal
|
go.opentelemetry.io/contrib/zpages/internal
|
||||||
# go.opentelemetry.io/otel v1.15.1
|
# go.opentelemetry.io/otel v1.16.0
|
||||||
## explicit; go 1.19
|
## explicit; go 1.19
|
||||||
go.opentelemetry.io/otel
|
go.opentelemetry.io/otel
|
||||||
go.opentelemetry.io/otel/attribute
|
go.opentelemetry.io/otel/attribute
|
||||||
@@ -1837,6 +1837,10 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/tracetransform
|
|||||||
# go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.15.1
|
# go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.15.1
|
||||||
## explicit; go 1.19
|
## explicit; go 1.19
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc
|
||||||
|
# go.opentelemetry.io/otel/metric v1.16.0
|
||||||
|
## explicit; go 1.19
|
||||||
|
go.opentelemetry.io/otel/metric
|
||||||
|
go.opentelemetry.io/otel/metric/embedded
|
||||||
# go.opentelemetry.io/otel/sdk v1.15.1
|
# go.opentelemetry.io/otel/sdk v1.15.1
|
||||||
## explicit; go 1.19
|
## explicit; go 1.19
|
||||||
go.opentelemetry.io/otel/sdk
|
go.opentelemetry.io/otel/sdk
|
||||||
@@ -1845,7 +1849,7 @@ go.opentelemetry.io/otel/sdk/internal
|
|||||||
go.opentelemetry.io/otel/sdk/internal/env
|
go.opentelemetry.io/otel/sdk/internal/env
|
||||||
go.opentelemetry.io/otel/sdk/resource
|
go.opentelemetry.io/otel/sdk/resource
|
||||||
go.opentelemetry.io/otel/sdk/trace
|
go.opentelemetry.io/otel/sdk/trace
|
||||||
# go.opentelemetry.io/otel/trace v1.15.1
|
# go.opentelemetry.io/otel/trace v1.16.0
|
||||||
## explicit; go 1.19
|
## explicit; go 1.19
|
||||||
go.opentelemetry.io/otel/trace
|
go.opentelemetry.io/otel/trace
|
||||||
# go.opentelemetry.io/proto/otlp v0.19.0
|
# go.opentelemetry.io/proto/otlp v0.19.0
|
||||||
|
|||||||
Reference in New Issue
Block a user