mirror of
https://github.com/goharbor/harbor.git
synced 2024-12-26 02:28:06 +01:00
bump golang.org/x/net to v0.17.0 && go.opentelemetry.io/contrib (#19461)
bump golang.org/x/net to v0.17.0 Signed-off-by: yminer <yminer@vmware.com> bump go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp to v0.45.0
This commit is contained in:
parent
18b979576d
commit
84a85fb299
23
src/go.mod
23
src/go.mod
@ -50,22 +50,22 @@ require (
|
|||||||
github.com/prometheus/client_golang v1.14.0
|
github.com/prometheus/client_golang v1.14.0
|
||||||
github.com/robfig/cron/v3 v3.0.0
|
github.com/robfig/cron/v3 v3.0.0
|
||||||
github.com/spf13/viper v1.8.1
|
github.com/spf13/viper v1.8.1
|
||||||
github.com/stretchr/testify v1.8.2
|
github.com/stretchr/testify v1.8.4
|
||||||
github.com/tencentcloud/tencentcloud-sdk-go v1.0.62
|
github.com/tencentcloud/tencentcloud-sdk-go v1.0.62
|
||||||
github.com/vmihailenco/msgpack/v5 v5.0.0-rc.2
|
github.com/vmihailenco/msgpack/v5 v5.0.0-rc.2
|
||||||
go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.22.0
|
go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.22.0
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.22.0
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.45.0
|
||||||
go.opentelemetry.io/otel v1.14.0
|
go.opentelemetry.io/otel v1.19.0
|
||||||
go.opentelemetry.io/otel/exporters/jaeger v1.0.0
|
go.opentelemetry.io/otel/exporters/jaeger v1.0.0
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0
|
||||||
go.opentelemetry.io/otel/sdk v1.8.0
|
go.opentelemetry.io/otel/sdk v1.8.0
|
||||||
go.opentelemetry.io/otel/trace v1.14.0
|
go.opentelemetry.io/otel/trace v1.19.0
|
||||||
go.uber.org/ratelimit v0.2.0
|
go.uber.org/ratelimit v0.2.0
|
||||||
golang.org/x/crypto v0.7.0
|
golang.org/x/crypto v0.14.0
|
||||||
golang.org/x/net v0.10.0
|
golang.org/x/net v0.17.0
|
||||||
golang.org/x/oauth2 v0.5.0
|
golang.org/x/oauth2 v0.5.0
|
||||||
golang.org/x/sync v0.3.0
|
golang.org/x/sync v0.3.0
|
||||||
golang.org/x/text v0.9.0
|
golang.org/x/text v0.13.0
|
||||||
golang.org/x/time v0.0.0-20220210224613-90d013bbcef8
|
golang.org/x/time v0.0.0-20220210224613-90d013bbcef8
|
||||||
gopkg.in/h2non/gock.v1 v1.0.16
|
gopkg.in/h2non/gock.v1 v1.0.16
|
||||||
gopkg.in/yaml.v2 v2.4.0
|
gopkg.in/yaml.v2 v2.4.0
|
||||||
@ -101,7 +101,7 @@ require (
|
|||||||
github.com/docker/go-metrics v0.0.1 // indirect
|
github.com/docker/go-metrics v0.0.1 // indirect
|
||||||
github.com/felixge/httpsnoop v1.0.3 // indirect
|
github.com/felixge/httpsnoop v1.0.3 // indirect
|
||||||
github.com/fsnotify/fsnotify v1.4.9 // indirect
|
github.com/fsnotify/fsnotify v1.4.9 // indirect
|
||||||
github.com/go-logr/logr v1.2.3 // indirect
|
github.com/go-logr/logr v1.2.4 // indirect
|
||||||
github.com/go-logr/stdr v1.2.2 // indirect
|
github.com/go-logr/stdr v1.2.2 // indirect
|
||||||
github.com/go-openapi/analysis v0.19.10 // indirect
|
github.com/go-openapi/analysis v0.19.10 // indirect
|
||||||
github.com/go-openapi/jsonpointer v0.19.5 // indirect
|
github.com/go-openapi/jsonpointer v0.19.5 // indirect
|
||||||
@ -156,14 +156,13 @@ require (
|
|||||||
go.opentelemetry.io/contrib v0.22.0 // indirect
|
go.opentelemetry.io/contrib v0.22.0 // indirect
|
||||||
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0 // indirect
|
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0 // indirect
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0 // indirect
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0 // indirect
|
||||||
go.opentelemetry.io/otel/internal/metric v0.22.0 // indirect
|
go.opentelemetry.io/otel/metric v1.19.0 // indirect
|
||||||
go.opentelemetry.io/otel/metric v0.22.0 // indirect
|
|
||||||
go.opentelemetry.io/proto/otlp v0.11.0 // indirect
|
go.opentelemetry.io/proto/otlp v0.11.0 // indirect
|
||||||
go.uber.org/atomic v1.7.0 // indirect
|
go.uber.org/atomic v1.7.0 // indirect
|
||||||
go.uber.org/multierr v1.6.0 // indirect
|
go.uber.org/multierr v1.6.0 // indirect
|
||||||
go.uber.org/zap v1.19.0 // indirect
|
go.uber.org/zap v1.19.0 // indirect
|
||||||
golang.org/x/sys v0.8.0 // indirect
|
golang.org/x/sys v0.13.0 // indirect
|
||||||
golang.org/x/term v0.8.0 // indirect
|
golang.org/x/term v0.13.0 // indirect
|
||||||
google.golang.org/api v0.110.0 // indirect
|
google.golang.org/api v0.110.0 // indirect
|
||||||
google.golang.org/appengine v1.6.7 // indirect
|
google.golang.org/appengine v1.6.7 // indirect
|
||||||
google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8 // indirect
|
google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8 // indirect
|
||||||
|
49
src/go.sum
49
src/go.sum
@ -212,8 +212,8 @@ github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KE
|
|||||||
github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
|
github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
|
||||||
github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI=
|
github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI=
|
||||||
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
|
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
|
||||||
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
||||||
@ -721,8 +721,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
|
|||||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
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.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||||
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||||
github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
|
github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
|
||||||
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/tencentcloud/tencentcloud-sdk-go v1.0.62 h1:Vnr3IqaafEuQUciG6D6EaeLJm26Mg8sjAfbI4OoeauM=
|
github.com/tencentcloud/tencentcloud-sdk-go v1.0.62 h1:Vnr3IqaafEuQUciG6D6EaeLJm26Mg8sjAfbI4OoeauM=
|
||||||
@ -764,16 +764,15 @@ go.opentelemetry.io/contrib v0.22.0 h1:0F7gDEjgb1WGn4ODIjaCAg75hmqF+UN0LiVgwxsCo
|
|||||||
go.opentelemetry.io/contrib v0.22.0/go.mod h1:EH4yDYeNoaTqn/8yCWQmfNB78VHfGX2Jt2bvnvzBlGM=
|
go.opentelemetry.io/contrib v0.22.0/go.mod h1:EH4yDYeNoaTqn/8yCWQmfNB78VHfGX2Jt2bvnvzBlGM=
|
||||||
go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.22.0 h1:Mfz1DMQ43mhQePKqiny6kUTnUrtin+395V67yAIyYhg=
|
go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.22.0 h1:Mfz1DMQ43mhQePKqiny6kUTnUrtin+395V67yAIyYhg=
|
||||||
go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.22.0/go.mod h1:jpoprhHaffWHQ1KBpL0jI+w7979p4ijAL2auucLUj1E=
|
go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.22.0/go.mod h1:jpoprhHaffWHQ1KBpL0jI+w7979p4ijAL2auucLUj1E=
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.22.0 h1:WHjZguqT+3UjTgFum33hWZYybDVnx8u9q5/kQDfaGTs=
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.45.0 h1:x8Z78aZx8cOF0+Kkazoc7lwUNMGy0LrzEMxTm4BbTxg=
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.22.0/go.mod h1:o3MuU25bYroYnc2TOKe8mTk8f9X1oPFO6C5RCoPKtSU=
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.45.0/go.mod h1:62CPTSry9QZtOaSsE3tOzhx6LzDhHnXJ6xHeMNNiM6Q=
|
||||||
go.opentelemetry.io/contrib/propagators v0.22.0 h1:KGdv58M2//veiYLIhb31mofaI2LgkIPXXAZVeYVyfd8=
|
go.opentelemetry.io/contrib/propagators v0.22.0 h1:KGdv58M2//veiYLIhb31mofaI2LgkIPXXAZVeYVyfd8=
|
||||||
go.opentelemetry.io/contrib/propagators v0.22.0/go.mod h1:xGOuXr6lLIF9BXipA4pm6UuOSI0M98U6tsI3khbOiwU=
|
go.opentelemetry.io/contrib/propagators v0.22.0/go.mod h1:xGOuXr6lLIF9BXipA4pm6UuOSI0M98U6tsI3khbOiwU=
|
||||||
go.opentelemetry.io/otel v1.0.0-RC1/go.mod h1:x9tRa9HK4hSSq7jf2TKbqFbtt58/TGk0f9XiEYISI1I=
|
|
||||||
go.opentelemetry.io/otel v1.0.0-RC2/go.mod h1:w1thVQ7qbAy8MHb0IFj8a5Q2QU0l2ksf8u/CN8m3NOM=
|
go.opentelemetry.io/otel v1.0.0-RC2/go.mod h1:w1thVQ7qbAy8MHb0IFj8a5Q2QU0l2ksf8u/CN8m3NOM=
|
||||||
go.opentelemetry.io/otel v1.0.0/go.mod h1:AjRVh9A5/5DE7S+mZtTR6t8vpKKryam+0lREnfmS4cg=
|
go.opentelemetry.io/otel v1.0.0/go.mod h1:AjRVh9A5/5DE7S+mZtTR6t8vpKKryam+0lREnfmS4cg=
|
||||||
go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs=
|
go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs=
|
||||||
go.opentelemetry.io/otel v1.14.0 h1:/79Huy8wbf5DnIPhemGB+zEPVwnN6fuQybr/SRXa6hM=
|
go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=
|
||||||
go.opentelemetry.io/otel v1.14.0/go.mod h1:o4buv+dJzx8rohcUeRmWUZhqupFvzWis188WlggnNeU=
|
go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=
|
||||||
go.opentelemetry.io/otel/exporters/jaeger v1.0.0 h1:cLhx8llHw02h5JTqGqaRbYn+QVKHmrzD9vEbKnSPk5U=
|
go.opentelemetry.io/otel/exporters/jaeger v1.0.0 h1:cLhx8llHw02h5JTqGqaRbYn+QVKHmrzD9vEbKnSPk5U=
|
||||||
go.opentelemetry.io/otel/exporters/jaeger v1.0.0/go.mod h1:q10N1AolE1JjqKrFJK2tYw0iZpmX+HBaXBtuCzRnBGQ=
|
go.opentelemetry.io/otel/exporters/jaeger v1.0.0/go.mod h1:q10N1AolE1JjqKrFJK2tYw0iZpmX+HBaXBtuCzRnBGQ=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0 h1:R/OBkMoGgfy2fLhs2QhkCI1w4HLEQX92GCcJB6SSdNk=
|
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0 h1:R/OBkMoGgfy2fLhs2QhkCI1w4HLEQX92GCcJB6SSdNk=
|
||||||
@ -782,23 +781,19 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0 h1:giGm8w67Ja7amYNfYMdm
|
|||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0 h1:Ydage/P0fRrSPpZeCVxzjqGcI6iVmG2xb43+IR8cjqM=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0 h1:Ydage/P0fRrSPpZeCVxzjqGcI6iVmG2xb43+IR8cjqM=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE=
|
||||||
go.opentelemetry.io/otel/internal/metric v0.22.0 h1:Q9bS02XRykSRIbggaU4hVF9oWOP9PyILu26zJWoKmk0=
|
go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=
|
||||||
go.opentelemetry.io/otel/internal/metric v0.22.0/go.mod h1:7qVuMihW/ktMonEfOvBXuh6tfMvvEyoIDgeJNRloYbQ=
|
go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=
|
||||||
go.opentelemetry.io/otel/metric v0.22.0 h1:/qv10BzznqEifrXBwsTT370OCN1PRgt+mnjzMwxJKrQ=
|
|
||||||
go.opentelemetry.io/otel/metric v0.22.0/go.mod h1:KcsUkBiYGW003DJ+ugd2aqIRIfjabD9jeOUXqsAtrq0=
|
|
||||||
go.opentelemetry.io/otel/oteltest v1.0.0-RC1/go.mod h1:+eoIG0gdEOaPNftuy1YScLr1Gb4mL/9lpDkZ0JjMRq4=
|
|
||||||
go.opentelemetry.io/otel/oteltest v1.0.0-RC2 h1:xNKqMhlZYkASSyvF4JwObZFMq0jhFN3c3SP+2rCzVPk=
|
go.opentelemetry.io/otel/oteltest v1.0.0-RC2 h1:xNKqMhlZYkASSyvF4JwObZFMq0jhFN3c3SP+2rCzVPk=
|
||||||
go.opentelemetry.io/otel/oteltest v1.0.0-RC2/go.mod h1:kiQ4tw5tAL4JLTbcOYwK1CWI1HkT5aiLzHovgOVnz/A=
|
go.opentelemetry.io/otel/oteltest v1.0.0-RC2/go.mod h1:kiQ4tw5tAL4JLTbcOYwK1CWI1HkT5aiLzHovgOVnz/A=
|
||||||
go.opentelemetry.io/otel/sdk v1.0.0/go.mod h1:PCrDHlSy5x1kjezSdL37PhbFUMjrsLRshJ2zCzeXwbM=
|
go.opentelemetry.io/otel/sdk v1.0.0/go.mod h1:PCrDHlSy5x1kjezSdL37PhbFUMjrsLRshJ2zCzeXwbM=
|
||||||
go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs=
|
go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs=
|
||||||
go.opentelemetry.io/otel/sdk v1.8.0 h1:xwu69/fNuwbSHWe/0PGS888RmjWY181OmcXDQKu7ZQk=
|
go.opentelemetry.io/otel/sdk v1.8.0 h1:xwu69/fNuwbSHWe/0PGS888RmjWY181OmcXDQKu7ZQk=
|
||||||
go.opentelemetry.io/otel/sdk v1.8.0/go.mod h1:uPSfc+yfDH2StDM/Rm35WE8gXSNdvCg023J6HeGNO0c=
|
go.opentelemetry.io/otel/sdk v1.8.0/go.mod h1:uPSfc+yfDH2StDM/Rm35WE8gXSNdvCg023J6HeGNO0c=
|
||||||
go.opentelemetry.io/otel/trace v1.0.0-RC1/go.mod h1:86UHmyHWFEtWjfWPSbu0+d0Pf9Q6e1U+3ViBOc+NXAg=
|
|
||||||
go.opentelemetry.io/otel/trace v1.0.0-RC2/go.mod h1:JPQ+z6nNw9mqEGT8o3eoPTdnNI+Aj5JcxEsVGREIAy4=
|
go.opentelemetry.io/otel/trace v1.0.0-RC2/go.mod h1:JPQ+z6nNw9mqEGT8o3eoPTdnNI+Aj5JcxEsVGREIAy4=
|
||||||
go.opentelemetry.io/otel/trace v1.0.0/go.mod h1:PXTWqayeFUlJV1YDNhsJYB184+IvAH814St6o6ajzIs=
|
go.opentelemetry.io/otel/trace v1.0.0/go.mod h1:PXTWqayeFUlJV1YDNhsJYB184+IvAH814St6o6ajzIs=
|
||||||
go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk=
|
go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk=
|
||||||
go.opentelemetry.io/otel/trace v1.14.0 h1:wp2Mmvj41tDsyAJXiWDWpfNsOiIyd38fy85pyKcFq/M=
|
go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=
|
||||||
go.opentelemetry.io/otel/trace v1.14.0/go.mod h1:8avnQLK+CG77yNLUae4ea2JDQ6iT+gozhnZjy/rw9G8=
|
go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=
|
||||||
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.11.0 h1:cLDgIBTf4lLOlztkhzAEdQsJ4Lj+i5Wc9k6Nn0K1VyU=
|
go.opentelemetry.io/proto/otlp v0.11.0 h1:cLDgIBTf4lLOlztkhzAEdQsJ4Lj+i5Wc9k6Nn0K1VyU=
|
||||||
go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ=
|
go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ=
|
||||||
@ -846,8 +841,8 @@ golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5y
|
|||||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||||
golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
|
golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
|
||||||
golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A=
|
golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc=
|
||||||
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
|
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||||
@ -929,8 +924,8 @@ golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su
|
|||||||
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||||
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||||
golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
|
golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
|
||||||
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
@ -1017,14 +1012,14 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc
|
|||||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
|
golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
|
||||||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||||
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
||||||
golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols=
|
golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek=
|
||||||
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
|
golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
|
||||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
@ -1034,8 +1029,8 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
|||||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||||
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||||
golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
|
golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
|
||||||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44=
|
golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44=
|
||||||
|
3
src/vendor/github.com/go-logr/logr/.golangci.yaml
generated
vendored
3
src/vendor/github.com/go-logr/logr/.golangci.yaml
generated
vendored
@ -6,7 +6,6 @@ linters:
|
|||||||
disable-all: true
|
disable-all: true
|
||||||
enable:
|
enable:
|
||||||
- asciicheck
|
- asciicheck
|
||||||
- deadcode
|
|
||||||
- errcheck
|
- errcheck
|
||||||
- forcetypeassert
|
- forcetypeassert
|
||||||
- gocritic
|
- gocritic
|
||||||
@ -18,10 +17,8 @@ linters:
|
|||||||
- misspell
|
- misspell
|
||||||
- revive
|
- revive
|
||||||
- staticcheck
|
- staticcheck
|
||||||
- structcheck
|
|
||||||
- typecheck
|
- typecheck
|
||||||
- unused
|
- unused
|
||||||
- varcheck
|
|
||||||
|
|
||||||
issues:
|
issues:
|
||||||
exclude-use-default: false
|
exclude-use-default: false
|
||||||
|
32
src/vendor/github.com/go-logr/logr/discard.go
generated
vendored
32
src/vendor/github.com/go-logr/logr/discard.go
generated
vendored
@ -20,35 +20,5 @@ package logr
|
|||||||
// used whenever the caller is not interested in the logs. Logger instances
|
// used whenever the caller is not interested in the logs. Logger instances
|
||||||
// produced by this function always compare as equal.
|
// produced by this function always compare as equal.
|
||||||
func Discard() Logger {
|
func Discard() Logger {
|
||||||
return Logger{
|
return New(nil)
|
||||||
level: 0,
|
|
||||||
sink: discardLogSink{},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// discardLogSink is a LogSink that discards all messages.
|
|
||||||
type discardLogSink struct{}
|
|
||||||
|
|
||||||
// Verify that it actually implements the interface
|
|
||||||
var _ LogSink = discardLogSink{}
|
|
||||||
|
|
||||||
func (l discardLogSink) Init(RuntimeInfo) {
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l discardLogSink) Enabled(int) bool {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l discardLogSink) Info(int, string, ...interface{}) {
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l discardLogSink) Error(error, string, ...interface{}) {
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l discardLogSink) WithValues(...interface{}) LogSink {
|
|
||||||
return l
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l discardLogSink) WithName(string) LogSink {
|
|
||||||
return l
|
|
||||||
}
|
}
|
||||||
|
27
src/vendor/github.com/go-logr/logr/funcr/funcr.go
generated
vendored
27
src/vendor/github.com/go-logr/logr/funcr/funcr.go
generated
vendored
@ -21,13 +21,13 @@ limitations under the License.
|
|||||||
// github.com/go-logr/logr.LogSink with output through an arbitrary
|
// github.com/go-logr/logr.LogSink with output through an arbitrary
|
||||||
// "write" function. See New and NewJSON for details.
|
// "write" function. See New and NewJSON for details.
|
||||||
//
|
//
|
||||||
// Custom LogSinks
|
// # Custom LogSinks
|
||||||
//
|
//
|
||||||
// For users who need more control, a funcr.Formatter can be embedded inside
|
// For users who need more control, a funcr.Formatter can be embedded inside
|
||||||
// your own custom LogSink implementation. This is useful when the LogSink
|
// your own custom LogSink implementation. This is useful when the LogSink
|
||||||
// needs to implement additional methods, for example.
|
// needs to implement additional methods, for example.
|
||||||
//
|
//
|
||||||
// Formatting
|
// # Formatting
|
||||||
//
|
//
|
||||||
// This will respect logr.Marshaler, fmt.Stringer, and error interfaces for
|
// This will respect logr.Marshaler, fmt.Stringer, and error interfaces for
|
||||||
// values which are being logged. When rendering a struct, funcr will use Go's
|
// values which are being logged. When rendering a struct, funcr will use Go's
|
||||||
@ -37,6 +37,7 @@ package funcr
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding"
|
"encoding"
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"reflect"
|
"reflect"
|
||||||
@ -217,7 +218,7 @@ func newFormatter(opts Options, outfmt outputFormat) Formatter {
|
|||||||
prefix: "",
|
prefix: "",
|
||||||
values: nil,
|
values: nil,
|
||||||
depth: 0,
|
depth: 0,
|
||||||
opts: opts,
|
opts: &opts,
|
||||||
}
|
}
|
||||||
return f
|
return f
|
||||||
}
|
}
|
||||||
@ -231,7 +232,7 @@ type Formatter struct {
|
|||||||
values []interface{}
|
values []interface{}
|
||||||
valuesStr string
|
valuesStr string
|
||||||
depth int
|
depth int
|
||||||
opts Options
|
opts *Options
|
||||||
}
|
}
|
||||||
|
|
||||||
// outputFormat indicates which outputFormat to use.
|
// outputFormat indicates which outputFormat to use.
|
||||||
@ -447,6 +448,7 @@ func (f Formatter) prettyWithFlags(value interface{}, flags uint32, depth int) s
|
|||||||
if flags&flagRawStruct == 0 {
|
if flags&flagRawStruct == 0 {
|
||||||
buf.WriteByte('{')
|
buf.WriteByte('{')
|
||||||
}
|
}
|
||||||
|
printComma := false // testing i>0 is not enough because of JSON omitted fields
|
||||||
for i := 0; i < t.NumField(); i++ {
|
for i := 0; i < t.NumField(); i++ {
|
||||||
fld := t.Field(i)
|
fld := t.Field(i)
|
||||||
if fld.PkgPath != "" {
|
if fld.PkgPath != "" {
|
||||||
@ -478,9 +480,10 @@ func (f Formatter) prettyWithFlags(value interface{}, flags uint32, depth int) s
|
|||||||
if omitempty && isEmpty(v.Field(i)) {
|
if omitempty && isEmpty(v.Field(i)) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if i > 0 {
|
if printComma {
|
||||||
buf.WriteByte(',')
|
buf.WriteByte(',')
|
||||||
}
|
}
|
||||||
|
printComma = true // if we got here, we are rendering a field
|
||||||
if fld.Anonymous && fld.Type.Kind() == reflect.Struct && name == "" {
|
if fld.Anonymous && fld.Type.Kind() == reflect.Struct && name == "" {
|
||||||
buf.WriteString(f.prettyWithFlags(v.Field(i).Interface(), flags|flagRawStruct, depth+1))
|
buf.WriteString(f.prettyWithFlags(v.Field(i).Interface(), flags|flagRawStruct, depth+1))
|
||||||
continue
|
continue
|
||||||
@ -500,6 +503,20 @@ func (f Formatter) prettyWithFlags(value interface{}, flags uint32, depth int) s
|
|||||||
}
|
}
|
||||||
return buf.String()
|
return buf.String()
|
||||||
case reflect.Slice, reflect.Array:
|
case reflect.Slice, reflect.Array:
|
||||||
|
// If this is outputing as JSON make sure this isn't really a json.RawMessage.
|
||||||
|
// If so just emit "as-is" and don't pretty it as that will just print
|
||||||
|
// it as [X,Y,Z,...] which isn't terribly useful vs the string form you really want.
|
||||||
|
if f.outputFormat == outputJSON {
|
||||||
|
if rm, ok := value.(json.RawMessage); ok {
|
||||||
|
// If it's empty make sure we emit an empty value as the array style would below.
|
||||||
|
if len(rm) > 0 {
|
||||||
|
buf.Write(rm)
|
||||||
|
} else {
|
||||||
|
buf.WriteString("null")
|
||||||
|
}
|
||||||
|
return buf.String()
|
||||||
|
}
|
||||||
|
}
|
||||||
buf.WriteByte('[')
|
buf.WriteByte('[')
|
||||||
for i := 0; i < v.Len(); i++ {
|
for i := 0; i < v.Len(); i++ {
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
|
166
src/vendor/github.com/go-logr/logr/logr.go
generated
vendored
166
src/vendor/github.com/go-logr/logr/logr.go
generated
vendored
@ -21,7 +21,7 @@ limitations under the License.
|
|||||||
// to back that API. Packages in the Go ecosystem can depend on this package,
|
// to back that API. Packages in the Go ecosystem can depend on this package,
|
||||||
// while callers can implement logging with whatever backend is appropriate.
|
// while callers can implement logging with whatever backend is appropriate.
|
||||||
//
|
//
|
||||||
// Usage
|
// # Usage
|
||||||
//
|
//
|
||||||
// Logging is done using a Logger instance. Logger is a concrete type with
|
// Logging is done using a Logger instance. Logger is a concrete type with
|
||||||
// methods, which defers the actual logging to a LogSink interface. The main
|
// methods, which defers the actual logging to a LogSink interface. The main
|
||||||
@ -30,16 +30,20 @@ limitations under the License.
|
|||||||
// "structured logging".
|
// "structured logging".
|
||||||
//
|
//
|
||||||
// With Go's standard log package, we might write:
|
// With Go's standard log package, we might write:
|
||||||
// log.Printf("setting target value %s", targetValue)
|
//
|
||||||
|
// log.Printf("setting target value %s", targetValue)
|
||||||
//
|
//
|
||||||
// With logr's structured logging, we'd write:
|
// With logr's structured logging, we'd write:
|
||||||
// logger.Info("setting target", "value", targetValue)
|
//
|
||||||
|
// logger.Info("setting target", "value", targetValue)
|
||||||
//
|
//
|
||||||
// Errors are much the same. Instead of:
|
// Errors are much the same. Instead of:
|
||||||
// log.Printf("failed to open the pod bay door for user %s: %v", user, err)
|
//
|
||||||
|
// log.Printf("failed to open the pod bay door for user %s: %v", user, err)
|
||||||
//
|
//
|
||||||
// We'd write:
|
// We'd write:
|
||||||
// logger.Error(err, "failed to open the pod bay door", "user", user)
|
//
|
||||||
|
// logger.Error(err, "failed to open the pod bay door", "user", user)
|
||||||
//
|
//
|
||||||
// Info() and Error() are very similar, but they are separate methods so that
|
// Info() and Error() are very similar, but they are separate methods so that
|
||||||
// LogSink implementations can choose to do things like attach additional
|
// LogSink implementations can choose to do things like attach additional
|
||||||
@ -47,7 +51,7 @@ limitations under the License.
|
|||||||
// always logged, regardless of the current verbosity. If there is no error
|
// always logged, regardless of the current verbosity. If there is no error
|
||||||
// instance available, passing nil is valid.
|
// instance available, passing nil is valid.
|
||||||
//
|
//
|
||||||
// Verbosity
|
// # Verbosity
|
||||||
//
|
//
|
||||||
// Often we want to log information only when the application in "verbose
|
// Often we want to log information only when the application in "verbose
|
||||||
// mode". To write log lines that are more verbose, Logger has a V() method.
|
// mode". To write log lines that are more verbose, Logger has a V() method.
|
||||||
@ -58,20 +62,22 @@ limitations under the License.
|
|||||||
// Error messages do not have a verbosity level and are always logged.
|
// Error messages do not have a verbosity level and are always logged.
|
||||||
//
|
//
|
||||||
// Where we might have written:
|
// Where we might have written:
|
||||||
// if flVerbose >= 2 {
|
//
|
||||||
// log.Printf("an unusual thing happened")
|
// if flVerbose >= 2 {
|
||||||
// }
|
// log.Printf("an unusual thing happened")
|
||||||
|
// }
|
||||||
//
|
//
|
||||||
// We can write:
|
// We can write:
|
||||||
// logger.V(2).Info("an unusual thing happened")
|
|
||||||
//
|
//
|
||||||
// Logger Names
|
// logger.V(2).Info("an unusual thing happened")
|
||||||
|
//
|
||||||
|
// # Logger Names
|
||||||
//
|
//
|
||||||
// Logger instances can have name strings so that all messages logged through
|
// Logger instances can have name strings so that all messages logged through
|
||||||
// that instance have additional context. For example, you might want to add
|
// that instance have additional context. For example, you might want to add
|
||||||
// a subsystem name:
|
// a subsystem name:
|
||||||
//
|
//
|
||||||
// logger.WithName("compactor").Info("started", "time", time.Now())
|
// logger.WithName("compactor").Info("started", "time", time.Now())
|
||||||
//
|
//
|
||||||
// The WithName() method returns a new Logger, which can be passed to
|
// The WithName() method returns a new Logger, which can be passed to
|
||||||
// constructors or other functions for further use. Repeated use of WithName()
|
// constructors or other functions for further use. Repeated use of WithName()
|
||||||
@ -82,25 +88,27 @@ limitations under the License.
|
|||||||
// joining operation (e.g. whitespace, commas, periods, slashes, brackets,
|
// joining operation (e.g. whitespace, commas, periods, slashes, brackets,
|
||||||
// quotes, etc).
|
// quotes, etc).
|
||||||
//
|
//
|
||||||
// Saved Values
|
// # Saved Values
|
||||||
//
|
//
|
||||||
// Logger instances can store any number of key/value pairs, which will be
|
// Logger instances can store any number of key/value pairs, which will be
|
||||||
// logged alongside all messages logged through that instance. For example,
|
// logged alongside all messages logged through that instance. For example,
|
||||||
// you might want to create a Logger instance per managed object:
|
// you might want to create a Logger instance per managed object:
|
||||||
//
|
//
|
||||||
// With the standard log package, we might write:
|
// With the standard log package, we might write:
|
||||||
// log.Printf("decided to set field foo to value %q for object %s/%s",
|
//
|
||||||
// targetValue, object.Namespace, object.Name)
|
// log.Printf("decided to set field foo to value %q for object %s/%s",
|
||||||
|
// targetValue, object.Namespace, object.Name)
|
||||||
//
|
//
|
||||||
// With logr we'd write:
|
// With logr we'd write:
|
||||||
// // Elsewhere: set up the logger to log the object name.
|
|
||||||
// obj.logger = mainLogger.WithValues(
|
|
||||||
// "name", obj.name, "namespace", obj.namespace)
|
|
||||||
//
|
//
|
||||||
// // later on...
|
// // Elsewhere: set up the logger to log the object name.
|
||||||
// obj.logger.Info("setting foo", "value", targetValue)
|
// obj.logger = mainLogger.WithValues(
|
||||||
|
// "name", obj.name, "namespace", obj.namespace)
|
||||||
//
|
//
|
||||||
// Best Practices
|
// // later on...
|
||||||
|
// obj.logger.Info("setting foo", "value", targetValue)
|
||||||
|
//
|
||||||
|
// # Best Practices
|
||||||
//
|
//
|
||||||
// Logger has very few hard rules, with the goal that LogSink implementations
|
// Logger has very few hard rules, with the goal that LogSink implementations
|
||||||
// might have a lot of freedom to differentiate. There are, however, some
|
// might have a lot of freedom to differentiate. There are, however, some
|
||||||
@ -124,15 +132,15 @@ limitations under the License.
|
|||||||
// around. For cases where passing a logger is optional, a pointer to Logger
|
// around. For cases where passing a logger is optional, a pointer to Logger
|
||||||
// should be used.
|
// should be used.
|
||||||
//
|
//
|
||||||
// Key Naming Conventions
|
// # Key Naming Conventions
|
||||||
//
|
//
|
||||||
// Keys are not strictly required to conform to any specification or regex, but
|
// Keys are not strictly required to conform to any specification or regex, but
|
||||||
// it is recommended that they:
|
// it is recommended that they:
|
||||||
// * be human-readable and meaningful (not auto-generated or simple ordinals)
|
// - be human-readable and meaningful (not auto-generated or simple ordinals)
|
||||||
// * be constant (not dependent on input data)
|
// - be constant (not dependent on input data)
|
||||||
// * contain only printable characters
|
// - contain only printable characters
|
||||||
// * not contain whitespace or punctuation
|
// - not contain whitespace or punctuation
|
||||||
// * use lower case for simple keys and lowerCamelCase for more complex ones
|
// - use lower case for simple keys and lowerCamelCase for more complex ones
|
||||||
//
|
//
|
||||||
// These guidelines help ensure that log data is processed properly regardless
|
// These guidelines help ensure that log data is processed properly regardless
|
||||||
// of the log implementation. For example, log implementations will try to
|
// of the log implementation. For example, log implementations will try to
|
||||||
@ -141,51 +149,54 @@ limitations under the License.
|
|||||||
// While users are generally free to use key names of their choice, it's
|
// While users are generally free to use key names of their choice, it's
|
||||||
// generally best to avoid using the following keys, as they're frequently used
|
// generally best to avoid using the following keys, as they're frequently used
|
||||||
// by implementations:
|
// by implementations:
|
||||||
// * "caller": the calling information (file/line) of a particular log line
|
// - "caller": the calling information (file/line) of a particular log line
|
||||||
// * "error": the underlying error value in the `Error` method
|
// - "error": the underlying error value in the `Error` method
|
||||||
// * "level": the log level
|
// - "level": the log level
|
||||||
// * "logger": the name of the associated logger
|
// - "logger": the name of the associated logger
|
||||||
// * "msg": the log message
|
// - "msg": the log message
|
||||||
// * "stacktrace": the stack trace associated with a particular log line or
|
// - "stacktrace": the stack trace associated with a particular log line or
|
||||||
// error (often from the `Error` message)
|
// error (often from the `Error` message)
|
||||||
// * "ts": the timestamp for a log line
|
// - "ts": the timestamp for a log line
|
||||||
//
|
//
|
||||||
// Implementations are encouraged to make use of these keys to represent the
|
// Implementations are encouraged to make use of these keys to represent the
|
||||||
// above concepts, when necessary (for example, in a pure-JSON output form, it
|
// above concepts, when necessary (for example, in a pure-JSON output form, it
|
||||||
// would be necessary to represent at least message and timestamp as ordinary
|
// would be necessary to represent at least message and timestamp as ordinary
|
||||||
// named values).
|
// named values).
|
||||||
//
|
//
|
||||||
// Break Glass
|
// # Break Glass
|
||||||
//
|
//
|
||||||
// Implementations may choose to give callers access to the underlying
|
// Implementations may choose to give callers access to the underlying
|
||||||
// logging implementation. The recommended pattern for this is:
|
// logging implementation. The recommended pattern for this is:
|
||||||
// // Underlier exposes access to the underlying logging implementation.
|
//
|
||||||
// // Since callers only have a logr.Logger, they have to know which
|
// // Underlier exposes access to the underlying logging implementation.
|
||||||
// // implementation is in use, so this interface is less of an abstraction
|
// // Since callers only have a logr.Logger, they have to know which
|
||||||
// // and more of way to test type conversion.
|
// // implementation is in use, so this interface is less of an abstraction
|
||||||
// type Underlier interface {
|
// // and more of way to test type conversion.
|
||||||
// GetUnderlying() <underlying-type>
|
// type Underlier interface {
|
||||||
// }
|
// GetUnderlying() <underlying-type>
|
||||||
|
// }
|
||||||
//
|
//
|
||||||
// Logger grants access to the sink to enable type assertions like this:
|
// Logger grants access to the sink to enable type assertions like this:
|
||||||
// func DoSomethingWithImpl(log logr.Logger) {
|
//
|
||||||
// if underlier, ok := log.GetSink()(impl.Underlier) {
|
// func DoSomethingWithImpl(log logr.Logger) {
|
||||||
// implLogger := underlier.GetUnderlying()
|
// if underlier, ok := log.GetSink().(impl.Underlier); ok {
|
||||||
// ...
|
// implLogger := underlier.GetUnderlying()
|
||||||
// }
|
// ...
|
||||||
// }
|
// }
|
||||||
|
// }
|
||||||
//
|
//
|
||||||
// Custom `With*` functions can be implemented by copying the complete
|
// Custom `With*` functions can be implemented by copying the complete
|
||||||
// Logger struct and replacing the sink in the copy:
|
// Logger struct and replacing the sink in the copy:
|
||||||
// // WithFooBar changes the foobar parameter in the log sink and returns a
|
//
|
||||||
// // new logger with that modified sink. It does nothing for loggers where
|
// // WithFooBar changes the foobar parameter in the log sink and returns a
|
||||||
// // the sink doesn't support that parameter.
|
// // new logger with that modified sink. It does nothing for loggers where
|
||||||
// func WithFoobar(log logr.Logger, foobar int) logr.Logger {
|
// // the sink doesn't support that parameter.
|
||||||
// if foobarLogSink, ok := log.GetSink()(FoobarSink); ok {
|
// func WithFoobar(log logr.Logger, foobar int) logr.Logger {
|
||||||
// log = log.WithSink(foobarLogSink.WithFooBar(foobar))
|
// if foobarLogSink, ok := log.GetSink().(FoobarSink); ok {
|
||||||
// }
|
// log = log.WithSink(foobarLogSink.WithFooBar(foobar))
|
||||||
// return log
|
// }
|
||||||
// }
|
// return log
|
||||||
|
// }
|
||||||
//
|
//
|
||||||
// Don't use New to construct a new Logger with a LogSink retrieved from an
|
// Don't use New to construct a new Logger with a LogSink retrieved from an
|
||||||
// existing Logger. Source code attribution might not work correctly and
|
// existing Logger. Source code attribution might not work correctly and
|
||||||
@ -201,11 +212,14 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// New returns a new Logger instance. This is primarily used by libraries
|
// New returns a new Logger instance. This is primarily used by libraries
|
||||||
// implementing LogSink, rather than end users.
|
// implementing LogSink, rather than end users. Passing a nil sink will create
|
||||||
|
// a Logger which discards all log lines.
|
||||||
func New(sink LogSink) Logger {
|
func New(sink LogSink) Logger {
|
||||||
logger := Logger{}
|
logger := Logger{}
|
||||||
logger.setSink(sink)
|
logger.setSink(sink)
|
||||||
sink.Init(runtimeInfo)
|
if sink != nil {
|
||||||
|
sink.Init(runtimeInfo)
|
||||||
|
}
|
||||||
return logger
|
return logger
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -244,7 +258,7 @@ type Logger struct {
|
|||||||
// Enabled tests whether this Logger is enabled. For example, commandline
|
// Enabled tests whether this Logger is enabled. For example, commandline
|
||||||
// flags might be used to set the logging verbosity and disable some info logs.
|
// flags might be used to set the logging verbosity and disable some info logs.
|
||||||
func (l Logger) Enabled() bool {
|
func (l Logger) Enabled() bool {
|
||||||
return l.sink.Enabled(l.level)
|
return l.sink != nil && l.sink.Enabled(l.level)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Info logs a non-error message with the given key/value pairs as context.
|
// Info logs a non-error message with the given key/value pairs as context.
|
||||||
@ -254,6 +268,9 @@ func (l Logger) Enabled() bool {
|
|||||||
// information. The key/value pairs must alternate string keys and arbitrary
|
// information. The key/value pairs must alternate string keys and arbitrary
|
||||||
// values.
|
// values.
|
||||||
func (l Logger) Info(msg string, keysAndValues ...interface{}) {
|
func (l Logger) Info(msg string, keysAndValues ...interface{}) {
|
||||||
|
if l.sink == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
if l.Enabled() {
|
if l.Enabled() {
|
||||||
if withHelper, ok := l.sink.(CallStackHelperLogSink); ok {
|
if withHelper, ok := l.sink.(CallStackHelperLogSink); ok {
|
||||||
withHelper.GetCallStackHelper()()
|
withHelper.GetCallStackHelper()()
|
||||||
@ -273,6 +290,9 @@ func (l Logger) Info(msg string, keysAndValues ...interface{}) {
|
|||||||
// triggered this log line, if present. The err parameter is optional
|
// triggered this log line, if present. The err parameter is optional
|
||||||
// and nil may be passed instead of an error instance.
|
// and nil may be passed instead of an error instance.
|
||||||
func (l Logger) Error(err error, msg string, keysAndValues ...interface{}) {
|
func (l Logger) Error(err error, msg string, keysAndValues ...interface{}) {
|
||||||
|
if l.sink == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
if withHelper, ok := l.sink.(CallStackHelperLogSink); ok {
|
if withHelper, ok := l.sink.(CallStackHelperLogSink); ok {
|
||||||
withHelper.GetCallStackHelper()()
|
withHelper.GetCallStackHelper()()
|
||||||
}
|
}
|
||||||
@ -284,6 +304,9 @@ func (l Logger) Error(err error, msg string, keysAndValues ...interface{}) {
|
|||||||
// level means a log message is less important. Negative V-levels are treated
|
// level means a log message is less important. Negative V-levels are treated
|
||||||
// as 0.
|
// as 0.
|
||||||
func (l Logger) V(level int) Logger {
|
func (l Logger) V(level int) Logger {
|
||||||
|
if l.sink == nil {
|
||||||
|
return l
|
||||||
|
}
|
||||||
if level < 0 {
|
if level < 0 {
|
||||||
level = 0
|
level = 0
|
||||||
}
|
}
|
||||||
@ -294,6 +317,9 @@ func (l Logger) V(level int) Logger {
|
|||||||
// WithValues returns a new Logger instance with additional key/value pairs.
|
// WithValues returns a new Logger instance with additional key/value pairs.
|
||||||
// See Info for documentation on how key/value pairs work.
|
// See Info for documentation on how key/value pairs work.
|
||||||
func (l Logger) WithValues(keysAndValues ...interface{}) Logger {
|
func (l Logger) WithValues(keysAndValues ...interface{}) Logger {
|
||||||
|
if l.sink == nil {
|
||||||
|
return l
|
||||||
|
}
|
||||||
l.setSink(l.sink.WithValues(keysAndValues...))
|
l.setSink(l.sink.WithValues(keysAndValues...))
|
||||||
return l
|
return l
|
||||||
}
|
}
|
||||||
@ -304,6 +330,9 @@ func (l Logger) WithValues(keysAndValues ...interface{}) Logger {
|
|||||||
// contain only letters, digits, and hyphens (see the package documentation for
|
// contain only letters, digits, and hyphens (see the package documentation for
|
||||||
// more information).
|
// more information).
|
||||||
func (l Logger) WithName(name string) Logger {
|
func (l Logger) WithName(name string) Logger {
|
||||||
|
if l.sink == nil {
|
||||||
|
return l
|
||||||
|
}
|
||||||
l.setSink(l.sink.WithName(name))
|
l.setSink(l.sink.WithName(name))
|
||||||
return l
|
return l
|
||||||
}
|
}
|
||||||
@ -324,6 +353,9 @@ func (l Logger) WithName(name string) Logger {
|
|||||||
// WithCallDepth(1) because it works with implementions that support the
|
// WithCallDepth(1) because it works with implementions that support the
|
||||||
// CallDepthLogSink and/or CallStackHelperLogSink interfaces.
|
// CallDepthLogSink and/or CallStackHelperLogSink interfaces.
|
||||||
func (l Logger) WithCallDepth(depth int) Logger {
|
func (l Logger) WithCallDepth(depth int) Logger {
|
||||||
|
if l.sink == nil {
|
||||||
|
return l
|
||||||
|
}
|
||||||
if withCallDepth, ok := l.sink.(CallDepthLogSink); ok {
|
if withCallDepth, ok := l.sink.(CallDepthLogSink); ok {
|
||||||
l.setSink(withCallDepth.WithCallDepth(depth))
|
l.setSink(withCallDepth.WithCallDepth(depth))
|
||||||
}
|
}
|
||||||
@ -345,6 +377,9 @@ func (l Logger) WithCallDepth(depth int) Logger {
|
|||||||
// implementation does not support either of these, the original Logger will be
|
// implementation does not support either of these, the original Logger will be
|
||||||
// returned.
|
// returned.
|
||||||
func (l Logger) WithCallStackHelper() (func(), Logger) {
|
func (l Logger) WithCallStackHelper() (func(), Logger) {
|
||||||
|
if l.sink == nil {
|
||||||
|
return func() {}, l
|
||||||
|
}
|
||||||
var helper func()
|
var helper func()
|
||||||
if withCallDepth, ok := l.sink.(CallDepthLogSink); ok {
|
if withCallDepth, ok := l.sink.(CallDepthLogSink); ok {
|
||||||
l.setSink(withCallDepth.WithCallDepth(1))
|
l.setSink(withCallDepth.WithCallDepth(1))
|
||||||
@ -357,6 +392,11 @@ func (l Logger) WithCallStackHelper() (func(), Logger) {
|
|||||||
return helper, l
|
return helper, l
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsZero returns true if this logger is an uninitialized zero value
|
||||||
|
func (l Logger) IsZero() bool {
|
||||||
|
return l.sink == nil
|
||||||
|
}
|
||||||
|
|
||||||
// contextKey is how we find Loggers in a context.Context.
|
// contextKey is how we find Loggers in a context.Context.
|
||||||
type contextKey struct{}
|
type contextKey struct{}
|
||||||
|
|
||||||
@ -442,7 +482,7 @@ type LogSink interface {
|
|||||||
WithName(name string) LogSink
|
WithName(name string) LogSink
|
||||||
}
|
}
|
||||||
|
|
||||||
// CallDepthLogSink represents a Logger that knows how to climb the call stack
|
// CallDepthLogSink represents a LogSink that knows how to climb the call stack
|
||||||
// to identify the original call site and can offset the depth by a specified
|
// to identify the original call site and can offset the depth by a specified
|
||||||
// number of frames. This is useful for users who have helper functions
|
// number of frames. This is useful for users who have helper functions
|
||||||
// between the "real" call site and the actual calls to Logger methods.
|
// between the "real" call site and the actual calls to Logger methods.
|
||||||
@ -467,7 +507,7 @@ type CallDepthLogSink interface {
|
|||||||
WithCallDepth(depth int) LogSink
|
WithCallDepth(depth int) LogSink
|
||||||
}
|
}
|
||||||
|
|
||||||
// CallStackHelperLogSink represents a Logger that knows how to climb
|
// CallStackHelperLogSink represents a LogSink that knows how to climb
|
||||||
// the call stack to identify the original call site and can skip
|
// the call stack to identify the original call site and can skip
|
||||||
// intermediate helper functions if they mark themselves as
|
// intermediate helper functions if they mark themselves as
|
||||||
// helper. Go's testing package uses that approach.
|
// helper. Go's testing package uses that approach.
|
||||||
|
36
src/vendor/github.com/stretchr/testify/assert/assertion_compare.go
generated
vendored
36
src/vendor/github.com/stretchr/testify/assert/assertion_compare.go
generated
vendored
@ -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()
|
||||||
|
216
src/vendor/github.com/stretchr/testify/assert/assertion_format.go
generated
vendored
216
src/vendor/github.com/stretchr/testify/assert/assertion_format.go
generated
vendored
@ -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()
|
||||||
|
432
src/vendor/github.com/stretchr/testify/assert/assertion_forward.go
generated
vendored
432
src/vendor/github.com/stretchr/testify/assert/assertion_forward.go
generated
vendored
File diff suppressed because it is too large
Load Diff
24
src/vendor/github.com/stretchr/testify/assert/assertion_order.go
generated
vendored
24
src/vendor/github.com/stretchr/testify/assert/assertion_order.go
generated
vendored
@ -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...)
|
||||||
}
|
}
|
||||||
|
306
src/vendor/github.com/stretchr/testify/assert/assertions.go
generated
vendored
306
src/vendor/github.com/stretchr/testify/assert/assertions.go
generated
vendored
@ -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()
|
||||||
|
43
src/vendor/github.com/stretchr/testify/assert/doc.go
generated
vendored
43
src/vendor/github.com/stretchr/testify/assert/doc.go
generated
vendored
@ -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
|
||||||
|
12
src/vendor/github.com/stretchr/testify/assert/http_assertions.go
generated
vendored
12
src/vendor/github.com/stretchr/testify/assert/http_assertions.go
generated
vendored
@ -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 {
|
||||||
|
30
src/vendor/github.com/stretchr/testify/mock/doc.go
generated
vendored
30
src/vendor/github.com/stretchr/testify/mock/doc.go
generated
vendored
@ -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.
|
||||||
|
160
src/vendor/github.com/stretchr/testify/mock/mock.go
generated
vendored
160
src/vendor/github.com/stretchr/testify/mock/mock.go
generated
vendored
@ -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))
|
||||||
|
}
|
||||||
|
23
src/vendor/github.com/stretchr/testify/require/doc.go
generated
vendored
23
src/vendor/github.com/stretchr/testify/require/doc.go
generated
vendored
@ -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()`.
|
||||||
|
444
src/vendor/github.com/stretchr/testify/require/require.go
generated
vendored
444
src/vendor/github.com/stretchr/testify/require/require.go
generated
vendored
File diff suppressed because it is too large
Load Diff
432
src/vendor/github.com/stretchr/testify/require/require_forward.go
generated
vendored
432
src/vendor/github.com/stretchr/testify/require/require_forward.go
generated
vendored
File diff suppressed because it is too large
Load Diff
59
src/vendor/github.com/stretchr/testify/suite/doc.go
generated
vendored
59
src/vendor/github.com/stretchr/testify/suite/doc.go
generated
vendored
@ -29,37 +29,38 @@
|
|||||||
// Suite object has assertion methods.
|
// Suite object has assertion methods.
|
||||||
//
|
//
|
||||||
// A crude example:
|
// A crude example:
|
||||||
// // Basic imports
|
|
||||||
// import (
|
|
||||||
// "testing"
|
|
||||||
// "github.com/stretchr/testify/assert"
|
|
||||||
// "github.com/stretchr/testify/suite"
|
|
||||||
// )
|
|
||||||
//
|
//
|
||||||
// // Define the suite, and absorb the built-in basic suite
|
// // Basic imports
|
||||||
// // functionality from testify - including a T() method which
|
// import (
|
||||||
// // returns the current testing context
|
// "testing"
|
||||||
// type ExampleTestSuite struct {
|
// "github.com/stretchr/testify/assert"
|
||||||
// suite.Suite
|
// "github.com/stretchr/testify/suite"
|
||||||
// VariableThatShouldStartAtFive int
|
// )
|
||||||
// }
|
|
||||||
//
|
//
|
||||||
// // Make sure that VariableThatShouldStartAtFive is set to five
|
// // Define the suite, and absorb the built-in basic suite
|
||||||
// // before each test
|
// // functionality from testify - including a T() method which
|
||||||
// func (suite *ExampleTestSuite) SetupTest() {
|
// // returns the current testing context
|
||||||
// suite.VariableThatShouldStartAtFive = 5
|
// type ExampleTestSuite struct {
|
||||||
// }
|
// suite.Suite
|
||||||
|
// VariableThatShouldStartAtFive int
|
||||||
|
// }
|
||||||
//
|
//
|
||||||
// // All methods that begin with "Test" are run as tests within a
|
// // Make sure that VariableThatShouldStartAtFive is set to five
|
||||||
// // suite.
|
// // before each test
|
||||||
// func (suite *ExampleTestSuite) TestExample() {
|
// func (suite *ExampleTestSuite) SetupTest() {
|
||||||
// assert.Equal(suite.T(), 5, suite.VariableThatShouldStartAtFive)
|
// suite.VariableThatShouldStartAtFive = 5
|
||||||
// suite.Equal(5, suite.VariableThatShouldStartAtFive)
|
// }
|
||||||
// }
|
|
||||||
//
|
//
|
||||||
// // In order for 'go test' to run this suite, we need to create
|
// // All methods that begin with "Test" are run as tests within a
|
||||||
// // a normal test function and pass our suite to suite.Run
|
// // suite.
|
||||||
// func TestExampleTestSuite(t *testing.T) {
|
// func (suite *ExampleTestSuite) TestExample() {
|
||||||
// suite.Run(t, new(ExampleTestSuite))
|
// assert.Equal(suite.T(), 5, suite.VariableThatShouldStartAtFive)
|
||||||
// }
|
// suite.Equal(5, suite.VariableThatShouldStartAtFive)
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // In order for 'go test' to run this suite, we need to create
|
||||||
|
// // a normal test function and pass our suite to suite.Run
|
||||||
|
// func TestExampleTestSuite(t *testing.T) {
|
||||||
|
// suite.Run(t, new(ExampleTestSuite))
|
||||||
|
// }
|
||||||
package suite
|
package suite
|
||||||
|
20
src/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/client.go
generated
vendored
20
src/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/client.go
generated
vendored
@ -12,7 +12,7 @@
|
|||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
package otelhttp
|
package otelhttp // import "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -24,12 +24,12 @@ import (
|
|||||||
|
|
||||||
// DefaultClient is the default Client and is used by Get, Head, Post and PostForm.
|
// DefaultClient is the default Client and is used by Get, Head, Post and PostForm.
|
||||||
// Please be careful of intitialization order - for example, if you change
|
// Please be careful of intitialization order - for example, if you change
|
||||||
// the global propagator, the DefaultClient might still be using the old one
|
// the global propagator, the DefaultClient might still be using the old one.
|
||||||
var DefaultClient = &http.Client{Transport: NewTransport(http.DefaultTransport)}
|
var DefaultClient = &http.Client{Transport: NewTransport(http.DefaultTransport)}
|
||||||
|
|
||||||
// Get is a convenient replacement for http.Get that adds a span around the request.
|
// Get is a convenient replacement for http.Get that adds a span around the request.
|
||||||
func Get(ctx context.Context, url string) (resp *http.Response, err error) {
|
func Get(ctx context.Context, targetURL string) (resp *http.Response, err error) {
|
||||||
req, err := http.NewRequestWithContext(ctx, "GET", url, nil)
|
req, err := http.NewRequestWithContext(ctx, "GET", targetURL, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -37,8 +37,8 @@ func Get(ctx context.Context, url string) (resp *http.Response, err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Head is a convenient replacement for http.Head that adds a span around the request.
|
// Head is a convenient replacement for http.Head that adds a span around the request.
|
||||||
func Head(ctx context.Context, url string) (resp *http.Response, err error) {
|
func Head(ctx context.Context, targetURL string) (resp *http.Response, err error) {
|
||||||
req, err := http.NewRequestWithContext(ctx, "HEAD", url, nil)
|
req, err := http.NewRequestWithContext(ctx, "HEAD", targetURL, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -46,8 +46,8 @@ func Head(ctx context.Context, url string) (resp *http.Response, err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Post is a convenient replacement for http.Post that adds a span around the request.
|
// Post is a convenient replacement for http.Post that adds a span around the request.
|
||||||
func Post(ctx context.Context, url, contentType string, body io.Reader) (resp *http.Response, err error) {
|
func Post(ctx context.Context, targetURL, contentType string, body io.Reader) (resp *http.Response, err error) {
|
||||||
req, err := http.NewRequestWithContext(ctx, "POST", url, body)
|
req, err := http.NewRequestWithContext(ctx, "POST", targetURL, body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -56,6 +56,6 @@ func Post(ctx context.Context, url, contentType string, body io.Reader) (resp *h
|
|||||||
}
|
}
|
||||||
|
|
||||||
// PostForm is a convenient replacement for http.PostForm that adds a span around the request.
|
// PostForm is a convenient replacement for http.PostForm that adds a span around the request.
|
||||||
func PostForm(ctx context.Context, url string, data url.Values) (resp *http.Response, err error) {
|
func PostForm(ctx context.Context, targetURL string, data url.Values) (resp *http.Response, err error) {
|
||||||
return Post(ctx, url, "application/x-www-form-urlencoded", strings.NewReader(data.Encode()))
|
return Post(ctx, targetURL, "application/x-www-form-urlencoded", strings.NewReader(data.Encode()))
|
||||||
}
|
}
|
||||||
|
9
src/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/common.go
generated
vendored
9
src/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/common.go
generated
vendored
@ -12,12 +12,13 @@
|
|||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
package otelhttp
|
package otelhttp // import "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
|
"go.opentelemetry.io/otel/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Attribute keys that can be added to a span.
|
// Attribute keys that can be added to a span.
|
||||||
@ -28,7 +29,7 @@ const (
|
|||||||
WriteErrorKey = attribute.Key("http.write_error") // if an error occurred while writing a reply, the string of the error (io.EOF is not recorded)
|
WriteErrorKey = attribute.Key("http.write_error") // if an error occurred while writing a reply, the string of the error (io.EOF is not recorded)
|
||||||
)
|
)
|
||||||
|
|
||||||
// Server HTTP metrics
|
// Server HTTP metrics.
|
||||||
const (
|
const (
|
||||||
RequestCount = "http.server.request_count" // Incoming request count total
|
RequestCount = "http.server.request_count" // Incoming request count total
|
||||||
RequestContentLength = "http.server.request_content_length" // Incoming request bytes total
|
RequestContentLength = "http.server.request_content_length" // Incoming request bytes total
|
||||||
@ -39,3 +40,7 @@ const (
|
|||||||
// Filter is a predicate used to determine whether a given http.request should
|
// Filter is a predicate used to determine whether a given http.request should
|
||||||
// be traced. A Filter must return true if the request should be traced.
|
// be traced. A Filter must return true if the request should be traced.
|
||||||
type Filter func(*http.Request) bool
|
type Filter func(*http.Request) bool
|
||||||
|
|
||||||
|
func newTracer(tp trace.TracerProvider) trace.Tracer {
|
||||||
|
return tp.Tracer(instrumentationName, trace.WithInstrumentationVersion(Version()))
|
||||||
|
}
|
||||||
|
81
src/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/config.go
generated
vendored
81
src/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/config.go
generated
vendored
@ -12,15 +12,15 @@
|
|||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
package otelhttp
|
package otelhttp // import "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"net/http/httptrace"
|
||||||
|
|
||||||
"go.opentelemetry.io/contrib"
|
|
||||||
"go.opentelemetry.io/otel"
|
"go.opentelemetry.io/otel"
|
||||||
"go.opentelemetry.io/otel/metric"
|
"go.opentelemetry.io/otel/metric"
|
||||||
"go.opentelemetry.io/otel/metric/global"
|
|
||||||
"go.opentelemetry.io/otel/propagation"
|
"go.opentelemetry.io/otel/propagation"
|
||||||
"go.opentelemetry.io/otel/trace"
|
"go.opentelemetry.io/otel/trace"
|
||||||
)
|
)
|
||||||
@ -32,14 +32,18 @@ const (
|
|||||||
// config represents the configuration options available for the http.Handler
|
// config represents the configuration options available for the http.Handler
|
||||||
// and http.Transport types.
|
// and http.Transport types.
|
||||||
type config struct {
|
type config struct {
|
||||||
|
ServerName string
|
||||||
Tracer trace.Tracer
|
Tracer trace.Tracer
|
||||||
Meter metric.Meter
|
Meter metric.Meter
|
||||||
Propagators propagation.TextMapPropagator
|
Propagators propagation.TextMapPropagator
|
||||||
SpanStartOptions []trace.SpanStartOption
|
SpanStartOptions []trace.SpanStartOption
|
||||||
|
PublicEndpoint bool
|
||||||
|
PublicEndpointFn func(*http.Request) bool
|
||||||
ReadEvent bool
|
ReadEvent bool
|
||||||
WriteEvent bool
|
WriteEvent bool
|
||||||
Filters []Filter
|
Filters []Filter
|
||||||
SpanNameFormatter func(string, *http.Request) string
|
SpanNameFormatter func(string, *http.Request) string
|
||||||
|
ClientTrace func(context.Context) *httptrace.ClientTrace
|
||||||
|
|
||||||
TracerProvider trace.TracerProvider
|
TracerProvider trace.TracerProvider
|
||||||
MeterProvider metric.MeterProvider
|
MeterProvider metric.MeterProvider
|
||||||
@ -59,21 +63,21 @@ func (o optionFunc) apply(c *config) {
|
|||||||
// newConfig creates a new config struct and applies opts to it.
|
// newConfig creates a new config struct and applies opts to it.
|
||||||
func newConfig(opts ...Option) *config {
|
func newConfig(opts ...Option) *config {
|
||||||
c := &config{
|
c := &config{
|
||||||
Propagators: otel.GetTextMapPropagator(),
|
Propagators: otel.GetTextMapPropagator(),
|
||||||
TracerProvider: otel.GetTracerProvider(),
|
MeterProvider: otel.GetMeterProvider(),
|
||||||
MeterProvider: global.GetMeterProvider(),
|
|
||||||
}
|
}
|
||||||
for _, opt := range opts {
|
for _, opt := range opts {
|
||||||
opt.apply(c)
|
opt.apply(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
c.Tracer = c.TracerProvider.Tracer(
|
// Tracer is only initialized if manually specified. Otherwise, can be passed with the tracing context.
|
||||||
instrumentationName,
|
if c.TracerProvider != nil {
|
||||||
trace.WithInstrumentationVersion(contrib.SemVersion()),
|
c.Tracer = newTracer(c.TracerProvider)
|
||||||
)
|
}
|
||||||
|
|
||||||
c.Meter = c.MeterProvider.Meter(
|
c.Meter = c.MeterProvider.Meter(
|
||||||
instrumentationName,
|
instrumentationName,
|
||||||
metric.WithInstrumentationVersion(contrib.SemVersion()),
|
metric.WithInstrumentationVersion(Version()),
|
||||||
)
|
)
|
||||||
|
|
||||||
return c
|
return c
|
||||||
@ -83,7 +87,9 @@ func newConfig(opts ...Option) *config {
|
|||||||
// If none is specified, the global provider is used.
|
// If none is specified, the global provider is used.
|
||||||
func WithTracerProvider(provider trace.TracerProvider) Option {
|
func WithTracerProvider(provider trace.TracerProvider) Option {
|
||||||
return optionFunc(func(cfg *config) {
|
return optionFunc(func(cfg *config) {
|
||||||
cfg.TracerProvider = provider
|
if provider != nil {
|
||||||
|
cfg.TracerProvider = provider
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -91,7 +97,9 @@ func WithTracerProvider(provider trace.TracerProvider) Option {
|
|||||||
// If none is specified, the global provider is used.
|
// If none is specified, the global provider is used.
|
||||||
func WithMeterProvider(provider metric.MeterProvider) Option {
|
func WithMeterProvider(provider metric.MeterProvider) Option {
|
||||||
return optionFunc(func(cfg *config) {
|
return optionFunc(func(cfg *config) {
|
||||||
cfg.MeterProvider = provider
|
if provider != nil {
|
||||||
|
cfg.MeterProvider = provider
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -100,15 +108,28 @@ func WithMeterProvider(provider metric.MeterProvider) Option {
|
|||||||
// association instead of a link.
|
// association instead of a link.
|
||||||
func WithPublicEndpoint() Option {
|
func WithPublicEndpoint() Option {
|
||||||
return optionFunc(func(c *config) {
|
return optionFunc(func(c *config) {
|
||||||
c.SpanStartOptions = append(c.SpanStartOptions, trace.WithNewRoot())
|
c.PublicEndpoint = true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithPublicEndpointFn runs with every request, and allows conditionnally
|
||||||
|
// configuring the Handler to link the span with an incoming span context. If
|
||||||
|
// this option is not provided or returns false, then the association is a
|
||||||
|
// child association instead of a link.
|
||||||
|
// Note: WithPublicEndpoint takes precedence over WithPublicEndpointFn.
|
||||||
|
func WithPublicEndpointFn(fn func(*http.Request) bool) Option {
|
||||||
|
return optionFunc(func(c *config) {
|
||||||
|
c.PublicEndpointFn = fn
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithPropagators configures specific propagators. If this
|
// WithPropagators configures specific propagators. If this
|
||||||
// option isn't specified then
|
// option isn't specified, then the global TextMapPropagator is used.
|
||||||
func WithPropagators(ps propagation.TextMapPropagator) Option {
|
func WithPropagators(ps propagation.TextMapPropagator) Option {
|
||||||
return optionFunc(func(c *config) {
|
return optionFunc(func(c *config) {
|
||||||
c.Propagators = ps
|
if ps != nil {
|
||||||
|
c.Propagators = ps
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -134,7 +155,7 @@ func WithFilter(f Filter) Option {
|
|||||||
|
|
||||||
type event int
|
type event int
|
||||||
|
|
||||||
// Different types of events that can be recorded, see WithMessageEvents
|
// Different types of events that can be recorded, see WithMessageEvents.
|
||||||
const (
|
const (
|
||||||
ReadEvents event = iota
|
ReadEvents event = iota
|
||||||
WriteEvents
|
WriteEvents
|
||||||
@ -145,10 +166,10 @@ const (
|
|||||||
// end of the request.
|
// end of the request.
|
||||||
//
|
//
|
||||||
// Valid events are:
|
// Valid events are:
|
||||||
// * ReadEvents: Record the number of bytes read after every http.Request.Body.Read
|
// - ReadEvents: Record the number of bytes read after every http.Request.Body.Read
|
||||||
// using the ReadBytesKey
|
// using the ReadBytesKey
|
||||||
// * WriteEvents: Record the number of bytes written after every http.ResponeWriter.Write
|
// - WriteEvents: Record the number of bytes written after every http.ResponeWriter.Write
|
||||||
// using the WriteBytesKey
|
// using the WriteBytesKey
|
||||||
func WithMessageEvents(events ...event) Option {
|
func WithMessageEvents(events ...event) Option {
|
||||||
return optionFunc(func(c *config) {
|
return optionFunc(func(c *config) {
|
||||||
for _, e := range events {
|
for _, e := range events {
|
||||||
@ -163,9 +184,25 @@ func WithMessageEvents(events ...event) Option {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// WithSpanNameFormatter takes a function that will be called on every
|
// WithSpanNameFormatter takes a function that will be called on every
|
||||||
// request and the returned string will become the Span Name
|
// request and the returned string will become the Span Name.
|
||||||
func WithSpanNameFormatter(f func(operation string, r *http.Request) string) Option {
|
func WithSpanNameFormatter(f func(operation string, r *http.Request) string) Option {
|
||||||
return optionFunc(func(c *config) {
|
return optionFunc(func(c *config) {
|
||||||
c.SpanNameFormatter = f
|
c.SpanNameFormatter = f
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WithClientTrace takes a function that returns client trace instance that will be
|
||||||
|
// applied to the requests sent through the otelhttp Transport.
|
||||||
|
func WithClientTrace(f func(context.Context) *httptrace.ClientTrace) Option {
|
||||||
|
return optionFunc(func(c *config) {
|
||||||
|
c.ClientTrace = f
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithServerName returns an Option that sets the name of the (virtual) server
|
||||||
|
// handling requests.
|
||||||
|
func WithServerName(server string) Option {
|
||||||
|
return optionFunc(func(c *config) {
|
||||||
|
c.ServerName = server
|
||||||
|
})
|
||||||
|
}
|
||||||
|
146
src/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/handler.go
generated
vendored
146
src/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/handler.go
generated
vendored
@ -12,7 +12,7 @@
|
|||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
package otelhttp
|
package otelhttp // import "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io"
|
"io"
|
||||||
@ -21,23 +21,19 @@ import (
|
|||||||
|
|
||||||
"github.com/felixge/httpsnoop"
|
"github.com/felixge/httpsnoop"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconvutil"
|
||||||
"go.opentelemetry.io/otel"
|
"go.opentelemetry.io/otel"
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
"go.opentelemetry.io/otel/metric"
|
"go.opentelemetry.io/otel/metric"
|
||||||
"go.opentelemetry.io/otel/propagation"
|
"go.opentelemetry.io/otel/propagation"
|
||||||
semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
|
semconv "go.opentelemetry.io/otel/semconv/v1.17.0"
|
||||||
"go.opentelemetry.io/otel/trace"
|
"go.opentelemetry.io/otel/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ http.Handler = &Handler{}
|
// middleware is an http middleware which wraps the next handler in a span.
|
||||||
|
type middleware struct {
|
||||||
// Handler is http middleware that corresponds to the http.Handler interface and
|
|
||||||
// is designed to wrap a http.Mux (or equivalent), while individual routes on
|
|
||||||
// the mux are wrapped with WithRouteTag. A Handler will add various attributes
|
|
||||||
// to the span using the attribute.Keys defined in this package.
|
|
||||||
type Handler struct {
|
|
||||||
operation string
|
operation string
|
||||||
handler http.Handler
|
server string
|
||||||
|
|
||||||
tracer trace.Tracer
|
tracer trace.Tracer
|
||||||
meter metric.Meter
|
meter metric.Meter
|
||||||
@ -48,18 +44,26 @@ type Handler struct {
|
|||||||
filters []Filter
|
filters []Filter
|
||||||
spanNameFormatter func(string, *http.Request) string
|
spanNameFormatter func(string, *http.Request) string
|
||||||
counters map[string]metric.Int64Counter
|
counters map[string]metric.Int64Counter
|
||||||
valueRecorders map[string]metric.Int64ValueRecorder
|
valueRecorders map[string]metric.Float64Histogram
|
||||||
|
publicEndpoint bool
|
||||||
|
publicEndpointFn func(*http.Request) bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func defaultHandlerFormatter(operation string, _ *http.Request) string {
|
func defaultHandlerFormatter(operation string, _ *http.Request) string {
|
||||||
return operation
|
return operation
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewHandler wraps the passed handler, functioning like middleware, in a span
|
// NewHandler wraps the passed handler in a span named after the operation and
|
||||||
// named after the operation and with any provided Options.
|
// enriches it with metrics.
|
||||||
func NewHandler(handler http.Handler, operation string, opts ...Option) http.Handler {
|
func NewHandler(handler http.Handler, operation string, opts ...Option) http.Handler {
|
||||||
h := Handler{
|
return NewMiddleware(operation, opts...)(handler)
|
||||||
handler: handler,
|
}
|
||||||
|
|
||||||
|
// NewMiddleware returns a tracing and metrics instrumentation middleware.
|
||||||
|
// The handler returned by the middleware wraps a handler
|
||||||
|
// in a span named after the operation and enriches it with metrics.
|
||||||
|
func NewMiddleware(operation string, opts ...Option) func(http.Handler) http.Handler {
|
||||||
|
h := middleware{
|
||||||
operation: operation,
|
operation: operation,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -72,10 +76,14 @@ func NewHandler(handler http.Handler, operation string, opts ...Option) http.Han
|
|||||||
h.configure(c)
|
h.configure(c)
|
||||||
h.createMeasures()
|
h.createMeasures()
|
||||||
|
|
||||||
return &h
|
return func(next http.Handler) http.Handler {
|
||||||
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
h.serveHTTP(w, r, next)
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Handler) configure(c *config) {
|
func (h *middleware) configure(c *config) {
|
||||||
h.tracer = c.Tracer
|
h.tracer = c.Tracer
|
||||||
h.meter = c.Meter
|
h.meter = c.Meter
|
||||||
h.propagators = c.Propagators
|
h.propagators = c.Propagators
|
||||||
@ -84,6 +92,9 @@ func (h *Handler) configure(c *config) {
|
|||||||
h.writeEvent = c.WriteEvent
|
h.writeEvent = c.WriteEvent
|
||||||
h.filters = c.Filters
|
h.filters = c.Filters
|
||||||
h.spanNameFormatter = c.SpanNameFormatter
|
h.spanNameFormatter = c.SpanNameFormatter
|
||||||
|
h.publicEndpoint = c.PublicEndpoint
|
||||||
|
h.publicEndpointFn = c.PublicEndpointFn
|
||||||
|
h.server = c.ServerName
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleErr(err error) {
|
func handleErr(err error) {
|
||||||
@ -92,17 +103,17 @@ func handleErr(err error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Handler) createMeasures() {
|
func (h *middleware) createMeasures() {
|
||||||
h.counters = make(map[string]metric.Int64Counter)
|
h.counters = make(map[string]metric.Int64Counter)
|
||||||
h.valueRecorders = make(map[string]metric.Int64ValueRecorder)
|
h.valueRecorders = make(map[string]metric.Float64Histogram)
|
||||||
|
|
||||||
requestBytesCounter, err := h.meter.NewInt64Counter(RequestContentLength)
|
requestBytesCounter, err := h.meter.Int64Counter(RequestContentLength)
|
||||||
handleErr(err)
|
handleErr(err)
|
||||||
|
|
||||||
responseBytesCounter, err := h.meter.NewInt64Counter(ResponseContentLength)
|
responseBytesCounter, err := h.meter.Int64Counter(ResponseContentLength)
|
||||||
handleErr(err)
|
handleErr(err)
|
||||||
|
|
||||||
serverLatencyMeasure, err := h.meter.NewInt64ValueRecorder(ServerLatency)
|
serverLatencyMeasure, err := h.meter.Float64Histogram(ServerLatency)
|
||||||
handleErr(err)
|
handleErr(err)
|
||||||
|
|
||||||
h.counters[RequestContentLength] = requestBytesCounter
|
h.counters[RequestContentLength] = requestBytesCounter
|
||||||
@ -110,25 +121,46 @@ func (h *Handler) createMeasures() {
|
|||||||
h.valueRecorders[ServerLatency] = serverLatencyMeasure
|
h.valueRecorders[ServerLatency] = serverLatencyMeasure
|
||||||
}
|
}
|
||||||
|
|
||||||
// ServeHTTP serves HTTP requests (http.Handler)
|
// serveHTTP sets up tracing and calls the given next http.Handler with the span
|
||||||
func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
// context injected into the request context.
|
||||||
|
func (h *middleware) serveHTTP(w http.ResponseWriter, r *http.Request, next http.Handler) {
|
||||||
requestStartTime := time.Now()
|
requestStartTime := time.Now()
|
||||||
for _, f := range h.filters {
|
for _, f := range h.filters {
|
||||||
if !f(r) {
|
if !f(r) {
|
||||||
// Simply pass through to the handler if a filter rejects the request
|
// Simply pass through to the handler if a filter rejects the request
|
||||||
h.handler.ServeHTTP(w, r)
|
next.ServeHTTP(w, r)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
opts := append([]trace.SpanStartOption{
|
|
||||||
trace.WithAttributes(semconv.NetAttributesFromHTTPRequest("tcp", r)...),
|
|
||||||
trace.WithAttributes(semconv.EndUserAttributesFromHTTPRequest(r)...),
|
|
||||||
trace.WithAttributes(semconv.HTTPServerAttributesFromHTTPRequest(h.operation, "", r)...),
|
|
||||||
}, h.spanStartOptions...) // start with the configured options
|
|
||||||
|
|
||||||
ctx := h.propagators.Extract(r.Context(), propagation.HeaderCarrier(r.Header))
|
ctx := h.propagators.Extract(r.Context(), propagation.HeaderCarrier(r.Header))
|
||||||
ctx, span := h.tracer.Start(ctx, h.spanNameFormatter(h.operation, r), opts...)
|
opts := []trace.SpanStartOption{
|
||||||
|
trace.WithAttributes(semconvutil.HTTPServerRequest(h.server, r)...),
|
||||||
|
}
|
||||||
|
if h.server != "" {
|
||||||
|
hostAttr := semconv.NetHostName(h.server)
|
||||||
|
opts = append(opts, trace.WithAttributes(hostAttr))
|
||||||
|
}
|
||||||
|
opts = append(opts, h.spanStartOptions...)
|
||||||
|
if h.publicEndpoint || (h.publicEndpointFn != nil && h.publicEndpointFn(r.WithContext(ctx))) {
|
||||||
|
opts = append(opts, trace.WithNewRoot())
|
||||||
|
// Linking incoming span context if any for public endpoint.
|
||||||
|
if s := trace.SpanContextFromContext(ctx); s.IsValid() && s.IsRemote() {
|
||||||
|
opts = append(opts, trace.WithLinks(trace.Link{SpanContext: s}))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tracer := h.tracer
|
||||||
|
|
||||||
|
if tracer == nil {
|
||||||
|
if span := trace.SpanFromContext(r.Context()); span.SpanContext().IsValid() {
|
||||||
|
tracer = newTracer(span.TracerProvider())
|
||||||
|
} else {
|
||||||
|
tracer = newTracer(otel.GetTracerProvider())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx, span := tracer.Start(ctx, h.spanNameFormatter(h.operation, r), opts...)
|
||||||
defer span.End()
|
defer span.End()
|
||||||
|
|
||||||
readRecordFunc := func(int64) {}
|
readRecordFunc := func(int64) {}
|
||||||
@ -139,10 +171,10 @@ func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var bw bodyWrapper
|
var bw bodyWrapper
|
||||||
// if request body is nil we don't want to mutate the body as it will affect
|
// if request body is nil or NoBody, we don't want to mutate the body as it
|
||||||
// the identity of it in a unforeseeable way because we assert ReadCloser
|
// will affect the identity of it in an unforeseeable way because we assert
|
||||||
// fullfills a certain interface and it is indeed nil.
|
// ReadCloser fulfills a certain interface and it is indeed nil or NoBody.
|
||||||
if r.Body != nil {
|
if r.Body != nil && r.Body != http.NoBody {
|
||||||
bw.ReadCloser = r.Body
|
bw.ReadCloser = r.Body
|
||||||
bw.record = readRecordFunc
|
bw.record = readRecordFunc
|
||||||
r.Body = &bw
|
r.Body = &bw
|
||||||
@ -155,7 +187,13 @@ func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
rww := &respWriterWrapper{ResponseWriter: w, record: writeRecordFunc, ctx: ctx, props: h.propagators}
|
rww := &respWriterWrapper{
|
||||||
|
ResponseWriter: w,
|
||||||
|
record: writeRecordFunc,
|
||||||
|
ctx: ctx,
|
||||||
|
props: h.propagators,
|
||||||
|
statusCode: http.StatusOK, // default status code in case the Handler doesn't write anything
|
||||||
|
}
|
||||||
|
|
||||||
// Wrap w to use our ResponseWriter methods while also exposing
|
// Wrap w to use our ResponseWriter methods while also exposing
|
||||||
// other interfaces that w may implement (http.CloseNotifier,
|
// other interfaces that w may implement (http.CloseNotifier,
|
||||||
@ -176,18 +214,23 @@ func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|||||||
labeler := &Labeler{}
|
labeler := &Labeler{}
|
||||||
ctx = injectLabeler(ctx, labeler)
|
ctx = injectLabeler(ctx, labeler)
|
||||||
|
|
||||||
h.handler.ServeHTTP(w, r.WithContext(ctx))
|
next.ServeHTTP(w, r.WithContext(ctx))
|
||||||
|
|
||||||
setAfterServeAttributes(span, bw.read, rww.written, rww.statusCode, bw.err, rww.err)
|
setAfterServeAttributes(span, bw.read, rww.written, rww.statusCode, bw.err, rww.err)
|
||||||
|
|
||||||
// Add metrics
|
// Add metrics
|
||||||
attributes := append(labeler.Get(), semconv.HTTPServerMetricAttributesFromHTTPRequest(h.operation, r)...)
|
attributes := append(labeler.Get(), semconvutil.HTTPServerRequestMetrics(h.server, r)...)
|
||||||
h.counters[RequestContentLength].Add(ctx, bw.read, attributes...)
|
if rww.statusCode > 0 {
|
||||||
h.counters[ResponseContentLength].Add(ctx, rww.written, attributes...)
|
attributes = append(attributes, semconv.HTTPStatusCode(rww.statusCode))
|
||||||
|
}
|
||||||
|
o := metric.WithAttributes(attributes...)
|
||||||
|
h.counters[RequestContentLength].Add(ctx, bw.read, o)
|
||||||
|
h.counters[ResponseContentLength].Add(ctx, rww.written, o)
|
||||||
|
|
||||||
elapsedTime := time.Since(requestStartTime).Microseconds()
|
// Use floating point division here for higher precision (instead of Millisecond method).
|
||||||
|
elapsedTime := float64(time.Since(requestStartTime)) / float64(time.Millisecond)
|
||||||
|
|
||||||
h.valueRecorders[ServerLatency].Record(ctx, elapsedTime, attributes...)
|
h.valueRecorders[ServerLatency].Record(ctx, elapsedTime, o)
|
||||||
}
|
}
|
||||||
|
|
||||||
func setAfterServeAttributes(span trace.Span, read, wrote int64, statusCode int, rerr, werr error) {
|
func setAfterServeAttributes(span trace.Span, read, wrote int64, statusCode int, rerr, werr error) {
|
||||||
@ -205,21 +248,28 @@ func setAfterServeAttributes(span trace.Span, read, wrote int64, statusCode int,
|
|||||||
attributes = append(attributes, WroteBytesKey.Int64(wrote))
|
attributes = append(attributes, WroteBytesKey.Int64(wrote))
|
||||||
}
|
}
|
||||||
if statusCode > 0 {
|
if statusCode > 0 {
|
||||||
attributes = append(attributes, semconv.HTTPAttributesFromHTTPStatusCode(statusCode)...)
|
attributes = append(attributes, semconv.HTTPStatusCode(statusCode))
|
||||||
span.SetStatus(semconv.SpanStatusFromHTTPStatusCode(statusCode))
|
|
||||||
}
|
}
|
||||||
|
span.SetStatus(semconvutil.HTTPServerStatus(statusCode))
|
||||||
|
|
||||||
if werr != nil && werr != io.EOF {
|
if werr != nil && werr != io.EOF {
|
||||||
attributes = append(attributes, WriteErrorKey.String(werr.Error()))
|
attributes = append(attributes, WriteErrorKey.String(werr.Error()))
|
||||||
}
|
}
|
||||||
span.SetAttributes(attributes...)
|
span.SetAttributes(attributes...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithRouteTag annotates a span with the provided route name using the
|
// WithRouteTag annotates spans and metrics with the provided route name
|
||||||
// RouteKey Tag.
|
// with HTTP route attribute.
|
||||||
func WithRouteTag(route string, h http.Handler) http.Handler {
|
func WithRouteTag(route string, h http.Handler) http.Handler {
|
||||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
attr := semconv.HTTPRouteKey.String(route)
|
||||||
|
|
||||||
span := trace.SpanFromContext(r.Context())
|
span := trace.SpanFromContext(r.Context())
|
||||||
span.SetAttributes(semconv.HTTPRouteKey.String(route))
|
span.SetAttributes(attr)
|
||||||
|
|
||||||
|
labeler, _ := LabelerFromContext(r.Context())
|
||||||
|
labeler.Add(attr)
|
||||||
|
|
||||||
h.ServeHTTP(w, r)
|
h.ServeHTTP(w, r)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
21
src/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconvutil/gen.go
generated
vendored
Normal file
21
src/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconvutil/gen.go
generated
vendored
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
// 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 semconvutil // import "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconvutil"
|
||||||
|
|
||||||
|
// Generate semconvutil package:
|
||||||
|
//go:generate gotmpl --body=../../../../../../internal/shared/semconvutil/httpconv_test.go.tmpl "--data={}" --out=httpconv_test.go
|
||||||
|
//go:generate gotmpl --body=../../../../../../internal/shared/semconvutil/httpconv.go.tmpl "--data={}" --out=httpconv.go
|
||||||
|
//go:generate gotmpl --body=../../../../../../internal/shared/semconvutil/netconv_test.go.tmpl "--data={}" --out=netconv_test.go
|
||||||
|
//go:generate gotmpl --body=../../../../../../internal/shared/semconvutil/netconv.go.tmpl "--data={}" --out=netconv.go
|
552
src/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconvutil/httpconv.go
generated
vendored
Normal file
552
src/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconvutil/httpconv.go
generated
vendored
Normal file
@ -0,0 +1,552 @@
|
|||||||
|
// Code created by gotmpl. DO NOT MODIFY.
|
||||||
|
// source: internal/shared/semconvutil/httpconv.go.tmpl
|
||||||
|
|
||||||
|
// 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 semconvutil // import "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconvutil"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/attribute"
|
||||||
|
"go.opentelemetry.io/otel/codes"
|
||||||
|
semconv "go.opentelemetry.io/otel/semconv/v1.17.0"
|
||||||
|
)
|
||||||
|
|
||||||
|
// HTTPClientResponse returns trace attributes for an HTTP response received by a
|
||||||
|
// client from a server. It will return the following attributes if the related
|
||||||
|
// values are defined in resp: "http.status.code",
|
||||||
|
// "http.response_content_length".
|
||||||
|
//
|
||||||
|
// This does not add all OpenTelemetry required attributes for an HTTP event,
|
||||||
|
// it assumes ClientRequest was used to create the span with a complete set of
|
||||||
|
// attributes. If a complete set of attributes can be generated using the
|
||||||
|
// request contained in resp. For example:
|
||||||
|
//
|
||||||
|
// append(HTTPClientResponse(resp), ClientRequest(resp.Request)...)
|
||||||
|
func HTTPClientResponse(resp *http.Response) []attribute.KeyValue {
|
||||||
|
return hc.ClientResponse(resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
// HTTPClientRequest returns trace attributes for an HTTP request made by a client.
|
||||||
|
// The following attributes are always returned: "http.url", "http.flavor",
|
||||||
|
// "http.method", "net.peer.name". The following attributes are returned if the
|
||||||
|
// related values are defined in req: "net.peer.port", "http.user_agent",
|
||||||
|
// "http.request_content_length", "enduser.id".
|
||||||
|
func HTTPClientRequest(req *http.Request) []attribute.KeyValue {
|
||||||
|
return hc.ClientRequest(req)
|
||||||
|
}
|
||||||
|
|
||||||
|
// HTTPClientStatus returns a span status code and message for an HTTP status code
|
||||||
|
// value received by a client.
|
||||||
|
func HTTPClientStatus(code int) (codes.Code, string) {
|
||||||
|
return hc.ClientStatus(code)
|
||||||
|
}
|
||||||
|
|
||||||
|
// HTTPServerRequest returns trace attributes for an HTTP request received by a
|
||||||
|
// server.
|
||||||
|
//
|
||||||
|
// The server must be the primary server name if it is known. For example this
|
||||||
|
// would be the ServerName directive
|
||||||
|
// (https://httpd.apache.org/docs/2.4/mod/core.html#servername) for an Apache
|
||||||
|
// server, and the server_name directive
|
||||||
|
// (http://nginx.org/en/docs/http/ngx_http_core_module.html#server_name) for an
|
||||||
|
// nginx server. More generically, the primary server name would be the host
|
||||||
|
// header value that matches the default virtual host of an HTTP server. It
|
||||||
|
// should include the host identifier and if a port is used to route to the
|
||||||
|
// server that port identifier should be included as an appropriate port
|
||||||
|
// suffix.
|
||||||
|
//
|
||||||
|
// If the primary server name is not known, server should be an empty string.
|
||||||
|
// The req Host will be used to determine the server instead.
|
||||||
|
//
|
||||||
|
// The following attributes are always returned: "http.method", "http.scheme",
|
||||||
|
// "http.flavor", "http.target", "net.host.name". The following attributes are
|
||||||
|
// returned if they related values are defined in req: "net.host.port",
|
||||||
|
// "net.sock.peer.addr", "net.sock.peer.port", "http.user_agent", "enduser.id",
|
||||||
|
// "http.client_ip".
|
||||||
|
func HTTPServerRequest(server string, req *http.Request) []attribute.KeyValue {
|
||||||
|
return hc.ServerRequest(server, req)
|
||||||
|
}
|
||||||
|
|
||||||
|
// HTTPServerRequestMetrics returns metric attributes for an HTTP request received by a
|
||||||
|
// server.
|
||||||
|
//
|
||||||
|
// The server must be the primary server name if it is known. For example this
|
||||||
|
// would be the ServerName directive
|
||||||
|
// (https://httpd.apache.org/docs/2.4/mod/core.html#servername) for an Apache
|
||||||
|
// server, and the server_name directive
|
||||||
|
// (http://nginx.org/en/docs/http/ngx_http_core_module.html#server_name) for an
|
||||||
|
// nginx server. More generically, the primary server name would be the host
|
||||||
|
// header value that matches the default virtual host of an HTTP server. It
|
||||||
|
// should include the host identifier and if a port is used to route to the
|
||||||
|
// server that port identifier should be included as an appropriate port
|
||||||
|
// suffix.
|
||||||
|
//
|
||||||
|
// If the primary server name is not known, server should be an empty string.
|
||||||
|
// The req Host will be used to determine the server instead.
|
||||||
|
//
|
||||||
|
// The following attributes are always returned: "http.method", "http.scheme",
|
||||||
|
// "http.flavor", "net.host.name". The following attributes are
|
||||||
|
// returned if they related values are defined in req: "net.host.port".
|
||||||
|
func HTTPServerRequestMetrics(server string, req *http.Request) []attribute.KeyValue {
|
||||||
|
return hc.ServerRequestMetrics(server, req)
|
||||||
|
}
|
||||||
|
|
||||||
|
// HTTPServerStatus returns a span status code and message for an HTTP status code
|
||||||
|
// value returned by a server. Status codes in the 400-499 range are not
|
||||||
|
// returned as errors.
|
||||||
|
func HTTPServerStatus(code int) (codes.Code, string) {
|
||||||
|
return hc.ServerStatus(code)
|
||||||
|
}
|
||||||
|
|
||||||
|
// HTTPRequestHeader returns the contents of h as attributes.
|
||||||
|
//
|
||||||
|
// Instrumentation should require an explicit configuration of which headers to
|
||||||
|
// captured and then prune what they pass here. Including all headers can be a
|
||||||
|
// security risk - explicit configuration helps avoid leaking sensitive
|
||||||
|
// information.
|
||||||
|
//
|
||||||
|
// The User-Agent header is already captured in the http.user_agent attribute
|
||||||
|
// from ClientRequest and ServerRequest. Instrumentation may provide an option
|
||||||
|
// to capture that header here even though it is not recommended. Otherwise,
|
||||||
|
// instrumentation should filter that out of what is passed.
|
||||||
|
func HTTPRequestHeader(h http.Header) []attribute.KeyValue {
|
||||||
|
return hc.RequestHeader(h)
|
||||||
|
}
|
||||||
|
|
||||||
|
// HTTPResponseHeader returns the contents of h as attributes.
|
||||||
|
//
|
||||||
|
// Instrumentation should require an explicit configuration of which headers to
|
||||||
|
// captured and then prune what they pass here. Including all headers can be a
|
||||||
|
// security risk - explicit configuration helps avoid leaking sensitive
|
||||||
|
// information.
|
||||||
|
//
|
||||||
|
// The User-Agent header is already captured in the http.user_agent attribute
|
||||||
|
// from ClientRequest and ServerRequest. Instrumentation may provide an option
|
||||||
|
// to capture that header here even though it is not recommended. Otherwise,
|
||||||
|
// instrumentation should filter that out of what is passed.
|
||||||
|
func HTTPResponseHeader(h http.Header) []attribute.KeyValue {
|
||||||
|
return hc.ResponseHeader(h)
|
||||||
|
}
|
||||||
|
|
||||||
|
// httpConv are the HTTP semantic convention attributes defined for a version
|
||||||
|
// of the OpenTelemetry specification.
|
||||||
|
type httpConv struct {
|
||||||
|
NetConv *netConv
|
||||||
|
|
||||||
|
EnduserIDKey attribute.Key
|
||||||
|
HTTPClientIPKey attribute.Key
|
||||||
|
HTTPFlavorKey attribute.Key
|
||||||
|
HTTPMethodKey attribute.Key
|
||||||
|
HTTPRequestContentLengthKey attribute.Key
|
||||||
|
HTTPResponseContentLengthKey attribute.Key
|
||||||
|
HTTPRouteKey attribute.Key
|
||||||
|
HTTPSchemeHTTP attribute.KeyValue
|
||||||
|
HTTPSchemeHTTPS attribute.KeyValue
|
||||||
|
HTTPStatusCodeKey attribute.Key
|
||||||
|
HTTPTargetKey attribute.Key
|
||||||
|
HTTPURLKey attribute.Key
|
||||||
|
HTTPUserAgentKey attribute.Key
|
||||||
|
}
|
||||||
|
|
||||||
|
var hc = &httpConv{
|
||||||
|
NetConv: nc,
|
||||||
|
|
||||||
|
EnduserIDKey: semconv.EnduserIDKey,
|
||||||
|
HTTPClientIPKey: semconv.HTTPClientIPKey,
|
||||||
|
HTTPFlavorKey: semconv.HTTPFlavorKey,
|
||||||
|
HTTPMethodKey: semconv.HTTPMethodKey,
|
||||||
|
HTTPRequestContentLengthKey: semconv.HTTPRequestContentLengthKey,
|
||||||
|
HTTPResponseContentLengthKey: semconv.HTTPResponseContentLengthKey,
|
||||||
|
HTTPRouteKey: semconv.HTTPRouteKey,
|
||||||
|
HTTPSchemeHTTP: semconv.HTTPSchemeHTTP,
|
||||||
|
HTTPSchemeHTTPS: semconv.HTTPSchemeHTTPS,
|
||||||
|
HTTPStatusCodeKey: semconv.HTTPStatusCodeKey,
|
||||||
|
HTTPTargetKey: semconv.HTTPTargetKey,
|
||||||
|
HTTPURLKey: semconv.HTTPURLKey,
|
||||||
|
HTTPUserAgentKey: semconv.HTTPUserAgentKey,
|
||||||
|
}
|
||||||
|
|
||||||
|
// ClientResponse returns attributes for an HTTP response received by a client
|
||||||
|
// from a server. The following attributes are returned if the related values
|
||||||
|
// are defined in resp: "http.status.code", "http.response_content_length".
|
||||||
|
//
|
||||||
|
// This does not add all OpenTelemetry required attributes for an HTTP event,
|
||||||
|
// it assumes ClientRequest was used to create the span with a complete set of
|
||||||
|
// attributes. If a complete set of attributes can be generated using the
|
||||||
|
// request contained in resp. For example:
|
||||||
|
//
|
||||||
|
// append(ClientResponse(resp), ClientRequest(resp.Request)...)
|
||||||
|
func (c *httpConv) ClientResponse(resp *http.Response) []attribute.KeyValue {
|
||||||
|
var n int
|
||||||
|
if resp.StatusCode > 0 {
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
if resp.ContentLength > 0 {
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
|
||||||
|
attrs := make([]attribute.KeyValue, 0, n)
|
||||||
|
if resp.StatusCode > 0 {
|
||||||
|
attrs = append(attrs, c.HTTPStatusCodeKey.Int(resp.StatusCode))
|
||||||
|
}
|
||||||
|
if resp.ContentLength > 0 {
|
||||||
|
attrs = append(attrs, c.HTTPResponseContentLengthKey.Int(int(resp.ContentLength)))
|
||||||
|
}
|
||||||
|
return attrs
|
||||||
|
}
|
||||||
|
|
||||||
|
// ClientRequest returns attributes for an HTTP request made by a client. The
|
||||||
|
// following attributes are always returned: "http.url", "http.flavor",
|
||||||
|
// "http.method", "net.peer.name". The following attributes are returned if the
|
||||||
|
// related values are defined in req: "net.peer.port", "http.user_agent",
|
||||||
|
// "http.request_content_length", "enduser.id".
|
||||||
|
func (c *httpConv) ClientRequest(req *http.Request) []attribute.KeyValue {
|
||||||
|
n := 3 // URL, peer name, proto, and method.
|
||||||
|
var h string
|
||||||
|
if req.URL != nil {
|
||||||
|
h = req.URL.Host
|
||||||
|
}
|
||||||
|
peer, p := firstHostPort(h, req.Header.Get("Host"))
|
||||||
|
port := requiredHTTPPort(req.URL != nil && req.URL.Scheme == "https", p)
|
||||||
|
if port > 0 {
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
useragent := req.UserAgent()
|
||||||
|
if useragent != "" {
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
if req.ContentLength > 0 {
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
userID, _, hasUserID := req.BasicAuth()
|
||||||
|
if hasUserID {
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
attrs := make([]attribute.KeyValue, 0, n)
|
||||||
|
|
||||||
|
attrs = append(attrs, c.method(req.Method))
|
||||||
|
attrs = append(attrs, c.flavor(req.Proto))
|
||||||
|
|
||||||
|
var u string
|
||||||
|
if req.URL != nil {
|
||||||
|
// Remove any username/password info that may be in the URL.
|
||||||
|
userinfo := req.URL.User
|
||||||
|
req.URL.User = nil
|
||||||
|
u = req.URL.String()
|
||||||
|
// Restore any username/password info that was removed.
|
||||||
|
req.URL.User = userinfo
|
||||||
|
}
|
||||||
|
attrs = append(attrs, c.HTTPURLKey.String(u))
|
||||||
|
|
||||||
|
attrs = append(attrs, c.NetConv.PeerName(peer))
|
||||||
|
if port > 0 {
|
||||||
|
attrs = append(attrs, c.NetConv.PeerPort(port))
|
||||||
|
}
|
||||||
|
|
||||||
|
if useragent != "" {
|
||||||
|
attrs = append(attrs, c.HTTPUserAgentKey.String(useragent))
|
||||||
|
}
|
||||||
|
|
||||||
|
if l := req.ContentLength; l > 0 {
|
||||||
|
attrs = append(attrs, c.HTTPRequestContentLengthKey.Int64(l))
|
||||||
|
}
|
||||||
|
|
||||||
|
if hasUserID {
|
||||||
|
attrs = append(attrs, c.EnduserIDKey.String(userID))
|
||||||
|
}
|
||||||
|
|
||||||
|
return attrs
|
||||||
|
}
|
||||||
|
|
||||||
|
// ServerRequest returns attributes for an HTTP request received by a server.
|
||||||
|
//
|
||||||
|
// The server must be the primary server name if it is known. For example this
|
||||||
|
// would be the ServerName directive
|
||||||
|
// (https://httpd.apache.org/docs/2.4/mod/core.html#servername) for an Apache
|
||||||
|
// server, and the server_name directive
|
||||||
|
// (http://nginx.org/en/docs/http/ngx_http_core_module.html#server_name) for an
|
||||||
|
// nginx server. More generically, the primary server name would be the host
|
||||||
|
// header value that matches the default virtual host of an HTTP server. It
|
||||||
|
// should include the host identifier and if a port is used to route to the
|
||||||
|
// server that port identifier should be included as an appropriate port
|
||||||
|
// suffix.
|
||||||
|
//
|
||||||
|
// If the primary server name is not known, server should be an empty string.
|
||||||
|
// The req Host will be used to determine the server instead.
|
||||||
|
//
|
||||||
|
// The following attributes are always returned: "http.method", "http.scheme",
|
||||||
|
// "http.flavor", "http.target", "net.host.name". The following attributes are
|
||||||
|
// returned if they related values are defined in req: "net.host.port",
|
||||||
|
// "net.sock.peer.addr", "net.sock.peer.port", "http.user_agent", "enduser.id",
|
||||||
|
// "http.client_ip".
|
||||||
|
func (c *httpConv) ServerRequest(server string, req *http.Request) []attribute.KeyValue {
|
||||||
|
// TODO: This currently does not add the specification required
|
||||||
|
// `http.target` attribute. It has too high of a cardinality to safely be
|
||||||
|
// added. An alternate should be added, or this comment removed, when it is
|
||||||
|
// addressed by the specification. If it is ultimately decided to continue
|
||||||
|
// not including the attribute, the HTTPTargetKey field of the httpConv
|
||||||
|
// should be removed as well.
|
||||||
|
|
||||||
|
n := 4 // Method, scheme, proto, and host name.
|
||||||
|
var host string
|
||||||
|
var p int
|
||||||
|
if server == "" {
|
||||||
|
host, p = splitHostPort(req.Host)
|
||||||
|
} else {
|
||||||
|
// Prioritize the primary server name.
|
||||||
|
host, p = splitHostPort(server)
|
||||||
|
if p < 0 {
|
||||||
|
_, p = splitHostPort(req.Host)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
hostPort := requiredHTTPPort(req.TLS != nil, p)
|
||||||
|
if hostPort > 0 {
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
peer, peerPort := splitHostPort(req.RemoteAddr)
|
||||||
|
if peer != "" {
|
||||||
|
n++
|
||||||
|
if peerPort > 0 {
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
useragent := req.UserAgent()
|
||||||
|
if useragent != "" {
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
userID, _, hasUserID := req.BasicAuth()
|
||||||
|
if hasUserID {
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
clientIP := serverClientIP(req.Header.Get("X-Forwarded-For"))
|
||||||
|
if clientIP != "" {
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
attrs := make([]attribute.KeyValue, 0, n)
|
||||||
|
|
||||||
|
attrs = append(attrs, c.method(req.Method))
|
||||||
|
attrs = append(attrs, c.scheme(req.TLS != nil))
|
||||||
|
attrs = append(attrs, c.flavor(req.Proto))
|
||||||
|
attrs = append(attrs, c.NetConv.HostName(host))
|
||||||
|
|
||||||
|
if hostPort > 0 {
|
||||||
|
attrs = append(attrs, c.NetConv.HostPort(hostPort))
|
||||||
|
}
|
||||||
|
|
||||||
|
if peer != "" {
|
||||||
|
// The Go HTTP server sets RemoteAddr to "IP:port", this will not be a
|
||||||
|
// file-path that would be interpreted with a sock family.
|
||||||
|
attrs = append(attrs, c.NetConv.SockPeerAddr(peer))
|
||||||
|
if peerPort > 0 {
|
||||||
|
attrs = append(attrs, c.NetConv.SockPeerPort(peerPort))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if useragent != "" {
|
||||||
|
attrs = append(attrs, c.HTTPUserAgentKey.String(useragent))
|
||||||
|
}
|
||||||
|
|
||||||
|
if hasUserID {
|
||||||
|
attrs = append(attrs, c.EnduserIDKey.String(userID))
|
||||||
|
}
|
||||||
|
|
||||||
|
if clientIP != "" {
|
||||||
|
attrs = append(attrs, c.HTTPClientIPKey.String(clientIP))
|
||||||
|
}
|
||||||
|
|
||||||
|
return attrs
|
||||||
|
}
|
||||||
|
|
||||||
|
// ServerRequestMetrics returns metric attributes for an HTTP request received
|
||||||
|
// by a server.
|
||||||
|
//
|
||||||
|
// The server must be the primary server name if it is known. For example this
|
||||||
|
// would be the ServerName directive
|
||||||
|
// (https://httpd.apache.org/docs/2.4/mod/core.html#servername) for an Apache
|
||||||
|
// server, and the server_name directive
|
||||||
|
// (http://nginx.org/en/docs/http/ngx_http_core_module.html#server_name) for an
|
||||||
|
// nginx server. More generically, the primary server name would be the host
|
||||||
|
// header value that matches the default virtual host of an HTTP server. It
|
||||||
|
// should include the host identifier and if a port is used to route to the
|
||||||
|
// server that port identifier should be included as an appropriate port
|
||||||
|
// suffix.
|
||||||
|
//
|
||||||
|
// If the primary server name is not known, server should be an empty string.
|
||||||
|
// The req Host will be used to determine the server instead.
|
||||||
|
//
|
||||||
|
// The following attributes are always returned: "http.method", "http.scheme",
|
||||||
|
// "http.flavor", "net.host.name". The following attributes are
|
||||||
|
// returned if they related values are defined in req: "net.host.port".
|
||||||
|
func (c *httpConv) ServerRequestMetrics(server string, req *http.Request) []attribute.KeyValue {
|
||||||
|
// TODO: This currently does not add the specification required
|
||||||
|
// `http.target` attribute. It has too high of a cardinality to safely be
|
||||||
|
// added. An alternate should be added, or this comment removed, when it is
|
||||||
|
// addressed by the specification. If it is ultimately decided to continue
|
||||||
|
// not including the attribute, the HTTPTargetKey field of the httpConv
|
||||||
|
// should be removed as well.
|
||||||
|
|
||||||
|
n := 4 // Method, scheme, proto, and host name.
|
||||||
|
var host string
|
||||||
|
var p int
|
||||||
|
if server == "" {
|
||||||
|
host, p = splitHostPort(req.Host)
|
||||||
|
} else {
|
||||||
|
// Prioritize the primary server name.
|
||||||
|
host, p = splitHostPort(server)
|
||||||
|
if p < 0 {
|
||||||
|
_, p = splitHostPort(req.Host)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
hostPort := requiredHTTPPort(req.TLS != nil, p)
|
||||||
|
if hostPort > 0 {
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
attrs := make([]attribute.KeyValue, 0, n)
|
||||||
|
|
||||||
|
attrs = append(attrs, c.methodMetric(req.Method))
|
||||||
|
attrs = append(attrs, c.scheme(req.TLS != nil))
|
||||||
|
attrs = append(attrs, c.flavor(req.Proto))
|
||||||
|
attrs = append(attrs, c.NetConv.HostName(host))
|
||||||
|
|
||||||
|
if hostPort > 0 {
|
||||||
|
attrs = append(attrs, c.NetConv.HostPort(hostPort))
|
||||||
|
}
|
||||||
|
|
||||||
|
return attrs
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *httpConv) method(method string) attribute.KeyValue {
|
||||||
|
if method == "" {
|
||||||
|
return c.HTTPMethodKey.String(http.MethodGet)
|
||||||
|
}
|
||||||
|
return c.HTTPMethodKey.String(method)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *httpConv) methodMetric(method string) attribute.KeyValue {
|
||||||
|
method = strings.ToUpper(method)
|
||||||
|
switch method {
|
||||||
|
case http.MethodConnect, http.MethodDelete, http.MethodGet, http.MethodHead, http.MethodOptions, http.MethodPatch, http.MethodPost, http.MethodPut, http.MethodTrace:
|
||||||
|
default:
|
||||||
|
method = "_OTHER"
|
||||||
|
}
|
||||||
|
return c.HTTPMethodKey.String(method)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *httpConv) scheme(https bool) attribute.KeyValue { // nolint:revive
|
||||||
|
if https {
|
||||||
|
return c.HTTPSchemeHTTPS
|
||||||
|
}
|
||||||
|
return c.HTTPSchemeHTTP
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *httpConv) flavor(proto string) attribute.KeyValue {
|
||||||
|
switch proto {
|
||||||
|
case "HTTP/1.0":
|
||||||
|
return c.HTTPFlavorKey.String("1.0")
|
||||||
|
case "HTTP/1.1":
|
||||||
|
return c.HTTPFlavorKey.String("1.1")
|
||||||
|
case "HTTP/2":
|
||||||
|
return c.HTTPFlavorKey.String("2.0")
|
||||||
|
case "HTTP/3":
|
||||||
|
return c.HTTPFlavorKey.String("3.0")
|
||||||
|
default:
|
||||||
|
return c.HTTPFlavorKey.String(proto)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func serverClientIP(xForwardedFor string) string {
|
||||||
|
if idx := strings.Index(xForwardedFor, ","); idx >= 0 {
|
||||||
|
xForwardedFor = xForwardedFor[:idx]
|
||||||
|
}
|
||||||
|
return xForwardedFor
|
||||||
|
}
|
||||||
|
|
||||||
|
func requiredHTTPPort(https bool, port int) int { // nolint:revive
|
||||||
|
if https {
|
||||||
|
if port > 0 && port != 443 {
|
||||||
|
return port
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if port > 0 && port != 80 {
|
||||||
|
return port
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the request host and port from the first non-empty source.
|
||||||
|
func firstHostPort(source ...string) (host string, port int) {
|
||||||
|
for _, hostport := range source {
|
||||||
|
host, port = splitHostPort(hostport)
|
||||||
|
if host != "" || port > 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// RequestHeader returns the contents of h as OpenTelemetry attributes.
|
||||||
|
func (c *httpConv) RequestHeader(h http.Header) []attribute.KeyValue {
|
||||||
|
return c.header("http.request.header", h)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ResponseHeader returns the contents of h as OpenTelemetry attributes.
|
||||||
|
func (c *httpConv) ResponseHeader(h http.Header) []attribute.KeyValue {
|
||||||
|
return c.header("http.response.header", h)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *httpConv) header(prefix string, h http.Header) []attribute.KeyValue {
|
||||||
|
key := func(k string) attribute.Key {
|
||||||
|
k = strings.ToLower(k)
|
||||||
|
k = strings.ReplaceAll(k, "-", "_")
|
||||||
|
k = fmt.Sprintf("%s.%s", prefix, k)
|
||||||
|
return attribute.Key(k)
|
||||||
|
}
|
||||||
|
|
||||||
|
attrs := make([]attribute.KeyValue, 0, len(h))
|
||||||
|
for k, v := range h {
|
||||||
|
attrs = append(attrs, key(k).StringSlice(v))
|
||||||
|
}
|
||||||
|
return attrs
|
||||||
|
}
|
||||||
|
|
||||||
|
// ClientStatus returns a span status code and message for an HTTP status code
|
||||||
|
// value received by a client.
|
||||||
|
func (c *httpConv) ClientStatus(code int) (codes.Code, string) {
|
||||||
|
if code < 100 || code >= 600 {
|
||||||
|
return codes.Error, fmt.Sprintf("Invalid HTTP status code %d", code)
|
||||||
|
}
|
||||||
|
if code >= 400 {
|
||||||
|
return codes.Error, ""
|
||||||
|
}
|
||||||
|
return codes.Unset, ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// ServerStatus returns a span status code and message for an HTTP status code
|
||||||
|
// value returned by a server. Status codes in the 400-499 range are not
|
||||||
|
// returned as errors.
|
||||||
|
func (c *httpConv) ServerStatus(code int) (codes.Code, string) {
|
||||||
|
if code < 100 || code >= 600 {
|
||||||
|
return codes.Error, fmt.Sprintf("Invalid HTTP status code %d", code)
|
||||||
|
}
|
||||||
|
if code >= 500 {
|
||||||
|
return codes.Error, ""
|
||||||
|
}
|
||||||
|
return codes.Unset, ""
|
||||||
|
}
|
368
src/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconvutil/netconv.go
generated
vendored
Normal file
368
src/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconvutil/netconv.go
generated
vendored
Normal file
@ -0,0 +1,368 @@
|
|||||||
|
// Code created by gotmpl. DO NOT MODIFY.
|
||||||
|
// source: internal/shared/semconvutil/netconv.go.tmpl
|
||||||
|
|
||||||
|
// 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 semconvutil // import "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconvutil"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/attribute"
|
||||||
|
semconv "go.opentelemetry.io/otel/semconv/v1.17.0"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NetTransport returns a trace attribute describing the transport protocol of the
|
||||||
|
// passed network. See the net.Dial for information about acceptable network
|
||||||
|
// values.
|
||||||
|
func NetTransport(network string) attribute.KeyValue {
|
||||||
|
return nc.Transport(network)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NetClient returns trace attributes for a client network connection to address.
|
||||||
|
// See net.Dial for information about acceptable address values, address should
|
||||||
|
// be the same as the one used to create conn. If conn is nil, only network
|
||||||
|
// peer attributes will be returned that describe address. Otherwise, the
|
||||||
|
// socket level information about conn will also be included.
|
||||||
|
func NetClient(address string, conn net.Conn) []attribute.KeyValue {
|
||||||
|
return nc.Client(address, conn)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NetServer returns trace attributes for a network listener listening at address.
|
||||||
|
// See net.Listen for information about acceptable address values, address
|
||||||
|
// should be the same as the one used to create ln. If ln is nil, only network
|
||||||
|
// host attributes will be returned that describe address. Otherwise, the
|
||||||
|
// socket level information about ln will also be included.
|
||||||
|
func NetServer(address string, ln net.Listener) []attribute.KeyValue {
|
||||||
|
return nc.Server(address, ln)
|
||||||
|
}
|
||||||
|
|
||||||
|
// netConv are the network semantic convention attributes defined for a version
|
||||||
|
// of the OpenTelemetry specification.
|
||||||
|
type netConv struct {
|
||||||
|
NetHostNameKey attribute.Key
|
||||||
|
NetHostPortKey attribute.Key
|
||||||
|
NetPeerNameKey attribute.Key
|
||||||
|
NetPeerPortKey attribute.Key
|
||||||
|
NetSockFamilyKey attribute.Key
|
||||||
|
NetSockPeerAddrKey attribute.Key
|
||||||
|
NetSockPeerPortKey attribute.Key
|
||||||
|
NetSockHostAddrKey attribute.Key
|
||||||
|
NetSockHostPortKey attribute.Key
|
||||||
|
NetTransportOther attribute.KeyValue
|
||||||
|
NetTransportTCP attribute.KeyValue
|
||||||
|
NetTransportUDP attribute.KeyValue
|
||||||
|
NetTransportInProc attribute.KeyValue
|
||||||
|
}
|
||||||
|
|
||||||
|
var nc = &netConv{
|
||||||
|
NetHostNameKey: semconv.NetHostNameKey,
|
||||||
|
NetHostPortKey: semconv.NetHostPortKey,
|
||||||
|
NetPeerNameKey: semconv.NetPeerNameKey,
|
||||||
|
NetPeerPortKey: semconv.NetPeerPortKey,
|
||||||
|
NetSockFamilyKey: semconv.NetSockFamilyKey,
|
||||||
|
NetSockPeerAddrKey: semconv.NetSockPeerAddrKey,
|
||||||
|
NetSockPeerPortKey: semconv.NetSockPeerPortKey,
|
||||||
|
NetSockHostAddrKey: semconv.NetSockHostAddrKey,
|
||||||
|
NetSockHostPortKey: semconv.NetSockHostPortKey,
|
||||||
|
NetTransportOther: semconv.NetTransportOther,
|
||||||
|
NetTransportTCP: semconv.NetTransportTCP,
|
||||||
|
NetTransportUDP: semconv.NetTransportUDP,
|
||||||
|
NetTransportInProc: semconv.NetTransportInProc,
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *netConv) Transport(network string) attribute.KeyValue {
|
||||||
|
switch network {
|
||||||
|
case "tcp", "tcp4", "tcp6":
|
||||||
|
return c.NetTransportTCP
|
||||||
|
case "udp", "udp4", "udp6":
|
||||||
|
return c.NetTransportUDP
|
||||||
|
case "unix", "unixgram", "unixpacket":
|
||||||
|
return c.NetTransportInProc
|
||||||
|
default:
|
||||||
|
// "ip:*", "ip4:*", and "ip6:*" all are considered other.
|
||||||
|
return c.NetTransportOther
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Host returns attributes for a network host address.
|
||||||
|
func (c *netConv) Host(address string) []attribute.KeyValue {
|
||||||
|
h, p := splitHostPort(address)
|
||||||
|
var n int
|
||||||
|
if h != "" {
|
||||||
|
n++
|
||||||
|
if p > 0 {
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if n == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
attrs := make([]attribute.KeyValue, 0, n)
|
||||||
|
attrs = append(attrs, c.HostName(h))
|
||||||
|
if p > 0 {
|
||||||
|
attrs = append(attrs, c.HostPort(int(p)))
|
||||||
|
}
|
||||||
|
return attrs
|
||||||
|
}
|
||||||
|
|
||||||
|
// Server returns attributes for a network listener listening at address. See
|
||||||
|
// net.Listen for information about acceptable address values, address should
|
||||||
|
// be the same as the one used to create ln. If ln is nil, only network host
|
||||||
|
// attributes will be returned that describe address. Otherwise, the socket
|
||||||
|
// level information about ln will also be included.
|
||||||
|
func (c *netConv) Server(address string, ln net.Listener) []attribute.KeyValue {
|
||||||
|
if ln == nil {
|
||||||
|
return c.Host(address)
|
||||||
|
}
|
||||||
|
|
||||||
|
lAddr := ln.Addr()
|
||||||
|
if lAddr == nil {
|
||||||
|
return c.Host(address)
|
||||||
|
}
|
||||||
|
|
||||||
|
hostName, hostPort := splitHostPort(address)
|
||||||
|
sockHostAddr, sockHostPort := splitHostPort(lAddr.String())
|
||||||
|
network := lAddr.Network()
|
||||||
|
sockFamily := family(network, sockHostAddr)
|
||||||
|
|
||||||
|
n := nonZeroStr(hostName, network, sockHostAddr, sockFamily)
|
||||||
|
n += positiveInt(hostPort, sockHostPort)
|
||||||
|
attr := make([]attribute.KeyValue, 0, n)
|
||||||
|
if hostName != "" {
|
||||||
|
attr = append(attr, c.HostName(hostName))
|
||||||
|
if hostPort > 0 {
|
||||||
|
// Only if net.host.name is set should net.host.port be.
|
||||||
|
attr = append(attr, c.HostPort(hostPort))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if network != "" {
|
||||||
|
attr = append(attr, c.Transport(network))
|
||||||
|
}
|
||||||
|
if sockFamily != "" {
|
||||||
|
attr = append(attr, c.NetSockFamilyKey.String(sockFamily))
|
||||||
|
}
|
||||||
|
if sockHostAddr != "" {
|
||||||
|
attr = append(attr, c.NetSockHostAddrKey.String(sockHostAddr))
|
||||||
|
if sockHostPort > 0 {
|
||||||
|
// Only if net.sock.host.addr is set should net.sock.host.port be.
|
||||||
|
attr = append(attr, c.NetSockHostPortKey.Int(sockHostPort))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return attr
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *netConv) HostName(name string) attribute.KeyValue {
|
||||||
|
return c.NetHostNameKey.String(name)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *netConv) HostPort(port int) attribute.KeyValue {
|
||||||
|
return c.NetHostPortKey.Int(port)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Client returns attributes for a client network connection to address. See
|
||||||
|
// net.Dial for information about acceptable address values, address should be
|
||||||
|
// the same as the one used to create conn. If conn is nil, only network peer
|
||||||
|
// attributes will be returned that describe address. Otherwise, the socket
|
||||||
|
// level information about conn will also be included.
|
||||||
|
func (c *netConv) Client(address string, conn net.Conn) []attribute.KeyValue {
|
||||||
|
if conn == nil {
|
||||||
|
return c.Peer(address)
|
||||||
|
}
|
||||||
|
|
||||||
|
lAddr, rAddr := conn.LocalAddr(), conn.RemoteAddr()
|
||||||
|
|
||||||
|
var network string
|
||||||
|
switch {
|
||||||
|
case lAddr != nil:
|
||||||
|
network = lAddr.Network()
|
||||||
|
case rAddr != nil:
|
||||||
|
network = rAddr.Network()
|
||||||
|
default:
|
||||||
|
return c.Peer(address)
|
||||||
|
}
|
||||||
|
|
||||||
|
peerName, peerPort := splitHostPort(address)
|
||||||
|
var (
|
||||||
|
sockFamily string
|
||||||
|
sockPeerAddr string
|
||||||
|
sockPeerPort int
|
||||||
|
sockHostAddr string
|
||||||
|
sockHostPort int
|
||||||
|
)
|
||||||
|
|
||||||
|
if lAddr != nil {
|
||||||
|
sockHostAddr, sockHostPort = splitHostPort(lAddr.String())
|
||||||
|
}
|
||||||
|
|
||||||
|
if rAddr != nil {
|
||||||
|
sockPeerAddr, sockPeerPort = splitHostPort(rAddr.String())
|
||||||
|
}
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case sockHostAddr != "":
|
||||||
|
sockFamily = family(network, sockHostAddr)
|
||||||
|
case sockPeerAddr != "":
|
||||||
|
sockFamily = family(network, sockPeerAddr)
|
||||||
|
}
|
||||||
|
|
||||||
|
n := nonZeroStr(peerName, network, sockPeerAddr, sockHostAddr, sockFamily)
|
||||||
|
n += positiveInt(peerPort, sockPeerPort, sockHostPort)
|
||||||
|
attr := make([]attribute.KeyValue, 0, n)
|
||||||
|
if peerName != "" {
|
||||||
|
attr = append(attr, c.PeerName(peerName))
|
||||||
|
if peerPort > 0 {
|
||||||
|
// Only if net.peer.name is set should net.peer.port be.
|
||||||
|
attr = append(attr, c.PeerPort(peerPort))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if network != "" {
|
||||||
|
attr = append(attr, c.Transport(network))
|
||||||
|
}
|
||||||
|
if sockFamily != "" {
|
||||||
|
attr = append(attr, c.NetSockFamilyKey.String(sockFamily))
|
||||||
|
}
|
||||||
|
if sockPeerAddr != "" {
|
||||||
|
attr = append(attr, c.NetSockPeerAddrKey.String(sockPeerAddr))
|
||||||
|
if sockPeerPort > 0 {
|
||||||
|
// Only if net.sock.peer.addr is set should net.sock.peer.port be.
|
||||||
|
attr = append(attr, c.NetSockPeerPortKey.Int(sockPeerPort))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if sockHostAddr != "" {
|
||||||
|
attr = append(attr, c.NetSockHostAddrKey.String(sockHostAddr))
|
||||||
|
if sockHostPort > 0 {
|
||||||
|
// Only if net.sock.host.addr is set should net.sock.host.port be.
|
||||||
|
attr = append(attr, c.NetSockHostPortKey.Int(sockHostPort))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return attr
|
||||||
|
}
|
||||||
|
|
||||||
|
func family(network, address string) string {
|
||||||
|
switch network {
|
||||||
|
case "unix", "unixgram", "unixpacket":
|
||||||
|
return "unix"
|
||||||
|
default:
|
||||||
|
if ip := net.ParseIP(address); ip != nil {
|
||||||
|
if ip.To4() == nil {
|
||||||
|
return "inet6"
|
||||||
|
}
|
||||||
|
return "inet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func nonZeroStr(strs ...string) int {
|
||||||
|
var n int
|
||||||
|
for _, str := range strs {
|
||||||
|
if str != "" {
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
|
func positiveInt(ints ...int) int {
|
||||||
|
var n int
|
||||||
|
for _, i := range ints {
|
||||||
|
if i > 0 {
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
|
// Peer returns attributes for a network peer address.
|
||||||
|
func (c *netConv) Peer(address string) []attribute.KeyValue {
|
||||||
|
h, p := splitHostPort(address)
|
||||||
|
var n int
|
||||||
|
if h != "" {
|
||||||
|
n++
|
||||||
|
if p > 0 {
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if n == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
attrs := make([]attribute.KeyValue, 0, n)
|
||||||
|
attrs = append(attrs, c.PeerName(h))
|
||||||
|
if p > 0 {
|
||||||
|
attrs = append(attrs, c.PeerPort(int(p)))
|
||||||
|
}
|
||||||
|
return attrs
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *netConv) PeerName(name string) attribute.KeyValue {
|
||||||
|
return c.NetPeerNameKey.String(name)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *netConv) PeerPort(port int) attribute.KeyValue {
|
||||||
|
return c.NetPeerPortKey.Int(port)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *netConv) SockPeerAddr(addr string) attribute.KeyValue {
|
||||||
|
return c.NetSockPeerAddrKey.String(addr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *netConv) SockPeerPort(port int) attribute.KeyValue {
|
||||||
|
return c.NetSockPeerPortKey.Int(port)
|
||||||
|
}
|
||||||
|
|
||||||
|
// splitHostPort splits a network address hostport of the form "host",
|
||||||
|
// "host%zone", "[host]", "[host%zone], "host:port", "host%zone:port",
|
||||||
|
// "[host]:port", "[host%zone]:port", or ":port" into host or host%zone and
|
||||||
|
// port.
|
||||||
|
//
|
||||||
|
// An empty host is returned if it is not provided or unparsable. A negative
|
||||||
|
// port is returned if it is not provided or unparsable.
|
||||||
|
func splitHostPort(hostport string) (host string, port int) {
|
||||||
|
port = -1
|
||||||
|
|
||||||
|
if strings.HasPrefix(hostport, "[") {
|
||||||
|
addrEnd := strings.LastIndex(hostport, "]")
|
||||||
|
if addrEnd < 0 {
|
||||||
|
// Invalid hostport.
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if i := strings.LastIndex(hostport[addrEnd:], ":"); i < 0 {
|
||||||
|
host = hostport[1:addrEnd]
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if i := strings.LastIndex(hostport, ":"); i < 0 {
|
||||||
|
host = hostport
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
host, pStr, err := net.SplitHostPort(hostport)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
p, err := strconv.ParseUint(pStr, 10, 16)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return host, int(p)
|
||||||
|
}
|
2
src/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/labeler.go
generated
vendored
2
src/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/labeler.go
generated
vendored
@ -12,7 +12,7 @@
|
|||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
package otelhttp
|
package otelhttp // import "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
81
src/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/transport.go
generated
vendored
81
src/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/transport.go
generated
vendored
@ -12,15 +12,18 @@
|
|||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
package otelhttp
|
package otelhttp // import "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"net/http/httptrace"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconvutil"
|
||||||
|
"go.opentelemetry.io/otel"
|
||||||
|
"go.opentelemetry.io/otel/codes"
|
||||||
"go.opentelemetry.io/otel/propagation"
|
"go.opentelemetry.io/otel/propagation"
|
||||||
semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
|
|
||||||
"go.opentelemetry.io/otel/trace"
|
"go.opentelemetry.io/otel/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -34,6 +37,7 @@ type Transport struct {
|
|||||||
spanStartOptions []trace.SpanStartOption
|
spanStartOptions []trace.SpanStartOption
|
||||||
filters []Filter
|
filters []Filter
|
||||||
spanNameFormatter func(string, *http.Request) string
|
spanNameFormatter func(string, *http.Request) string
|
||||||
|
clientTrace func(context.Context) *httptrace.ClientTrace
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ http.RoundTripper = &Transport{}
|
var _ http.RoundTripper = &Transport{}
|
||||||
@ -42,7 +46,7 @@ var _ http.RoundTripper = &Transport{}
|
|||||||
// starts a span and injects the span context into the outbound request headers.
|
// starts a span and injects the span context into the outbound request headers.
|
||||||
//
|
//
|
||||||
// If the provided http.RoundTripper is nil, http.DefaultTransport will be used
|
// If the provided http.RoundTripper is nil, http.DefaultTransport will be used
|
||||||
// as the base http.RoundTripper
|
// as the base http.RoundTripper.
|
||||||
func NewTransport(base http.RoundTripper, opts ...Option) *Transport {
|
func NewTransport(base http.RoundTripper, opts ...Option) *Transport {
|
||||||
if base == nil {
|
if base == nil {
|
||||||
base = http.DefaultTransport
|
base = http.DefaultTransport
|
||||||
@ -69,6 +73,7 @@ func (t *Transport) applyConfig(c *config) {
|
|||||||
t.spanStartOptions = c.SpanStartOptions
|
t.spanStartOptions = c.SpanStartOptions
|
||||||
t.filters = c.Filters
|
t.filters = c.Filters
|
||||||
t.spanNameFormatter = c.SpanNameFormatter
|
t.spanNameFormatter = c.SpanNameFormatter
|
||||||
|
t.clientTrace = c.ClientTrace
|
||||||
}
|
}
|
||||||
|
|
||||||
func defaultTransportFormatter(_ string, r *http.Request) string {
|
func defaultTransportFormatter(_ string, r *http.Request) string {
|
||||||
@ -86,35 +91,83 @@ func (t *Transport) RoundTrip(r *http.Request) (*http.Response, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tracer := t.tracer
|
||||||
|
|
||||||
|
if tracer == nil {
|
||||||
|
if span := trace.SpanFromContext(r.Context()); span.SpanContext().IsValid() {
|
||||||
|
tracer = newTracer(span.TracerProvider())
|
||||||
|
} else {
|
||||||
|
tracer = newTracer(otel.GetTracerProvider())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
opts := append([]trace.SpanStartOption{}, t.spanStartOptions...) // start with the configured options
|
opts := append([]trace.SpanStartOption{}, t.spanStartOptions...) // start with the configured options
|
||||||
|
|
||||||
ctx, span := t.tracer.Start(r.Context(), t.spanNameFormatter("", r), opts...)
|
ctx, span := tracer.Start(r.Context(), t.spanNameFormatter("", r), opts...)
|
||||||
|
|
||||||
r = r.WithContext(ctx)
|
if t.clientTrace != nil {
|
||||||
span.SetAttributes(semconv.HTTPClientAttributesFromHTTPRequest(r)...)
|
ctx = httptrace.WithClientTrace(ctx, t.clientTrace(ctx))
|
||||||
|
}
|
||||||
|
|
||||||
|
r = r.Clone(ctx) // According to RoundTripper spec, we shouldn't modify the origin request.
|
||||||
|
span.SetAttributes(semconvutil.HTTPClientRequest(r)...)
|
||||||
t.propagators.Inject(ctx, propagation.HeaderCarrier(r.Header))
|
t.propagators.Inject(ctx, propagation.HeaderCarrier(r.Header))
|
||||||
|
|
||||||
res, err := t.rt.RoundTrip(r)
|
res, err := t.rt.RoundTrip(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
span.RecordError(err)
|
span.RecordError(err)
|
||||||
|
span.SetStatus(codes.Error, err.Error())
|
||||||
span.End()
|
span.End()
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
|
||||||
span.SetAttributes(semconv.HTTPAttributesFromHTTPStatusCode(res.StatusCode)...)
|
span.SetAttributes(semconvutil.HTTPClientResponse(res)...)
|
||||||
span.SetStatus(semconv.SpanStatusFromHTTPStatusCode(res.StatusCode))
|
span.SetStatus(semconvutil.HTTPClientStatus(res.StatusCode))
|
||||||
res.Body = &wrappedBody{ctx: ctx, span: span, body: res.Body}
|
res.Body = newWrappedBody(span, res.Body)
|
||||||
|
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// newWrappedBody returns a new and appropriately scoped *wrappedBody as an
|
||||||
|
// io.ReadCloser. If the passed body implements io.Writer, the returned value
|
||||||
|
// will implement io.ReadWriteCloser.
|
||||||
|
func newWrappedBody(span trace.Span, body io.ReadCloser) io.ReadCloser {
|
||||||
|
// The successful protocol switch responses will have a body that
|
||||||
|
// implement an io.ReadWriteCloser. Ensure this interface type continues
|
||||||
|
// to be satisfied if that is the case.
|
||||||
|
if _, ok := body.(io.ReadWriteCloser); ok {
|
||||||
|
return &wrappedBody{span: span, body: body}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove the implementation of the io.ReadWriteCloser and only implement
|
||||||
|
// the io.ReadCloser.
|
||||||
|
return struct{ io.ReadCloser }{&wrappedBody{span: span, body: body}}
|
||||||
|
}
|
||||||
|
|
||||||
|
// wrappedBody is the response body type returned by the transport
|
||||||
|
// instrumentation to complete a span. Errors encountered when using the
|
||||||
|
// response body are recorded in span tracking the response.
|
||||||
|
//
|
||||||
|
// The span tracking the response is ended when this body is closed.
|
||||||
|
//
|
||||||
|
// If the response body implements the io.Writer interface (i.e. for
|
||||||
|
// successful protocol switches), the wrapped body also will.
|
||||||
type wrappedBody struct {
|
type wrappedBody struct {
|
||||||
ctx context.Context
|
|
||||||
span trace.Span
|
span trace.Span
|
||||||
body io.ReadCloser
|
body io.ReadCloser
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ io.ReadCloser = &wrappedBody{}
|
var _ io.ReadWriteCloser = &wrappedBody{}
|
||||||
|
|
||||||
|
func (wb *wrappedBody) Write(p []byte) (int, error) {
|
||||||
|
// This will not panic given the guard in newWrappedBody.
|
||||||
|
n, err := wb.body.(io.Writer).Write(p)
|
||||||
|
if err != nil {
|
||||||
|
wb.span.RecordError(err)
|
||||||
|
wb.span.SetStatus(codes.Error, err.Error())
|
||||||
|
}
|
||||||
|
return n, err
|
||||||
|
}
|
||||||
|
|
||||||
func (wb *wrappedBody) Read(b []byte) (int, error) {
|
func (wb *wrappedBody) Read(b []byte) (int, error) {
|
||||||
n, err := wb.body.Read(b)
|
n, err := wb.body.Read(b)
|
||||||
@ -126,11 +179,15 @@ func (wb *wrappedBody) Read(b []byte) (int, error) {
|
|||||||
wb.span.End()
|
wb.span.End()
|
||||||
default:
|
default:
|
||||||
wb.span.RecordError(err)
|
wb.span.RecordError(err)
|
||||||
|
wb.span.SetStatus(codes.Error, err.Error())
|
||||||
}
|
}
|
||||||
return n, err
|
return n, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (wb *wrappedBody) Close() error {
|
func (wb *wrappedBody) Close() error {
|
||||||
wb.span.End()
|
wb.span.End()
|
||||||
return wb.body.Close()
|
if wb.body != nil {
|
||||||
|
return wb.body.Close()
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -12,13 +12,17 @@
|
|||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
/*
|
package otelhttp // import "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
|
||||||
Package registry provides a non-standalone implementation of
|
|
||||||
MeterProvider that adds uniqueness checking for instrument descriptors
|
|
||||||
on top of other MeterProvider it wraps.
|
|
||||||
|
|
||||||
This package is currently in a pre-GA phase. Backwards incompatible changes
|
// Version is the current release version of the otelhttp instrumentation.
|
||||||
may be introduced in subsequent minor version releases as we work to track the
|
func Version() string {
|
||||||
evolving OpenTelemetry specification and user feedback.
|
return "0.45.0"
|
||||||
*/
|
// This string is updated by the pre_release.sh script during release
|
||||||
package registry // import "go.opentelemetry.io/otel/metric/registry"
|
}
|
||||||
|
|
||||||
|
// SemVersion is the semantic version to be supplied to tracer/meter creation.
|
||||||
|
//
|
||||||
|
// Deprecated: Use [Version] instead.
|
||||||
|
func SemVersion() string {
|
||||||
|
return Version()
|
||||||
|
}
|
19
src/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/wrap.go
generated
vendored
19
src/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/wrap.go
generated
vendored
@ -12,7 +12,7 @@
|
|||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
package otelhttp
|
package otelhttp // import "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -25,7 +25,7 @@ import (
|
|||||||
var _ io.ReadCloser = &bodyWrapper{}
|
var _ io.ReadCloser = &bodyWrapper{}
|
||||||
|
|
||||||
// bodyWrapper wraps a http.Request.Body (an io.ReadCloser) to track the number
|
// bodyWrapper wraps a http.Request.Body (an io.ReadCloser) to track the number
|
||||||
// of bytes read and the last error
|
// of bytes read and the last error.
|
||||||
type bodyWrapper struct {
|
type bodyWrapper struct {
|
||||||
io.ReadCloser
|
io.ReadCloser
|
||||||
record func(n int64) // must not be nil
|
record func(n int64) // must not be nil
|
||||||
@ -50,7 +50,7 @@ func (w *bodyWrapper) Close() error {
|
|||||||
var _ http.ResponseWriter = &respWriterWrapper{}
|
var _ http.ResponseWriter = &respWriterWrapper{}
|
||||||
|
|
||||||
// respWriterWrapper wraps a http.ResponseWriter in order to track the number of
|
// respWriterWrapper wraps a http.ResponseWriter in order to track the number of
|
||||||
// bytes written, the last error, and to catch the returned statusCode
|
// bytes written, the last error, and to catch the first written statusCode.
|
||||||
// TODO: The wrapped http.ResponseWriter doesn't implement any of the optional
|
// TODO: The wrapped http.ResponseWriter doesn't implement any of the optional
|
||||||
// types (http.Hijacker, http.Pusher, http.CloseNotifier, http.Flusher, etc)
|
// types (http.Hijacker, http.Pusher, http.CloseNotifier, http.Flusher, etc)
|
||||||
// that may be useful when using it in real life situations.
|
// that may be useful when using it in real life situations.
|
||||||
@ -85,12 +85,15 @@ func (w *respWriterWrapper) Write(p []byte) (int, error) {
|
|||||||
return n, err
|
return n, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WriteHeader persists initial statusCode for span attribution.
|
||||||
|
// All calls to WriteHeader will be propagated to the underlying ResponseWriter
|
||||||
|
// and will persist the statusCode from the first call.
|
||||||
|
// Blocking consecutive calls to WriteHeader alters expected behavior and will
|
||||||
|
// remove warning logs from net/http where developers will notice incorrect handler implementations.
|
||||||
func (w *respWriterWrapper) WriteHeader(statusCode int) {
|
func (w *respWriterWrapper) WriteHeader(statusCode int) {
|
||||||
if w.wroteHeader {
|
if !w.wroteHeader {
|
||||||
return
|
w.wroteHeader = true
|
||||||
|
w.statusCode = statusCode
|
||||||
}
|
}
|
||||||
w.wroteHeader = true
|
|
||||||
w.statusCode = statusCode
|
|
||||||
w.props.Inject(w.ctx, propagation.HeaderCarrier(w.Header()))
|
|
||||||
w.ResponseWriter.WriteHeader(statusCode)
|
w.ResponseWriter.WriteHeader(statusCode)
|
||||||
}
|
}
|
||||||
|
5
src/vendor/go.opentelemetry.io/otel/.codespellignore
generated
vendored
Normal file
5
src/vendor/go.opentelemetry.io/otel/.codespellignore
generated
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
ot
|
||||||
|
fo
|
||||||
|
te
|
||||||
|
collison
|
||||||
|
consequentially
|
10
src/vendor/go.opentelemetry.io/otel/.codespellrc
generated
vendored
Normal file
10
src/vendor/go.opentelemetry.io/otel/.codespellrc
generated
vendored
Normal file
@ -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 =
|
4
src/vendor/go.opentelemetry.io/otel/.gitignore
generated
vendored
4
src/vendor/go.opentelemetry.io/otel/.gitignore
generated
vendored
@ -2,14 +2,18 @@
|
|||||||
Thumbs.db
|
Thumbs.db
|
||||||
|
|
||||||
.tools/
|
.tools/
|
||||||
|
venv/
|
||||||
.idea/
|
.idea/
|
||||||
.vscode/
|
.vscode/
|
||||||
*.iml
|
*.iml
|
||||||
*.so
|
*.so
|
||||||
coverage.*
|
coverage.*
|
||||||
|
go.work
|
||||||
|
go.work.sum
|
||||||
|
|
||||||
gen/
|
gen/
|
||||||
|
|
||||||
|
/example/dice/dice
|
||||||
/example/fib/fib
|
/example/fib/fib
|
||||||
/example/fib/traces.txt
|
/example/fib/traces.txt
|
||||||
/example/jaeger/jaeger
|
/example/jaeger/jaeger
|
||||||
|
83
src/vendor/go.opentelemetry.io/otel/.golangci.yml
generated
vendored
83
src/vendor/go.opentelemetry.io/otel/.golangci.yml
generated
vendored
@ -61,30 +61,67 @@ issues:
|
|||||||
|
|
||||||
linters-settings:
|
linters-settings:
|
||||||
depguard:
|
depguard:
|
||||||
# Check the list against standard lib.
|
rules:
|
||||||
# Default: false
|
non-tests:
|
||||||
include-go-root: true
|
files:
|
||||||
# A list of packages for the list type specified.
|
- "!$test"
|
||||||
# Default: []
|
- "!**/*test/*.go"
|
||||||
packages:
|
- "!**/internal/matchers/*.go"
|
||||||
- "crypto/md5"
|
deny:
|
||||||
- "crypto/sha1"
|
- pkg: "testing"
|
||||||
- "crypto/**/pkix"
|
- pkg: "github.com/stretchr/testify"
|
||||||
ignore-file-rules:
|
- pkg: "crypto/md5"
|
||||||
- "**/*_test.go"
|
- pkg: "crypto/sha1"
|
||||||
additional-guards:
|
- pkg: "crypto/**/pkix"
|
||||||
# Do not allow testing packages in non-test files.
|
otlp-internal:
|
||||||
- list-type: denylist
|
files:
|
||||||
include-go-root: true
|
- "!**/exporters/otlp/internal/**/*.go"
|
||||||
packages:
|
deny:
|
||||||
- testing
|
- pkg: "go.opentelemetry.io/otel/exporters/otlp/internal"
|
||||||
- github.com/stretchr/testify
|
desc: Do not use cross-module internal packages.
|
||||||
ignore-file-rules:
|
otlptrace-internal:
|
||||||
- "**/*_test.go"
|
files:
|
||||||
- "**/*test/*.go"
|
- "!**/exporters/otlp/otlptrace/*.go"
|
||||||
- "**/internal/matchers/*.go"
|
- "!**/exporters/otlp/otlptrace/internal/**.go"
|
||||||
|
deny:
|
||||||
|
- pkg: "go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal"
|
||||||
|
desc: Do not use cross-module internal packages.
|
||||||
|
otlpmetric-internal:
|
||||||
|
files:
|
||||||
|
- "!**/exporters/otlp/otlpmetric/internal/*.go"
|
||||||
|
- "!**/exporters/otlp/otlpmetric/internal/**/*.go"
|
||||||
|
deny:
|
||||||
|
- pkg: "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/internal"
|
||||||
|
desc: Do not use cross-module internal packages.
|
||||||
|
otel-internal:
|
||||||
|
files:
|
||||||
|
- "**/sdk/*.go"
|
||||||
|
- "**/sdk/**/*.go"
|
||||||
|
- "**/exporters/*.go"
|
||||||
|
- "**/exporters/**/*.go"
|
||||||
|
- "**/schema/*.go"
|
||||||
|
- "**/schema/**/*.go"
|
||||||
|
- "**/metric/*.go"
|
||||||
|
- "**/metric/**/*.go"
|
||||||
|
- "**/bridge/*.go"
|
||||||
|
- "**/bridge/**/*.go"
|
||||||
|
- "**/example/*.go"
|
||||||
|
- "**/example/**/*.go"
|
||||||
|
- "**/trace/*.go"
|
||||||
|
- "**/trace/**/*.go"
|
||||||
|
deny:
|
||||||
|
- pkg: "go.opentelemetry.io/otel/internal$"
|
||||||
|
desc: Do not use cross-module internal packages.
|
||||||
|
- pkg: "go.opentelemetry.io/otel/internal/attribute"
|
||||||
|
desc: Do not use cross-module internal packages.
|
||||||
|
- pkg: "go.opentelemetry.io/otel/internal/internaltest"
|
||||||
|
desc: Do not use cross-module internal packages.
|
||||||
|
- pkg: "go.opentelemetry.io/otel/internal/matchers"
|
||||||
|
desc: Do not use cross-module internal packages.
|
||||||
godot:
|
godot:
|
||||||
exclude:
|
exclude:
|
||||||
|
# Exclude links.
|
||||||
|
- '^ *\[[^]]+\]:'
|
||||||
# Exclude sentence fragments for lists.
|
# Exclude sentence fragments for lists.
|
||||||
- '^[ ]*[-•]'
|
- '^[ ]*[-•]'
|
||||||
# Exclude sentences prefixing a list.
|
# Exclude sentences prefixing a list.
|
||||||
@ -111,7 +148,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:
|
||||||
|
384
src/vendor/go.opentelemetry.io/otel/CHANGELOG.md
generated
vendored
384
src/vendor/go.opentelemetry.io/otel/CHANGELOG.md
generated
vendored
@ -8,6 +8,360 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [1.19.0/0.42.0/0.0.7] 2023-09-28
|
||||||
|
|
||||||
|
This release contains the first stable release of the OpenTelemetry Go [metric SDK].
|
||||||
|
Our project stability guarantees now apply to the `go.opentelemetry.io/otel/sdk/metric` package.
|
||||||
|
See our [versioning policy](VERSIONING.md) for more information about these stability guarantees.
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add the "Roll the dice" getting started application example in `go.opentelemetry.io/otel/example/dice`. (#4539)
|
||||||
|
- The `WithWriter` and `WithPrettyPrint` options to `go.opentelemetry.io/otel/exporters/stdout/stdoutmetric` to set a custom `io.Writer`, and allow displaying the output in human-readable JSON. (#4507)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Allow '/' characters in metric instrument names. (#4501)
|
||||||
|
- The exporter in `go.opentelemetry.io/otel/exporters/stdout/stdoutmetric` does not prettify its output by default anymore. (#4507)
|
||||||
|
- Upgrade `gopkg.io/yaml` from `v2` to `v3` in `go.opentelemetry.io/otel/schema`. (#4535)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- In `go.opentelemetry.op/otel/exporters/prometheus`, don't try to create the Prometheus metric on every `Collect` if we know the scope is invalid. (#4499)
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- Remove `"go.opentelemetry.io/otel/bridge/opencensus".NewMetricExporter`, which is replaced by `NewMetricProducer`. (#4566)
|
||||||
|
|
||||||
|
## [1.19.0-rc.1/0.42.0-rc.1] 2023-09-14
|
||||||
|
|
||||||
|
This is a release candidate for the v1.19.0/v0.42.0 release.
|
||||||
|
That release is expected to include the `v1` release of the OpenTelemetry Go metric SDK and will provide stability guarantees of that SDK.
|
||||||
|
See our [versioning policy](VERSIONING.md) for more information about these stability guarantees.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Allow '/' characters in metric instrument names. (#4501)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- In `go.opentelemetry.op/otel/exporters/prometheus`, don't try to create the prometheus metric on every `Collect` if we know the scope is invalid. (#4499)
|
||||||
|
|
||||||
|
## [1.18.0/0.41.0/0.0.6] 2023-09-12
|
||||||
|
|
||||||
|
This release drops the compatibility guarantee of [Go 1.19].
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add `WithProducer` option in `go.opentelemetry.op/otel/exporters/prometheus` to restore the ability to register producers on the prometheus exporter's manual reader. (#4473)
|
||||||
|
- Add `IgnoreValue` option in `go.opentelemetry.io/otel/sdk/metric/metricdata/metricdatatest` to allow ignoring values when comparing metrics. (#4447)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Use a `TestingT` interface instead of `*testing.T` struct in `go.opentelemetry.io/otel/sdk/metric/metricdata/metricdatatest`. (#4483)
|
||||||
|
|
||||||
|
### Deprecated
|
||||||
|
|
||||||
|
- The `NewMetricExporter` in `go.opentelemetry.io/otel/bridge/opencensus` was deprecated in `v0.35.0` (#3541).
|
||||||
|
The deprecation notice format for the function has been corrected to trigger Go documentation and build tooling. (#4470)
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- Removed the deprecated `go.opentelemetry.io/otel/exporters/jaeger` package. (#4467)
|
||||||
|
- Removed the deprecated `go.opentelemetry.io/otel/example/jaeger` package. (#4467)
|
||||||
|
- Removed the deprecated `go.opentelemetry.io/otel/sdk/metric/aggregation` package. (#4468)
|
||||||
|
- Removed the deprecated internal packages in `go.opentelemetry.io/otel/exporters/otlp` and its sub-packages. (#4469)
|
||||||
|
- Dropped guaranteed support for versions of Go less than 1.20. (#4481)
|
||||||
|
|
||||||
|
## [1.17.0/0.40.0/0.0.5] 2023-08-28
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Export the `ManualReader` struct in `go.opentelemetry.io/otel/sdk/metric`. (#4244)
|
||||||
|
- Export the `PeriodicReader` struct in `go.opentelemetry.io/otel/sdk/metric`. (#4244)
|
||||||
|
- Add support for exponential histogram aggregations.
|
||||||
|
A histogram can be configured as an exponential histogram using a view with `"go.opentelemetry.io/otel/sdk/metric".ExponentialHistogram` as the aggregation. (#4245)
|
||||||
|
- Export the `Exporter` struct in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc`. (#4272)
|
||||||
|
- Export the `Exporter` struct in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp`. (#4272)
|
||||||
|
- The exporters in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric` now support the `OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE` environment variable. (#4287)
|
||||||
|
- Add `WithoutCounterSuffixes` option in `go.opentelemetry.io/otel/exporters/prometheus` to disable addition of `_total` suffixes. (#4306)
|
||||||
|
- Add info and debug logging to the metric SDK in `go.opentelemetry.io/otel/sdk/metric`. (#4315)
|
||||||
|
- The `go.opentelemetry.io/otel/semconv/v1.21.0` package.
|
||||||
|
The package contains semantic conventions from the `v1.21.0` version of the OpenTelemetry Semantic Conventions. (#4362)
|
||||||
|
- Accept 201 to 299 HTTP status as success in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp` and `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp`. (#4365)
|
||||||
|
- Document the `Temporality` and `Aggregation` methods of the `"go.opentelemetry.io/otel/sdk/metric".Exporter"` need to be concurrent safe. (#4381)
|
||||||
|
- Expand the set of units supported by the Prometheus exporter, and don't add unit suffixes if they are already present in `go.opentelemetry.op/otel/exporters/prometheus` (#4374)
|
||||||
|
- Move the `Aggregation` interface and its implementations from `go.opentelemetry.io/otel/sdk/metric/aggregation` to `go.opentelemetry.io/otel/sdk/metric`. (#4435)
|
||||||
|
- The exporters in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric` now support the `OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION` environment variable. (#4437)
|
||||||
|
- Add the `NewAllowKeysFilter` and `NewDenyKeysFilter` functions to `go.opentelemetry.io/otel/attribute` to allow convenient creation of allow-keys and deny-keys filters. (#4444)
|
||||||
|
- Support Go 1.21. (#4463)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Starting from `v1.21.0` of semantic conventions, `go.opentelemetry.io/otel/semconv/{version}/httpconv` and `go.opentelemetry.io/otel/semconv/{version}/netconv` packages will no longer be published. (#4145)
|
||||||
|
- Log duplicate instrument conflict at a warning level instead of info in `go.opentelemetry.io/otel/sdk/metric`. (#4202)
|
||||||
|
- Return an error on the creation of new instruments in `go.opentelemetry.io/otel/sdk/metric` if their name doesn't pass regexp validation. (#4210)
|
||||||
|
- `NewManualReader` in `go.opentelemetry.io/otel/sdk/metric` returns `*ManualReader` instead of `Reader`. (#4244)
|
||||||
|
- `NewPeriodicReader` in `go.opentelemetry.io/otel/sdk/metric` returns `*PeriodicReader` instead of `Reader`. (#4244)
|
||||||
|
- Count the Collect time in the `PeriodicReader` timeout in `go.opentelemetry.io/otel/sdk/metric`. (#4221)
|
||||||
|
- The function `New` in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc` returns `*Exporter` instead of `"go.opentelemetry.io/otel/sdk/metric".Exporter`. (#4272)
|
||||||
|
- The function `New` in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp` returns `*Exporter` instead of `"go.opentelemetry.io/otel/sdk/metric".Exporter`. (#4272)
|
||||||
|
- If an attribute set is omitted from an async callback, the previous value will no longer be exported in `go.opentelemetry.io/otel/sdk/metric`. (#4290)
|
||||||
|
- If an attribute set is observed multiple times in an async callback in `go.opentelemetry.io/otel/sdk/metric`, the values will be summed instead of the last observation winning. (#4289)
|
||||||
|
- Allow the explicit bucket histogram aggregation to be used for the up-down counter, observable counter, observable up-down counter, and observable gauge in the `go.opentelemetry.io/otel/sdk/metric` package. (#4332)
|
||||||
|
- Restrict `Meter`s in `go.opentelemetry.io/otel/sdk/metric` to only register and collect instruments it created. (#4333)
|
||||||
|
- `PeriodicReader.Shutdown` and `PeriodicReader.ForceFlush` in `go.opentelemetry.io/otel/sdk/metric` now apply the periodic reader's timeout to the operation if the user provided context does not contain a deadline. (#4356, #4377)
|
||||||
|
- Upgrade all use of `go.opentelemetry.io/otel/semconv` to use `v1.21.0`. (#4408)
|
||||||
|
- Increase instrument name maximum length from 63 to 255 characters in `go.opentelemetry.io/otel/sdk/metric`. (#4434)
|
||||||
|
- Add `go.opentelemetry.op/otel/sdk/metric.WithProducer` as an `Option` for `"go.opentelemetry.io/otel/sdk/metric".NewManualReader` and `"go.opentelemetry.io/otel/sdk/metric".NewPeriodicReader`. (#4346)
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- Remove `Reader.RegisterProducer` in `go.opentelemetry.io/otel/metric`.
|
||||||
|
Use the added `WithProducer` option instead. (#4346)
|
||||||
|
- Remove `Reader.ForceFlush` in `go.opentelemetry.io/otel/metric`.
|
||||||
|
Notice that `PeriodicReader.ForceFlush` is still available. (#4375)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Correctly format log messages from the `go.opentelemetry.io/otel/exporters/zipkin` exporter. (#4143)
|
||||||
|
- Log an error for calls to `NewView` in `go.opentelemetry.io/otel/sdk/metric` that have empty criteria. (#4307)
|
||||||
|
- Fix `"go.opentelemetry.io/otel/sdk/resource".WithHostID()` to not set an empty `host.id`. (#4317)
|
||||||
|
- Use the instrument identifying fields to cache aggregators and determine duplicate instrument registrations in `go.opentelemetry.io/otel/sdk/metric`. (#4337)
|
||||||
|
- Detect duplicate instruments for case-insensitive names in `go.opentelemetry.io/otel/sdk/metric`. (#4338)
|
||||||
|
- The `ManualReader` will not panic if `AggregationSelector` returns `nil` in `go.opentelemetry.io/otel/sdk/metric`. (#4350)
|
||||||
|
- If a `Reader`'s `AggregationSelector` returns `nil` or `DefaultAggregation` the pipeline will use the default aggregation. (#4350)
|
||||||
|
- Log a suggested view that fixes instrument conflicts in `go.opentelemetry.io/otel/sdk/metric`. (#4349)
|
||||||
|
- Fix possible panic, deadlock and race condition in batch span processor in `go.opentelemetry.io/otel/sdk/trace`. (#4353)
|
||||||
|
- Improve context cancellation handling in batch span processor's `ForceFlush` in `go.opentelemetry.io/otel/sdk/trace`. (#4369)
|
||||||
|
- Decouple `go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal` from `go.opentelemetry.io/otel/exporters/otlp/internal` using gotmpl. (#4397, #3846)
|
||||||
|
- Decouple `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc/internal` from `go.opentelemetry.io/otel/exporters/otlp/internal` and `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/internal` using gotmpl. (#4404, #3846)
|
||||||
|
- Decouple `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp/internal` from `go.opentelemetry.io/otel/exporters/otlp/internal` and `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/internal` using gotmpl. (#4407, #3846)
|
||||||
|
- Decouple `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal` from `go.opentelemetry.io/otel/exporters/otlp/internal` and `go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal` using gotmpl. (#4400, #3846)
|
||||||
|
- Decouple `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal` from `go.opentelemetry.io/otel/exporters/otlp/internal` and `go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal` using gotmpl. (#4401, #3846)
|
||||||
|
- Do not block the metric SDK when OTLP metric exports are blocked in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc` and `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp`. (#3925, #4395)
|
||||||
|
- Do not append `_total` if the counter already has that suffix for the Prometheus exproter in `go.opentelemetry.io/otel/exporter/prometheus`. (#4373)
|
||||||
|
- Fix resource detection data race in `go.opentelemetry.io/otel/sdk/resource`. (#4409)
|
||||||
|
- Use the first-seen instrument name during instrument name conflicts in `go.opentelemetry.io/otel/sdk/metric`. (#4428)
|
||||||
|
|
||||||
|
### Deprecated
|
||||||
|
|
||||||
|
- The `go.opentelemetry.io/otel/exporters/jaeger` package is deprecated.
|
||||||
|
OpenTelemetry dropped support for Jaeger exporter in July 2023.
|
||||||
|
Use `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp`
|
||||||
|
or `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc` instead. (#4423)
|
||||||
|
- The `go.opentelemetry.io/otel/example/jaeger` package is deprecated. (#4423)
|
||||||
|
- The `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/internal` package is deprecated. (#4420)
|
||||||
|
- The `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/internal/oconf` package is deprecated. (#4420)
|
||||||
|
- The `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/internal/otest` package is deprecated. (#4420)
|
||||||
|
- The `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/internal/transform` package is deprecated. (#4420)
|
||||||
|
- The `go.opentelemetry.io/otel/exporters/otlp/internal` package is deprecated. (#4421)
|
||||||
|
- The `go.opentelemetry.io/otel/exporters/otlp/internal/envconfig` package is deprecated. (#4421)
|
||||||
|
- The `go.opentelemetry.io/otel/exporters/otlp/internal/retry` package is deprecated. (#4421)
|
||||||
|
- The `go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal` package is deprecated. (#4425)
|
||||||
|
- The `go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/envconfig` package is deprecated. (#4425)
|
||||||
|
- The `go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig` package is deprecated. (#4425)
|
||||||
|
- The `go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlptracetest` package is deprecated. (#4425)
|
||||||
|
- The `go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/retry` package is deprecated. (#4425)
|
||||||
|
- The `go.opentelemetry.io/otel/sdk/metric/aggregation` package is deprecated.
|
||||||
|
Use the aggregation types added to `go.opentelemetry.io/otel/sdk/metric` instead. (#4435)
|
||||||
|
|
||||||
|
## [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)
|
||||||
|
- The Exponential Histogram data types in `go.opentelemetry.io/otel/sdk/metric/metricdata`. (#4165)
|
||||||
|
- OTLP metrics exporter now supports the Exponential Histogram Data Type. (#4222)
|
||||||
|
- Fix serialization of `time.Time` zero values in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc` and `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp` packages. (#4271)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Use `strings.Cut()` instead of `string.SplitN()` for better readability and memory use. (#4049)
|
||||||
|
- `MeterProvider` returns noop meters once it has been shutdown. (#4154)
|
||||||
|
|
||||||
|
### 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
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Remove unused imports from `sdk/resource/host_id_bsd.go` which caused build failures. (#4040, #4041)
|
||||||
|
|
||||||
|
## [1.15.0/0.38.0] 2023-04-27
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- The `go.opentelemetry.io/otel/metric/embedded` package. (#3916)
|
||||||
|
- The `Version` function to `go.opentelemetry.io/otel/sdk` to return the SDK version. (#3949)
|
||||||
|
- Add a `WithNamespace` option to `go.opentelemetry.io/otel/exporters/prometheus` to allow users to prefix metrics with a namespace. (#3970)
|
||||||
|
- The following configuration types were added to `go.opentelemetry.io/otel/metric/instrument` to be used in the configuration of measurement methods. (#3971)
|
||||||
|
- The `AddConfig` used to hold configuration for addition measurements
|
||||||
|
- `NewAddConfig` used to create a new `AddConfig`
|
||||||
|
- `AddOption` used to configure an `AddConfig`
|
||||||
|
- The `RecordConfig` used to hold configuration for recorded measurements
|
||||||
|
- `NewRecordConfig` used to create a new `RecordConfig`
|
||||||
|
- `RecordOption` used to configure a `RecordConfig`
|
||||||
|
- The `ObserveConfig` used to hold configuration for observed measurements
|
||||||
|
- `NewObserveConfig` used to create a new `ObserveConfig`
|
||||||
|
- `ObserveOption` used to configure an `ObserveConfig`
|
||||||
|
- `WithAttributeSet` and `WithAttributes` are added to `go.opentelemetry.io/otel/metric/instrument`.
|
||||||
|
They return an option used during a measurement that defines the attribute Set associated with the measurement. (#3971)
|
||||||
|
- The `Version` function to `go.opentelemetry.io/otel/exporters/otlp/otlpmetric` to return the OTLP metrics client version. (#3956)
|
||||||
|
- The `Version` function to `go.opentelemetry.io/otel/exporters/otlp/otlptrace` to return the OTLP trace client version. (#3956)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- The `Extrema` in `go.opentelemetry.io/otel/sdk/metric/metricdata` is redefined with a generic argument of `[N int64 | float64]`. (#3870)
|
||||||
|
- Update all exported interfaces from `go.opentelemetry.io/otel/metric` to embed their corresponding interface from `go.opentelemetry.io/otel/metric/embedded`.
|
||||||
|
This adds an implementation requirement to set the interface default behavior for unimplemented methods. (#3916)
|
||||||
|
- Move No-Op implementation from `go.opentelemetry.io/otel/metric` into its own package `go.opentelemetry.io/otel/metric/noop`. (#3941)
|
||||||
|
- `metric.NewNoopMeterProvider` is replaced with `noop.NewMeterProvider`
|
||||||
|
- Add all the methods from `"go.opentelemetry.io/otel/trace".SpanContext` to `bridgeSpanContext` by embedding `otel.SpanContext` in `bridgeSpanContext`. (#3966)
|
||||||
|
- Wrap `UploadMetrics` error in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/` to improve error message when encountering generic grpc errors. (#3974)
|
||||||
|
- The measurement methods for all instruments in `go.opentelemetry.io/otel/metric/instrument` accept an option instead of the variadic `"go.opentelemetry.io/otel/attribute".KeyValue`. (#3971)
|
||||||
|
- The `Int64Counter.Add` method now accepts `...AddOption`
|
||||||
|
- The `Float64Counter.Add` method now accepts `...AddOption`
|
||||||
|
- The `Int64UpDownCounter.Add` method now accepts `...AddOption`
|
||||||
|
- The `Float64UpDownCounter.Add` method now accepts `...AddOption`
|
||||||
|
- The `Int64Histogram.Record` method now accepts `...RecordOption`
|
||||||
|
- The `Float64Histogram.Record` method now accepts `...RecordOption`
|
||||||
|
- The `Int64Observer.Observe` method now accepts `...ObserveOption`
|
||||||
|
- The `Float64Observer.Observe` method now accepts `...ObserveOption`
|
||||||
|
- The `Observer` methods in `go.opentelemetry.io/otel/metric` accept an option instead of the variadic `"go.opentelemetry.io/otel/attribute".KeyValue`. (#3971)
|
||||||
|
- The `Observer.ObserveInt64` method now accepts `...ObserveOption`
|
||||||
|
- The `Observer.ObserveFloat64` method now accepts `...ObserveOption`
|
||||||
|
- Move global metric back to `go.opentelemetry.io/otel/metric/global` from `go.opentelemetry.io/otel`. (#3986)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- `TracerProvider` allows calling `Tracer()` while it's shutting down.
|
||||||
|
It used to deadlock. (#3924)
|
||||||
|
- Use the SDK version for the Telemetry SDK resource detector in `go.opentelemetry.io/otel/sdk/resource`. (#3949)
|
||||||
|
- Fix a data race in `SpanProcessor` returned by `NewSimpleSpanProcessor` in `go.opentelemetry.io/otel/sdk/trace`. (#3951)
|
||||||
|
- Automatically figure out the default aggregation with `aggregation.Default`. (#3967)
|
||||||
|
|
||||||
|
### Deprecated
|
||||||
|
|
||||||
|
- The `go.opentelemetry.io/otel/metric/instrument` package is deprecated.
|
||||||
|
Use the equivalent types added to `go.opentelemetry.io/otel/metric` instead. (#4018)
|
||||||
|
|
||||||
|
## [1.15.0-rc.2/0.38.0-rc.2] 2023-03-23
|
||||||
|
|
||||||
|
This is a release candidate for the v1.15.0/v0.38.0 release.
|
||||||
|
That release will 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
|
||||||
|
|
||||||
|
- The `WithHostID` option to `go.opentelemetry.io/otel/sdk/resource`. (#3812)
|
||||||
|
- The `WithoutTimestamps` option to `go.opentelemetry.io/otel/exporters/stdout/stdoutmetric` to sets all timestamps to zero. (#3828)
|
||||||
|
- The new `Exemplar` type is added to `go.opentelemetry.io/otel/sdk/metric/metricdata`.
|
||||||
|
Both the `DataPoint` and `HistogramDataPoint` types from that package have a new field of `Exemplars` containing the sampled exemplars for their timeseries. (#3849)
|
||||||
|
- Configuration for each metric instrument in `go.opentelemetry.io/otel/sdk/metric/instrument`. (#3895)
|
||||||
|
- The internal logging introduces a warning level verbosity equal to `V(1)`. (#3900)
|
||||||
|
- Added a log message warning about usage of `SimpleSpanProcessor` in production environments. (#3854)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Optimize memory allocation when creation a new `Set` using `NewSet` or `NewSetWithFiltered` in `go.opentelemetry.io/otel/attribute`. (#3832)
|
||||||
|
- Optimize memory allocation when creation new metric instruments in `go.opentelemetry.io/otel/sdk/metric`. (#3832)
|
||||||
|
- Avoid creating new objects on all calls to `WithDeferredSetup` and `SkipContextSetup` in OpenTracing bridge. (#3833)
|
||||||
|
- The `New` and `Detect` functions from `go.opentelemetry.io/otel/sdk/resource` return errors that wrap underlying errors instead of just containing the underlying error strings. (#3844)
|
||||||
|
- Both the `Histogram` and `HistogramDataPoint` are redefined with a generic argument of `[N int64 | float64]` in `go.opentelemetry.io/otel/sdk/metric/metricdata`. (#3849)
|
||||||
|
- The metric `Export` interface from `go.opentelemetry.io/otel/sdk/metric` accepts a `*ResourceMetrics` instead of `ResourceMetrics`. (#3853)
|
||||||
|
- Rename `Asynchronous` to `Observable` in `go.opentelemetry.io/otel/metric/instrument`. (#3892)
|
||||||
|
- Rename `Int64ObserverOption` to `Int64ObservableOption` in `go.opentelemetry.io/otel/metric/instrument`. (#3895)
|
||||||
|
- Rename `Float64ObserverOption` to `Float64ObservableOption` in `go.opentelemetry.io/otel/metric/instrument`. (#3895)
|
||||||
|
- The internal logging changes the verbosity level of info to `V(4)`, the verbosity level of debug to `V(8)`. (#3900)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- `TracerProvider` consistently doesn't allow to register a `SpanProcessor` after shutdown. (#3845)
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- The deprecated `go.opentelemetry.io/otel/metric/global` package is removed. (#3829)
|
||||||
|
- The unneeded `Synchronous` interface in `go.opentelemetry.io/otel/metric/instrument` was removed. (#3892)
|
||||||
|
- The `Float64ObserverConfig` and `NewFloat64ObserverConfig` in `go.opentelemetry.io/otel/sdk/metric/instrument`.
|
||||||
|
Use the added `float64` instrument configuration instead. (#3895)
|
||||||
|
- The `Int64ObserverConfig` and `NewInt64ObserverConfig` in `go.opentelemetry.io/otel/sdk/metric/instrument`.
|
||||||
|
Use the added `int64` instrument configuration instead. (#3895)
|
||||||
|
- The `NewNoopMeter` function in `go.opentelemetry.io/otel/metric`, use `NewMeterProvider().Meter("")` instead. (#3893)
|
||||||
|
|
||||||
|
## [1.15.0-rc.1/0.38.0-rc.1] 2023-03-01
|
||||||
|
|
||||||
|
This is a release candidate for the v1.15.0/v0.38.0 release.
|
||||||
|
That release will 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.
|
||||||
|
|
||||||
|
This release drops the compatibility guarantee of [Go 1.18].
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Support global `MeterProvider` in `go.opentelemetry.io/otel`. (#3818)
|
||||||
|
- 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
|
||||||
|
|
||||||
|
- Dropped compatibility testing for [Go 1.18].
|
||||||
|
The project no longer guarantees support for this version of Go. (#3813)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Handle empty environment variable as it they were not set. (#3764)
|
||||||
|
- Clarify the `httpconv` and `netconv` packages in `go.opentelemetry.io/otel/semconv/*` provide tracing semantic conventions. (#3823)
|
||||||
|
- Fix race conditions in `go.opentelemetry.io/otel/exporters/metric/prometheus` that could cause a panic. (#3899)
|
||||||
|
- Fix sending nil `scopeInfo` to metrics channel in `go.opentelemetry.io/otel/exporters/metric/prometheus` that could cause a panic in `github.com/prometheus/client_golang/prometheus`. (#3899)
|
||||||
|
|
||||||
|
### Deprecated
|
||||||
|
|
||||||
|
- The `go.opentelemetry.io/otel/metric/global` package is deprecated.
|
||||||
|
Use `go.opentelemetry.io/otel` instead. (#3818)
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- The deprecated `go.opentelemetry.io/otel/metric/unit` package is removed. (#3814)
|
||||||
|
|
||||||
## [1.14.0/0.37.0/0.0.4] 2023-02-27
|
## [1.14.0/0.37.0/0.0.4] 2023-02-27
|
||||||
|
|
||||||
This release is the last to support [Go 1.18].
|
This release is the last to support [Go 1.18].
|
||||||
@ -121,7 +475,7 @@ The next release will require at least [Go 1.19].
|
|||||||
- The `go.opentelemetry.io/otel/semconv/v1.16.0` package.
|
- The `go.opentelemetry.io/otel/semconv/v1.16.0` package.
|
||||||
The package contains semantic conventions from the `v1.16.0` version of the OpenTelemetry specification. (#3579)
|
The package contains semantic conventions from the `v1.16.0` version of the OpenTelemetry specification. (#3579)
|
||||||
- Metric instruments to `go.opentelemetry.io/otel/metric/instrument`.
|
- Metric instruments to `go.opentelemetry.io/otel/metric/instrument`.
|
||||||
These instruments are use as replacements of the depreacted `go.opentelemetry.io/otel/metric/instrument/{asyncfloat64,asyncint64,syncfloat64,syncint64}` packages.(#3575, #3586)
|
These instruments are use as replacements of the deprecated `go.opentelemetry.io/otel/metric/instrument/{asyncfloat64,asyncint64,syncfloat64,syncint64}` packages.(#3575, #3586)
|
||||||
- `Float64ObservableCounter` replaces the `asyncfloat64.Counter`
|
- `Float64ObservableCounter` replaces the `asyncfloat64.Counter`
|
||||||
- `Float64ObservableUpDownCounter` replaces the `asyncfloat64.UpDownCounter`
|
- `Float64ObservableUpDownCounter` replaces the `asyncfloat64.UpDownCounter`
|
||||||
- `Float64ObservableGauge` replaces the `asyncfloat64.Gauge`
|
- `Float64ObservableGauge` replaces the `asyncfloat64.Gauge`
|
||||||
@ -144,7 +498,7 @@ The next release will require at least [Go 1.19].
|
|||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
- Jaeger and Zipkin exporter use `github.com/go-logr/logr` as the logging interface, and add the `WithLogr` option. (#3497, #3500)
|
- Jaeger and Zipkin exporter use `github.com/go-logr/logr` as the logging interface, and add the `WithLogr` option. (#3497, #3500)
|
||||||
- Instrument configuration in `go.opentelemetry.io/otel/metric/instrument` is split into specific options and confguration based on the instrument type. (#3507)
|
- Instrument configuration in `go.opentelemetry.io/otel/metric/instrument` is split into specific options and configuration based on the instrument type. (#3507)
|
||||||
- Use the added `Int64Option` type to configure instruments from `go.opentelemetry.io/otel/metric/instrument/syncint64`.
|
- Use the added `Int64Option` type to configure instruments from `go.opentelemetry.io/otel/metric/instrument/syncint64`.
|
||||||
- Use the added `Float64Option` type to configure instruments from `go.opentelemetry.io/otel/metric/instrument/syncfloat64`.
|
- Use the added `Float64Option` type to configure instruments from `go.opentelemetry.io/otel/metric/instrument/syncfloat64`.
|
||||||
- Use the added `Int64ObserverOption` type to configure instruments from `go.opentelemetry.io/otel/metric/instrument/asyncint64`.
|
- Use the added `Int64ObserverOption` type to configure instruments from `go.opentelemetry.io/otel/metric/instrument/asyncint64`.
|
||||||
@ -157,7 +511,7 @@ The next release will require at least [Go 1.19].
|
|||||||
- The `Shutdown` method of the `"go.opentelemetry.io/otel/sdk/trace".TracerProvider` releases all computational resources when called the first time. (#3551)
|
- The `Shutdown` method of the `"go.opentelemetry.io/otel/sdk/trace".TracerProvider` releases all computational resources when called the first time. (#3551)
|
||||||
- The `Sampler` returned from `TraceIDRatioBased` `go.opentelemetry.io/otel/sdk/trace` now uses the rightmost bits for sampling decisions.
|
- The `Sampler` returned from `TraceIDRatioBased` `go.opentelemetry.io/otel/sdk/trace` now uses the rightmost bits for sampling decisions.
|
||||||
This fixes random sampling when using ID generators like `xray.IDGenerator` and increasing parity with other language implementations. (#3557)
|
This fixes random sampling when using ID generators like `xray.IDGenerator` and increasing parity with other language implementations. (#3557)
|
||||||
- Errors from `go.opentelemetry.io/otel/exporters/otlp/otlptrace` exporters are wrapped in erros identifying their signal name.
|
- Errors from `go.opentelemetry.io/otel/exporters/otlp/otlptrace` exporters are wrapped in errors identifying their signal name.
|
||||||
Existing users of the exporters attempting to identify specific errors will need to use `errors.Unwrap()` to get the underlying error. (#3516)
|
Existing users of the exporters attempting to identify specific errors will need to use `errors.Unwrap()` to get the underlying error. (#3516)
|
||||||
- Exporters from `go.opentelemetry.io/otel/exporters/otlp` will print the final retryable error message when attempts to retry time out. (#3514)
|
- Exporters from `go.opentelemetry.io/otel/exporters/otlp` will print the final retryable error message when attempts to retry time out. (#3514)
|
||||||
- The instrument kind names in `go.opentelemetry.io/otel/sdk/metric` are updated to match the API. (#3562)
|
- The instrument kind names in `go.opentelemetry.io/otel/sdk/metric` are updated to match the API. (#3562)
|
||||||
@ -266,7 +620,7 @@ The next release will require at least [Go 1.19].
|
|||||||
- Asynchronous counters (`Counter` and `UpDownCounter`) from the metric SDK now produce delta sums when configured with delta temporality. (#3398)
|
- Asynchronous counters (`Counter` and `UpDownCounter`) from the metric SDK now produce delta sums when configured with delta temporality. (#3398)
|
||||||
- Exported `Status` codes in the `go.opentelemetry.io/otel/exporters/zipkin` exporter are now exported as all upper case values. (#3340)
|
- Exported `Status` codes in the `go.opentelemetry.io/otel/exporters/zipkin` exporter are now exported as all upper case values. (#3340)
|
||||||
- `Aggregation`s from `go.opentelemetry.io/otel/sdk/metric` with no data are not exported. (#3394, #3436)
|
- `Aggregation`s from `go.opentelemetry.io/otel/sdk/metric` with no data are not exported. (#3394, #3436)
|
||||||
- Reenabled Attribute Filters in the Metric SDK. (#3396)
|
- Re-enabled Attribute Filters in the Metric SDK. (#3396)
|
||||||
- Asynchronous callbacks are only called if they are registered with at least one instrument that does not use drop aggragation. (#3408)
|
- Asynchronous callbacks are only called if they are registered with at least one instrument that does not use drop aggragation. (#3408)
|
||||||
- Do not report empty partial-success responses in the `go.opentelemetry.io/otel/exporters/otlp` exporters. (#3438, #3432)
|
- Do not report empty partial-success responses in the `go.opentelemetry.io/otel/exporters/otlp` exporters. (#3438, #3432)
|
||||||
- Handle partial success responses in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric` exporters. (#3162, #3440)
|
- Handle partial success responses in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric` exporters. (#3162, #3440)
|
||||||
@ -847,7 +1201,7 @@ This release includes an API and SDK for the tracing signal that will comply wit
|
|||||||
- Setting the global `ErrorHandler` with `"go.opentelemetry.io/otel".SetErrorHandler` multiple times is now supported. (#2160, #2140)
|
- Setting the global `ErrorHandler` with `"go.opentelemetry.io/otel".SetErrorHandler` multiple times is now supported. (#2160, #2140)
|
||||||
- The `"go.opentelemetry.io/otel/attribute".Any` function now supports `int32` values. (#2169)
|
- The `"go.opentelemetry.io/otel/attribute".Any` function now supports `int32` values. (#2169)
|
||||||
- Multiple calls to `"go.opentelemetry.io/otel/sdk/metric/controller/basic".WithResource()` are handled correctly, and when no resources are provided `"go.opentelemetry.io/otel/sdk/resource".Default()` is used. (#2120)
|
- Multiple calls to `"go.opentelemetry.io/otel/sdk/metric/controller/basic".WithResource()` are handled correctly, and when no resources are provided `"go.opentelemetry.io/otel/sdk/resource".Default()` is used. (#2120)
|
||||||
- The `WithoutTimestamps` option for the `go.opentelemetry.io/otel/exporters/stdout/stdouttrace` exporter causes the exporter to correctly ommit timestamps. (#2195)
|
- The `WithoutTimestamps` option for the `go.opentelemetry.io/otel/exporters/stdout/stdouttrace` exporter causes the exporter to correctly omit timestamps. (#2195)
|
||||||
- Fixed typos in resources.go. (#2201)
|
- Fixed typos in resources.go. (#2201)
|
||||||
|
|
||||||
## [1.0.0-RC2] - 2021-07-26
|
## [1.0.0-RC2] - 2021-07-26
|
||||||
@ -1293,7 +1647,7 @@ with major version 0.
|
|||||||
- `NewGRPCDriver` function returns a `ProtocolDriver` that maintains a single gRPC connection to the collector. (#1369)
|
- `NewGRPCDriver` function returns a `ProtocolDriver` that maintains a single gRPC connection to the collector. (#1369)
|
||||||
- Added documentation about the project's versioning policy. (#1388)
|
- Added documentation about the project's versioning policy. (#1388)
|
||||||
- Added `NewSplitDriver` for OTLP exporter that allows sending traces and metrics to different endpoints. (#1418)
|
- Added `NewSplitDriver` for OTLP exporter that allows sending traces and metrics to different endpoints. (#1418)
|
||||||
- Added codeql worfklow to GitHub Actions (#1428)
|
- Added codeql workflow to GitHub Actions (#1428)
|
||||||
- Added Gosec workflow to GitHub Actions (#1429)
|
- Added Gosec workflow to GitHub Actions (#1429)
|
||||||
- Add new HTTP driver for OTLP exporter in `exporters/otlp/otlphttp`. Currently it only supports the binary protobuf payloads. (#1420)
|
- Add new HTTP driver for OTLP exporter in `exporters/otlp/otlphttp`. Currently it only supports the binary protobuf payloads. (#1420)
|
||||||
- Add an OpenCensus exporter bridge. (#1444)
|
- Add an OpenCensus exporter bridge. (#1444)
|
||||||
@ -2136,7 +2490,7 @@ There is still a possibility of breaking changes.
|
|||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
- Use stateful batcher on Prometheus exporter fixing regresion introduced in #395. (#428)
|
- Use stateful batcher on Prometheus exporter fixing regression introduced in #395. (#428)
|
||||||
|
|
||||||
## [0.2.1] - 2020-01-08
|
## [0.2.1] - 2020-01-08
|
||||||
|
|
||||||
@ -2302,7 +2656,17 @@ 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.14.0...HEAD
|
[Unreleased]: https://github.com/open-telemetry/opentelemetry-go/compare/v1.19.0...HEAD
|
||||||
|
[1.19.0/0.42.0/0.0.7]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.19.0
|
||||||
|
[1.19.0-rc.1/0.42.0-rc.1]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.19.0-rc.1
|
||||||
|
[1.18.0/0.41.0/0.0.6]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.18.0
|
||||||
|
[1.17.0/0.40.0/0.0.5]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.17.0
|
||||||
|
[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.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.1/0.38.0-rc.1]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.15.0-rc.1
|
||||||
[1.14.0/0.37.0/0.0.4]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.14.0
|
[1.14.0/0.37.0/0.0.4]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.14.0
|
||||||
[1.13.0/0.36.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.13.0
|
[1.13.0/0.36.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.13.0
|
||||||
[1.12.0/0.35.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.12.0
|
[1.12.0/0.35.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.12.0
|
||||||
@ -2367,3 +2731,7 @@ 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
|
||||||
|
[Go 1.19]: https://go.dev/doc/go1.19
|
||||||
|
|
||||||
|
[metric API]:https://pkg.go.dev/go.opentelemetry.io/otel/metric
|
||||||
|
[metric SDK]:https://pkg.go.dev/go.opentelemetry.io/otel/sdk/metric
|
||||||
|
4
src/vendor/go.opentelemetry.io/otel/CODEOWNERS
generated
vendored
4
src/vendor/go.opentelemetry.io/otel/CODEOWNERS
generated
vendored
@ -12,6 +12,6 @@
|
|||||||
# https://help.github.com/en/articles/about-code-owners
|
# https://help.github.com/en/articles/about-code-owners
|
||||||
#
|
#
|
||||||
|
|
||||||
* @jmacd @MrAlias @Aneurysm9 @evantorrie @XSAM @dashpole @MadVikingGod @pellared @hanyuancheung @dmathieu
|
* @MrAlias @Aneurysm9 @evantorrie @XSAM @dashpole @MadVikingGod @pellared @hanyuancheung @dmathieu
|
||||||
|
|
||||||
CODEOWNERS @MrAlias @Aneurysm9 @MadVikingGod
|
CODEOWNERS @MrAlias @MadVikingGod @pellared
|
192
src/vendor/go.opentelemetry.io/otel/CONTRIBUTING.md
generated
vendored
192
src/vendor/go.opentelemetry.io/otel/CONTRIBUTING.md
generated
vendored
@ -6,7 +6,7 @@ OpenTelemetry
|
|||||||
repo for information on this and other language SIGs.
|
repo for information on this and other language SIGs.
|
||||||
|
|
||||||
See the [public meeting
|
See the [public meeting
|
||||||
notes](https://docs.google.com/document/d/1A63zSWX0x2CyCK_LoNhmQC4rqhLpYXJzXbEPDUQ2n6w/edit#heading=h.9tngw7jdwd6b)
|
notes](https://docs.google.com/document/d/1E5e7Ld0NuU1iVvf-42tOBpu2VBBLYnh73GJuITGJTTU/edit)
|
||||||
for a summary description of past meetings. To request edit access,
|
for a summary description of past meetings. To request edit access,
|
||||||
join the meeting or get in touch on
|
join the meeting or get in touch on
|
||||||
[Slack](https://cloud-native.slack.com/archives/C01NPAXACKT).
|
[Slack](https://cloud-native.slack.com/archives/C01NPAXACKT).
|
||||||
@ -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.
|
||||||
@ -94,38 +99,66 @@ request ID to the entry you added to `CHANGELOG.md`.
|
|||||||
|
|
||||||
### How to Get PRs Merged
|
### How to Get PRs Merged
|
||||||
|
|
||||||
A PR is considered to be **ready to merge** when:
|
A PR is considered **ready to merge** when:
|
||||||
|
|
||||||
* It has received two approvals from Collaborators/Maintainers (at
|
* It has received two qualified approvals[^1].
|
||||||
different companies). This is not enforced through technical means
|
|
||||||
and a PR may be **ready to merge** with a single approval if the change
|
|
||||||
and its approach have been discussed and consensus reached.
|
|
||||||
* Feedback has been addressed.
|
|
||||||
* Any substantive changes to your PR will require that you clear any prior
|
|
||||||
Approval reviews, this includes changes resulting from other feedback. Unless
|
|
||||||
the approver explicitly stated that their approval will persist across
|
|
||||||
changes it should be assumed that the PR needs their review again. Other
|
|
||||||
project members (e.g. approvers, maintainers) can help with this if there are
|
|
||||||
any questions or if you forget to clear reviews.
|
|
||||||
* It has been open for review for at least one working day. This gives
|
|
||||||
people reasonable time to review.
|
|
||||||
* Trivial changes (typo, cosmetic, doc, etc.) do not have to wait for
|
|
||||||
one day and may be merged with a single Maintainer's approval.
|
|
||||||
* `CHANGELOG.md` has been updated to reflect what has been
|
|
||||||
added, changed, removed, or fixed.
|
|
||||||
* `README.md` has been updated if necessary.
|
|
||||||
* Urgent fix can take exception as long as it has been actively
|
|
||||||
communicated.
|
|
||||||
|
|
||||||
Any Maintainer can merge the PR once it is **ready to merge**.
|
This is not enforced through automation, but needs to be validated by the
|
||||||
|
maintainer merging.
|
||||||
|
* The qualified approvals need to be from [Approver]s/[Maintainer]s
|
||||||
|
affiliated with different companies. Two qualified approvals from
|
||||||
|
[Approver]s or [Maintainer]s affiliated with the same company counts as a
|
||||||
|
single qualified approval.
|
||||||
|
* PRs introducing changes that have already been discussed and consensus
|
||||||
|
reached only need one qualified approval. The discussion and resolution
|
||||||
|
needs to be linked to the PR.
|
||||||
|
* Trivial changes[^2] only need one qualified approval.
|
||||||
|
|
||||||
|
* All feedback has been addressed.
|
||||||
|
* All PR comments and suggestions are resolved.
|
||||||
|
* All GitHub Pull Request reviews with a status of "Request changes" have
|
||||||
|
been addressed. Another review by the objecting reviewer with a different
|
||||||
|
status can be submitted to clear the original review, or the review can be
|
||||||
|
dismissed by a [Maintainer] when the issues from the original review have
|
||||||
|
been addressed.
|
||||||
|
* Any comments or reviews that cannot be resolved between the PR author and
|
||||||
|
reviewers can be submitted to the community [Approver]s and [Maintainer]s
|
||||||
|
during the weekly SIG meeting. If consensus is reached among the
|
||||||
|
[Approver]s and [Maintainer]s during the SIG meeting the objections to the
|
||||||
|
PR may be dismissed or resolved or the PR closed by a [Maintainer].
|
||||||
|
* Any substantive changes to the PR require existing Approval reviews be
|
||||||
|
cleared unless the approver explicitly states that their approval persists
|
||||||
|
across changes. This includes changes resulting from other feedback.
|
||||||
|
[Approver]s and [Maintainer]s can help in clearing reviews and they should
|
||||||
|
be consulted if there are any questions.
|
||||||
|
|
||||||
|
* The PR branch is up to date with the base branch it is merging into.
|
||||||
|
* To ensure this does not block the PR, it should be configured to allow
|
||||||
|
maintainers to update it.
|
||||||
|
|
||||||
|
* It has been open for review for at least one working day. This gives people
|
||||||
|
reasonable time to review.
|
||||||
|
* Trivial changes[^2] do not have to wait for one day and may be merged with
|
||||||
|
a single [Maintainer]'s approval.
|
||||||
|
|
||||||
|
* All required GitHub workflows have succeeded.
|
||||||
|
* Urgent fix can take exception as long as it has been actively communicated
|
||||||
|
among [Maintainer]s.
|
||||||
|
|
||||||
|
Any [Maintainer] can merge the PR once the above criteria have been met.
|
||||||
|
|
||||||
|
[^1]: A qualified approval is a GitHub Pull Request review with "Approve"
|
||||||
|
status from an OpenTelemetry Go [Approver] or [Maintainer].
|
||||||
|
[^2]: Trivial changes include: typo corrections, cosmetic non-substantive
|
||||||
|
changes, documentation corrections or updates, dependency updates, etc.
|
||||||
|
|
||||||
## 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
|
||||||
|
|
||||||
@ -146,23 +179,23 @@ For a deeper discussion, see
|
|||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
Each non-example Go Module should have its own `README.md` containing:
|
Each (non-internal, non-test) package must be documented using
|
||||||
|
[Go Doc Comments](https://go.dev/doc/comment),
|
||||||
|
preferably in a `doc.go` file.
|
||||||
|
|
||||||
- A pkg.go.dev badge which can be generated [here](https://pkg.go.dev/badge/).
|
Prefer using [Examples](https://pkg.go.dev/testing#hdr-Examples)
|
||||||
- Brief description.
|
instead of putting code snippets in Go doc comments.
|
||||||
- Installation instructions (and requirements if applicable).
|
In some cases, you can even create [Testable Examples](https://go.dev/blog/examples).
|
||||||
- Hyperlink to an example. Depending on the component the example can be:
|
|
||||||
- An `example_test.go` like [here](exporters/stdout/stdouttrace/example_test.go).
|
|
||||||
- A sample Go application with its own `README.md`, like [here](example/zipkin).
|
|
||||||
- Additional documentation sections such us:
|
|
||||||
- Configuration,
|
|
||||||
- Contributing,
|
|
||||||
- References.
|
|
||||||
|
|
||||||
[Here](exporters/jaeger/README.md) is an example of a concise `README.md`.
|
You can install and run a "local Go Doc site" in the following way:
|
||||||
|
|
||||||
Moreover, it should be possible to navigate to any `README.md` from the
|
```sh
|
||||||
root `README.md`.
|
go install golang.org/x/pkgsite/cmd/pkgsite@latest
|
||||||
|
pkgsite
|
||||||
|
```
|
||||||
|
|
||||||
|
[`go.opentelemetry.io/otel/metric`](https://pkg.go.dev/go.opentelemetry.io/otel/metric)
|
||||||
|
is an example of a very well-documented package.
|
||||||
|
|
||||||
## Style Guide
|
## Style Guide
|
||||||
|
|
||||||
@ -216,7 +249,7 @@ Meaning a `config` from one package should not be directly used by another. The
|
|||||||
one exception is the API packages. The configs from the base API, eg.
|
one exception is the API packages. The configs from the base API, eg.
|
||||||
`go.opentelemetry.io/otel/trace.TracerConfig` and
|
`go.opentelemetry.io/otel/trace.TracerConfig` and
|
||||||
`go.opentelemetry.io/otel/metric.InstrumentConfig`, are intended to be consumed
|
`go.opentelemetry.io/otel/metric.InstrumentConfig`, are intended to be consumed
|
||||||
by the SDK therefor it is expected that these are exported.
|
by the SDK therefore it is expected that these are exported.
|
||||||
|
|
||||||
When a config is exported we want to maintain forward and backward
|
When a config is exported we want to maintain forward and backward
|
||||||
compatibility, to achieve this no fields should be exported but should
|
compatibility, to achieve this no fields should be exported but should
|
||||||
@ -234,12 +267,12 @@ func newConfig(options ...Option) config {
|
|||||||
for _, option := range options {
|
for _, option := range options {
|
||||||
config = option.apply(config)
|
config = option.apply(config)
|
||||||
}
|
}
|
||||||
// Preform any validation here.
|
// Perform any validation here.
|
||||||
return config
|
return config
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
If validation of the `config` options is also preformed this can return an
|
If validation of the `config` options is also performed this can return an
|
||||||
error as well that is expected to be handled by the instantiation function
|
error as well that is expected to be handled by the instantiation function
|
||||||
or propagated to the user.
|
or propagated to the user.
|
||||||
|
|
||||||
@ -438,12 +471,37 @@ their parameters appropriately named.
|
|||||||
#### Interface Stability
|
#### Interface Stability
|
||||||
|
|
||||||
All exported stable interfaces that include the following warning in their
|
All exported stable interfaces that include the following warning in their
|
||||||
doumentation are allowed to be extended with additional methods.
|
documentation are allowed to be extended with additional methods.
|
||||||
|
|
||||||
> Warning: methods may be added to this interface in minor releases.
|
> Warning: methods may be added to this interface in minor releases.
|
||||||
|
|
||||||
|
These interfaces are defined by the OpenTelemetry specification and will be
|
||||||
|
updated as the specification evolves.
|
||||||
|
|
||||||
Otherwise, stable interfaces MUST NOT be modified.
|
Otherwise, stable interfaces MUST NOT be modified.
|
||||||
|
|
||||||
|
#### How to Change Specification Interfaces
|
||||||
|
|
||||||
|
When an API change must be made, we will update the SDK with the new method one
|
||||||
|
release before the API change. This will allow the SDK one version before the
|
||||||
|
API change to work seamlessly with the new API.
|
||||||
|
|
||||||
|
If an incompatible version of the SDK is used with the new API the application
|
||||||
|
will fail to compile.
|
||||||
|
|
||||||
|
#### How Not to Change Specification Interfaces
|
||||||
|
|
||||||
|
We have explored using a v2 of the API to change interfaces and found that there
|
||||||
|
was no way to introduce a v2 and have it work seamlessly with the v1 of the API.
|
||||||
|
Problems happened with libraries that upgraded to v2 when an application did not,
|
||||||
|
and would not produce any telemetry.
|
||||||
|
|
||||||
|
More detail of the approaches considered and their limitations can be found in
|
||||||
|
the [Use a V2 API to evolve interfaces](https://github.com/open-telemetry/opentelemetry-go/issues/3920)
|
||||||
|
issue.
|
||||||
|
|
||||||
|
#### How to Change Other Interfaces
|
||||||
|
|
||||||
If new functionality is needed for an interface that cannot be changed it MUST
|
If new functionality is needed for an interface that cannot be changed it MUST
|
||||||
be added by including an additional interface. That added interface can be a
|
be added by including an additional interface. That added interface can be a
|
||||||
simple interface for the specific functionality that you want to add or it can
|
simple interface for the specific functionality that you want to add or it can
|
||||||
@ -498,29 +556,65 @@ functionality should be added, each one will need their own super-set
|
|||||||
interfaces and will duplicate the pattern. For this reason, the simple targeted
|
interfaces and will duplicate the pattern. For this reason, the simple targeted
|
||||||
interface that defines the specific functionality should be preferred.
|
interface that defines the specific functionality should be preferred.
|
||||||
|
|
||||||
|
### Testing
|
||||||
|
|
||||||
|
The tests should never leak goroutines.
|
||||||
|
|
||||||
|
Use the term `ConcurrentSafe` in the test name when it aims to verify the
|
||||||
|
absence of race conditions.
|
||||||
|
|
||||||
|
### Internal packages
|
||||||
|
|
||||||
|
The use of internal packages should be scoped to a single module. A sub-module
|
||||||
|
should never import from a parent internal package. This creates a coupling
|
||||||
|
between the two modules where a user can upgrade the parent without the child
|
||||||
|
and if the internal package API has changed it will fail to upgrade[^3].
|
||||||
|
|
||||||
|
There are two known exceptions to this rule:
|
||||||
|
|
||||||
|
- `go.opentelemetry.io/otel/internal/global`
|
||||||
|
- This package manages global state for all of opentelemetry-go. It needs to
|
||||||
|
be a single package in order to ensure the uniqueness of the global state.
|
||||||
|
- `go.opentelemetry.io/otel/internal/baggage`
|
||||||
|
- This package provides values in a `context.Context` that need to be
|
||||||
|
recognized by `go.opentelemetry.io/otel/baggage` and
|
||||||
|
`go.opentelemetry.io/otel/bridge/opentracing` but remain private.
|
||||||
|
|
||||||
|
If you have duplicate code in multiple modules, make that code into a Go
|
||||||
|
template stored in `go.opentelemetry.io/otel/internal/shared` and use [gotmpl]
|
||||||
|
to render the templates in the desired locations. See [#4404] for an example of
|
||||||
|
this.
|
||||||
|
|
||||||
|
[^3]: https://github.com/open-telemetry/opentelemetry-go/issues/3548
|
||||||
|
|
||||||
## Approvers and Maintainers
|
## Approvers and Maintainers
|
||||||
|
|
||||||
Approvers:
|
### Approvers
|
||||||
|
|
||||||
- [Evan Torrie](https://github.com/evantorrie), Verizon Media
|
- [Evan Torrie](https://github.com/evantorrie), Verizon Media
|
||||||
- [Josh MacDonald](https://github.com/jmacd), LightStep
|
|
||||||
- [Sam Xie](https://github.com/XSAM), Cisco/AppDynamics
|
- [Sam Xie](https://github.com/XSAM), Cisco/AppDynamics
|
||||||
- [David Ashpole](https://github.com/dashpole), Google
|
- [David Ashpole](https://github.com/dashpole), Google
|
||||||
- [Robert Pająk](https://github.com/pellared), Splunk
|
|
||||||
- [Chester Cheung](https://github.com/hanyuancheung), Tencent
|
- [Chester Cheung](https://github.com/hanyuancheung), Tencent
|
||||||
- [Damien Mathieu](https://github.com/dmathieu), Elastic
|
- [Damien Mathieu](https://github.com/dmathieu), Elastic
|
||||||
|
- [Anthony Mirabella](https://github.com/Aneurysm9), AWS
|
||||||
|
|
||||||
Maintainers:
|
### Maintainers
|
||||||
|
|
||||||
- [Aaron Clawson](https://github.com/MadVikingGod), LightStep
|
- [Aaron Clawson](https://github.com/MadVikingGod), LightStep
|
||||||
- [Anthony Mirabella](https://github.com/Aneurysm9), AWS
|
- [Robert Pająk](https://github.com/pellared), Splunk
|
||||||
- [Tyler Yahn](https://github.com/MrAlias), Splunk
|
- [Tyler Yahn](https://github.com/MrAlias), Splunk
|
||||||
|
|
||||||
Emeritus:
|
### Emeritus
|
||||||
|
|
||||||
- [Gustavo Silva Paiva](https://github.com/paivagustavo), LightStep
|
- [Gustavo Silva Paiva](https://github.com/paivagustavo), LightStep
|
||||||
|
- [Josh MacDonald](https://github.com/jmacd), LightStep
|
||||||
|
|
||||||
### Become an Approver or a Maintainer
|
### Become an Approver or a Maintainer
|
||||||
|
|
||||||
See the [community membership document in OpenTelemetry community
|
See the [community membership document in OpenTelemetry community
|
||||||
repo](https://github.com/open-telemetry/community/blob/main/community-membership.md).
|
repo](https://github.com/open-telemetry/community/blob/main/community-membership.md).
|
||||||
|
|
||||||
|
[Approver]: #approvers
|
||||||
|
[Maintainer]: #maintainers
|
||||||
|
[gotmpl]: https://pkg.go.dev/go.opentelemetry.io/build-tools/gotmpl
|
||||||
|
[#4404]: https://github.com/open-telemetry/opentelemetry-go/pull/4404
|
||||||
|
114
src/vendor/go.opentelemetry.io/otel/Makefile
generated
vendored
114
src/vendor/go.opentelemetry.io/otel/Makefile
generated
vendored
@ -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 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
|
||||||
|
|
||||||
@ -71,21 +71,75 @@ $(TOOLS)/porto: PACKAGE=github.com/jcchavezs/porto/cmd/porto
|
|||||||
GOJQ = $(TOOLS)/gojq
|
GOJQ = $(TOOLS)/gojq
|
||||||
$(TOOLS)/gojq: PACKAGE=github.com/itchyny/gojq/cmd/gojq
|
$(TOOLS)/gojq: PACKAGE=github.com/itchyny/gojq/cmd/gojq
|
||||||
|
|
||||||
|
GOTMPL = $(TOOLS)/gotmpl
|
||||||
|
$(GOTMPL): PACKAGE=go.opentelemetry.io/build-tools/gotmpl
|
||||||
|
|
||||||
|
GORELEASE = $(TOOLS)/gorelease
|
||||||
|
$(GORELEASE): PACKAGE=golang.org/x/exp/cmd/gorelease
|
||||||
|
|
||||||
.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) $(GOTMPL) $(GORELEASE)
|
||||||
|
|
||||||
|
# Virtualized python tools via docker
|
||||||
|
|
||||||
|
# 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: go-generate vanity-import-fix
|
||||||
|
|
||||||
|
.PHONY: go-generate
|
||||||
|
go-generate: $(OTEL_GO_MOD_DIRS:%=go-generate/%)
|
||||||
|
go-generate/%: DIR=$*
|
||||||
|
go-generate/%: | $(STRINGER) $(GOTMPL)
|
||||||
|
@echo "$(GO) generate $(DIR)/..." \
|
||||||
|
&& cd $(DIR) \
|
||||||
|
&& PATH="$(TOOLS):$${PATH}" $(GO) generate ./...
|
||||||
|
|
||||||
|
.PHONY: vanity-import-fix
|
||||||
|
vanity-import-fix: | $(PORTO)
|
||||||
|
@$(PORTO) --include-internal -w .
|
||||||
|
|
||||||
|
# Generate go.work file for local development.
|
||||||
|
.PHONY: go-work
|
||||||
|
go-work: | $(CROSSLINK)
|
||||||
|
$(CROSSLINK) work --root=$(shell pwd)
|
||||||
|
|
||||||
# Build
|
# Build
|
||||||
|
|
||||||
.PHONY: generate build
|
.PHONY: build
|
||||||
|
|
||||||
generate: $(OTEL_GO_MOD_DIRS:%=generate/%)
|
build: $(OTEL_GO_MOD_DIRS:%=build/%) $(OTEL_GO_MOD_DIRS:%=build-tests/%)
|
||||||
generate/%: DIR=$*
|
|
||||||
generate/%: | $(STRINGER) $(PORTO)
|
|
||||||
@echo "$(GO) generate $(DIR)/..." \
|
|
||||||
&& cd $(DIR) \
|
|
||||||
&& PATH="$(TOOLS):$${PATH}" $(GO) generate ./... && $(PORTO) -w .
|
|
||||||
|
|
||||||
build: generate $(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)/..." \
|
||||||
@ -156,7 +210,7 @@ go-mod-tidy/%: DIR=$*
|
|||||||
go-mod-tidy/%: | crosslink
|
go-mod-tidy/%: | crosslink
|
||||||
@echo "$(GO) mod tidy in $(DIR)" \
|
@echo "$(GO) mod tidy in $(DIR)" \
|
||||||
&& cd $(DIR) \
|
&& cd $(DIR) \
|
||||||
&& $(GO) mod tidy -compat=1.18
|
&& $(GO) mod tidy -compat=1.20
|
||||||
|
|
||||||
.PHONY: lint-modules
|
.PHONY: lint-modules
|
||||||
lint-modules: go-mod-tidy
|
lint-modules: go-mod-tidy
|
||||||
@ -166,20 +220,20 @@ lint: misspell lint-modules golangci-lint
|
|||||||
|
|
||||||
.PHONY: vanity-import-check
|
.PHONY: vanity-import-check
|
||||||
vanity-import-check: | $(PORTO)
|
vanity-import-check: | $(PORTO)
|
||||||
@$(PORTO) --include-internal -l . || echo "(run: make vanity-import-fix)"
|
@$(PORTO) --include-internal -l . || ( echo "(run: make vanity-import-fix)"; exit 1 )
|
||||||
|
|
||||||
.PHONY: vanity-import-fix
|
|
||||||
vanity-import-fix: | $(PORTO)
|
|
||||||
@$(PORTO) --include-internal -w .
|
|
||||||
|
|
||||||
.PHONY: misspell
|
.PHONY: misspell
|
||||||
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 \
|
||||||
awk '/Copyright The OpenTelemetry Authors|generated|GENERATED/ && NR<=3 { found=1; next } END { if (!found) print FILENAME }' $$f; \
|
awk '/Copyright The OpenTelemetry Authors|generated|GENERATED/ && NR<=4 { found=1; next } END { if (!found) print FILENAME }' $$f; \
|
||||||
done); \
|
done); \
|
||||||
if [ -n "$${licRes}" ]; then \
|
if [ -n "$${licRes}" ]; then \
|
||||||
echo "license header checking failed:"; echo "$${licRes}"; \
|
echo "license header checking failed:"; echo "$${licRes}"; \
|
||||||
@ -189,7 +243,7 @@ license-check:
|
|||||||
DEPENDABOT_CONFIG = .github/dependabot.yml
|
DEPENDABOT_CONFIG = .github/dependabot.yml
|
||||||
.PHONY: dependabot-check
|
.PHONY: dependabot-check
|
||||||
dependabot-check: | $(DBOTCONF)
|
dependabot-check: | $(DBOTCONF)
|
||||||
@$(DBOTCONF) verify $(DEPENDABOT_CONFIG) || echo "(run: make dependabot-generate)"
|
@$(DBOTCONF) verify $(DEPENDABOT_CONFIG) || ( echo "(run: make dependabot-generate)"; exit 1 )
|
||||||
|
|
||||||
.PHONY: dependabot-generate
|
.PHONY: dependabot-generate
|
||||||
dependabot-generate: | $(DBOTCONF)
|
dependabot-generate: | $(DBOTCONF)
|
||||||
@ -208,13 +262,23 @@ check-clean-work-tree:
|
|||||||
SEMCONVPKG ?= "semconv/"
|
SEMCONVPKG ?= "semconv/"
|
||||||
.PHONY: semconv-generate
|
.PHONY: semconv-generate
|
||||||
semconv-generate: | $(SEMCONVGEN) $(SEMCONVKIT)
|
semconv-generate: | $(SEMCONVGEN) $(SEMCONVKIT)
|
||||||
[ "$(TAG)" ] || ( echo "TAG unset: missing opentelemetry specification tag"; exit 1 )
|
[ "$(TAG)" ] || ( echo "TAG unset: missing opentelemetry semantic-conventions tag"; exit 1 )
|
||||||
[ "$(OTEL_SPEC_REPO)" ] || ( echo "OTEL_SPEC_REPO unset: missing path to opentelemetry specification repo"; exit 1 )
|
[ "$(OTEL_SEMCONV_REPO)" ] || ( echo "OTEL_SEMCONV_REPO unset: missing path to opentelemetry semantic-conventions 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_SEMCONV_REPO)/model/." --only=span -p conventionType=trace -f trace.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_SEMCONV_REPO)/model/." --only=attribute_group -p conventionType=trace -f attribute_group.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_SEMCONV_REPO)/model/." --only=event -p conventionType=event -f event.go -t "$(SEMCONVPKG)/template.j2" -s "$(TAG)"
|
||||||
|
$(SEMCONVGEN) -i "$(OTEL_SEMCONV_REPO)/model/." --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)"
|
||||||
|
|
||||||
|
.PHONY: gorelease
|
||||||
|
gorelease: $(OTEL_GO_MOD_DIRS:%=gorelease/%)
|
||||||
|
gorelease/%: DIR=$*
|
||||||
|
gorelease/%:| $(GORELEASE)
|
||||||
|
@echo "gorelease in $(DIR):" \
|
||||||
|
&& cd $(DIR) \
|
||||||
|
&& $(GORELEASE) \
|
||||||
|
|| echo ""
|
||||||
|
|
||||||
.PHONY: prerelease
|
.PHONY: prerelease
|
||||||
prerelease: | $(MULTIMOD)
|
prerelease: | $(MULTIMOD)
|
||||||
@[ "${MODSET}" ] || ( echo ">> env var MODSET is not set"; exit 1 )
|
@[ "${MODSET}" ] || ( echo ">> env var MODSET is not set"; exit 1 )
|
||||||
|
47
src/vendor/go.opentelemetry.io/otel/README.md
generated
vendored
47
src/vendor/go.opentelemetry.io/otel/README.md
generated
vendored
@ -11,22 +11,25 @@ It provides a set of APIs to directly measure performance and behavior of your s
|
|||||||
|
|
||||||
## Project Status
|
## Project Status
|
||||||
|
|
||||||
| Signal | Status | Project |
|
| Signal | Status | Project |
|
||||||
| ------- | ---------- | ------- |
|
|---------|------------|-----------------------|
|
||||||
| Traces | Stable | N/A |
|
| Traces | Stable | N/A |
|
||||||
| Metrics | Alpha | N/A |
|
| Metrics | Mixed [1] | [Go: Metric SDK (GA)] |
|
||||||
| Logs | Frozen [1] | N/A |
|
| Logs | Frozen [2] | N/A |
|
||||||
|
|
||||||
- [1]: The Logs signal development is halted for this project while we develop both Traces and Metrics.
|
[Go: Metric SDK (GA)]: https://github.com/orgs/open-telemetry/projects/34
|
||||||
|
|
||||||
|
- [1]: [Metrics API](https://pkg.go.dev/go.opentelemetry.io/otel/metric) is Stable. [Metrics SDK](https://pkg.go.dev/go.opentelemetry.io/otel/sdk/metric) is Beta.
|
||||||
|
- [2]: The Logs signal development is halted for this project while we stabilize the Metrics SDK.
|
||||||
No Logs Pull Requests are currently being accepted.
|
No Logs Pull Requests are currently being accepted.
|
||||||
|
|
||||||
Progress and status specific to this repository is tracked in our local
|
Progress and status specific to this repository is tracked in our
|
||||||
[project boards](https://github.com/open-telemetry/opentelemetry-go/projects)
|
[project boards](https://github.com/open-telemetry/opentelemetry-go/projects)
|
||||||
and
|
and
|
||||||
[milestones](https://github.com/open-telemetry/opentelemetry-go/milestones).
|
[milestones](https://github.com/open-telemetry/opentelemetry-go/milestones).
|
||||||
|
|
||||||
Project versioning information and stability guarantees can be found in the
|
Project versioning information and stability guarantees can be found in the
|
||||||
[versioning documentation](./VERSIONING.md).
|
[versioning documentation](VERSIONING.md).
|
||||||
|
|
||||||
### Compatibility
|
### Compatibility
|
||||||
|
|
||||||
@ -49,22 +52,17 @@ stop ensuring compatibility with these versions in the following manner:
|
|||||||
Currently, this project supports the following environments.
|
Currently, this project supports the following environments.
|
||||||
|
|
||||||
| OS | Go Version | Architecture |
|
| OS | Go Version | Architecture |
|
||||||
| ------- | ---------- | ------------ |
|
|---------|------------|--------------|
|
||||||
|
| Ubuntu | 1.21 | amd64 |
|
||||||
| Ubuntu | 1.20 | amd64 |
|
| Ubuntu | 1.20 | amd64 |
|
||||||
| Ubuntu | 1.19 | amd64 |
|
| Ubuntu | 1.21 | 386 |
|
||||||
| Ubuntu | 1.18 | amd64 |
|
|
||||||
| Ubuntu | 1.20 | 386 |
|
| Ubuntu | 1.20 | 386 |
|
||||||
| Ubuntu | 1.19 | 386 |
|
| MacOS | 1.21 | amd64 |
|
||||||
| Ubuntu | 1.18 | 386 |
|
|
||||||
| MacOS | 1.20 | amd64 |
|
| MacOS | 1.20 | amd64 |
|
||||||
| MacOS | 1.19 | amd64 |
|
| Windows | 1.21 | amd64 |
|
||||||
| MacOS | 1.18 | amd64 |
|
|
||||||
| Windows | 1.20 | amd64 |
|
| Windows | 1.20 | amd64 |
|
||||||
| Windows | 1.19 | amd64 |
|
| Windows | 1.21 | 386 |
|
||||||
| Windows | 1.18 | amd64 |
|
|
||||||
| Windows | 1.20 | 386 |
|
| Windows | 1.20 | 386 |
|
||||||
| Windows | 1.19 | 386 |
|
|
||||||
| Windows | 1.18 | 386 |
|
|
||||||
|
|
||||||
While this project should work for other systems, no compatibility guarantees
|
While this project should work for other systems, no compatibility guarantees
|
||||||
are made for those systems currently.
|
are made for those systems currently.
|
||||||
@ -102,12 +100,11 @@ export pipeline to send that telemetry to an observability platform.
|
|||||||
All officially supported exporters for the OpenTelemetry project are contained in the [exporters directory](./exporters).
|
All officially supported exporters for the OpenTelemetry project are contained in the [exporters directory](./exporters).
|
||||||
|
|
||||||
| Exporter | Metrics | Traces |
|
| Exporter | Metrics | Traces |
|
||||||
| :-----------------------------------: | :-----: | :----: |
|
|---------------------------------------|:-------:|:------:|
|
||||||
| [Jaeger](./exporters/jaeger/) | | ✓ |
|
| [OTLP](./exporters/otlp/) | ✓ | ✓ |
|
||||||
| [OTLP](./exporters/otlp/) | ✓ | ✓ |
|
| [Prometheus](./exporters/prometheus/) | ✓ | |
|
||||||
| [Prometheus](./exporters/prometheus/) | ✓ | |
|
| [stdout](./exporters/stdout/) | ✓ | ✓ |
|
||||||
| [stdout](./exporters/stdout/) | ✓ | ✓ |
|
| [Zipkin](./exporters/zipkin/) | | ✓ |
|
||||||
| [Zipkin](./exporters/zipkin/) | | ✓ |
|
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
|
32
src/vendor/go.opentelemetry.io/otel/RELEASING.md
generated
vendored
32
src/vendor/go.opentelemetry.io/otel/RELEASING.md
generated
vendored
@ -2,28 +2,30 @@
|
|||||||
|
|
||||||
## 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 Semantic Conventions] 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 Semantic Conventions] 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.
|
||||||
|
|
||||||
For example,
|
For example,
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
export TAG="v1.13.0" # Change to the release version you are generating.
|
export TAG="v1.21.0" # Change to the release version you are generating.
|
||||||
export OTEL_SPEC_REPO="/absolute/path/to/opentelemetry-specification"
|
export OTEL_SEMCONV_REPO="/absolute/path/to/opentelemetry/semantic-conventions"
|
||||||
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_SEMCONV_REPO.
|
||||||
```
|
```
|
||||||
|
|
||||||
This should create a new sub-package of [`semconv`](./semconv).
|
This should create a new sub-package of [`semconv`](./semconv).
|
||||||
Ensure things look correct before submitting a pull request to include the addition.
|
Ensure things look correct before submitting a pull request to include the addition.
|
||||||
|
|
||||||
**Note**, the generation code was changed to generate versions >= 1.13.
|
## Breaking changes validation
|
||||||
To generate versions prior to this, checkout the old release of this repository (i.e. [2fe8861](https://github.com/open-telemetry/opentelemetry-go/commit/2fe8861a24e20088c065b116089862caf9e3cd8b)).
|
|
||||||
|
You can run `make gorelease` that runs [gorelease](https://pkg.go.dev/golang.org/x/exp/cmd/gorelease) to ensure that there are no unwanted changes done in the public API.
|
||||||
|
|
||||||
|
You can check/report problems with `gorelease` [here](https://golang.org/issues/26420).
|
||||||
|
|
||||||
## Pre-Release
|
## Pre-Release
|
||||||
|
|
||||||
@ -121,7 +123,17 @@ Once verified be sure to [make a release for the `contrib` repository](https://g
|
|||||||
|
|
||||||
### Website Documentation
|
### Website Documentation
|
||||||
|
|
||||||
Update [the documentation](./website_docs) for [the OpenTelemetry website](https://opentelemetry.io/docs/go/).
|
Update the [Go instrumentation documentation] in the OpenTelemetry website under [content/en/docs/instrumentation/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 Semantic Conventions]: https://github.com/open-telemetry/semantic-conventions
|
||||||
|
[Go instrumentation documentation]: https://opentelemetry.io/docs/instrumentation/go/
|
||||||
|
[content/en/docs/instrumentation/go]: https://github.com/open-telemetry/opentelemetry.io/tree/main/content/en/docs/instrumentation/go
|
||||||
|
|
||||||
|
### Demo Repository
|
||||||
|
|
||||||
|
Bump the dependencies in the following Go services:
|
||||||
|
|
||||||
|
- [`accountingservice`](https://github.com/open-telemetry/opentelemetry-demo/tree/main/src/accountingservice)
|
||||||
|
- [`checkoutservice`](https://github.com/open-telemetry/opentelemetry-demo/tree/main/src/checkoutservice)
|
||||||
|
- [`productcatalogservice`](https://github.com/open-telemetry/opentelemetry-demo/tree/main/src/productcatalogservice)
|
||||||
|
60
src/vendor/go.opentelemetry.io/otel/attribute/filter.go
generated
vendored
Normal file
60
src/vendor/go.opentelemetry.io/otel/attribute/filter.go
generated
vendored
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
// 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 attribute // import "go.opentelemetry.io/otel/attribute"
|
||||||
|
|
||||||
|
// Filter supports removing certain attributes from attribute sets. When
|
||||||
|
// the filter returns true, the attribute will be kept in the filtered
|
||||||
|
// attribute set. When the filter returns false, the attribute is excluded
|
||||||
|
// from the filtered attribute set, and the attribute instead appears in
|
||||||
|
// the removed list of excluded attributes.
|
||||||
|
type Filter func(KeyValue) bool
|
||||||
|
|
||||||
|
// NewAllowKeysFilter returns a Filter that only allows attributes with one of
|
||||||
|
// the provided keys.
|
||||||
|
//
|
||||||
|
// If keys is empty a deny-all filter is returned.
|
||||||
|
func NewAllowKeysFilter(keys ...Key) Filter {
|
||||||
|
if len(keys) <= 0 {
|
||||||
|
return func(kv KeyValue) bool { return false }
|
||||||
|
}
|
||||||
|
|
||||||
|
allowed := make(map[Key]struct{})
|
||||||
|
for _, k := range keys {
|
||||||
|
allowed[k] = struct{}{}
|
||||||
|
}
|
||||||
|
return func(kv KeyValue) bool {
|
||||||
|
_, ok := allowed[kv.Key]
|
||||||
|
return ok
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewDenyKeysFilter returns a Filter that only allows attributes
|
||||||
|
// that do not have one of the provided keys.
|
||||||
|
//
|
||||||
|
// If keys is empty an allow-all filter is returned.
|
||||||
|
func NewDenyKeysFilter(keys ...Key) Filter {
|
||||||
|
if len(keys) <= 0 {
|
||||||
|
return func(kv KeyValue) bool { return true }
|
||||||
|
}
|
||||||
|
|
||||||
|
forbid := make(map[Key]struct{})
|
||||||
|
for _, k := range keys {
|
||||||
|
forbid[k] = struct{}{}
|
||||||
|
}
|
||||||
|
return func(kv KeyValue) bool {
|
||||||
|
_, ok := forbid[kv.Key]
|
||||||
|
return !ok
|
||||||
|
}
|
||||||
|
}
|
27
src/vendor/go.opentelemetry.io/otel/attribute/set.go
generated
vendored
27
src/vendor/go.opentelemetry.io/otel/attribute/set.go
generated
vendored
@ -18,6 +18,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"reflect"
|
"reflect"
|
||||||
"sort"
|
"sort"
|
||||||
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
@ -38,13 +39,6 @@ type (
|
|||||||
iface interface{}
|
iface interface{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Filter supports removing certain attributes from attribute sets. When
|
|
||||||
// the filter returns true, the attribute will be kept in the filtered
|
|
||||||
// attribute set. When the filter returns false, the attribute is excluded
|
|
||||||
// from the filtered attribute set, and the attribute instead appears in
|
|
||||||
// the removed list of excluded attributes.
|
|
||||||
Filter func(KeyValue) bool
|
|
||||||
|
|
||||||
// Sortable implements sort.Interface, used for sorting KeyValue. This is
|
// Sortable implements sort.Interface, used for sorting KeyValue. This is
|
||||||
// an exported type to support a memory optimization. A pointer to one of
|
// an exported type to support a memory optimization. A pointer to one of
|
||||||
// these is needed for the call to sort.Stable(), which the caller may
|
// these is needed for the call to sort.Stable(), which the caller may
|
||||||
@ -62,6 +56,12 @@ var (
|
|||||||
iface: [0]KeyValue{},
|
iface: [0]KeyValue{},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// sortables is a pool of Sortables used to create Sets with a user does
|
||||||
|
// not provide one.
|
||||||
|
sortables = sync.Pool{
|
||||||
|
New: func() interface{} { return new(Sortable) },
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// EmptySet returns a reference to a Set with no elements.
|
// EmptySet returns a reference to a Set with no elements.
|
||||||
@ -91,7 +91,7 @@ func (l *Set) Len() int {
|
|||||||
|
|
||||||
// Get returns the KeyValue at ordered position idx in this set.
|
// Get returns the KeyValue at ordered position idx in this set.
|
||||||
func (l *Set) Get(idx int) (KeyValue, bool) {
|
func (l *Set) Get(idx int) (KeyValue, bool) {
|
||||||
if l == nil {
|
if l == nil || !l.equivalent.Valid() {
|
||||||
return KeyValue{}, false
|
return KeyValue{}, false
|
||||||
}
|
}
|
||||||
value := l.equivalent.reflectValue()
|
value := l.equivalent.reflectValue()
|
||||||
@ -107,7 +107,7 @@ func (l *Set) Get(idx int) (KeyValue, bool) {
|
|||||||
|
|
||||||
// Value returns the value of a specified key in this set.
|
// Value returns the value of a specified key in this set.
|
||||||
func (l *Set) Value(k Key) (Value, bool) {
|
func (l *Set) Value(k Key) (Value, bool) {
|
||||||
if l == nil {
|
if l == nil || !l.equivalent.Valid() {
|
||||||
return Value{}, false
|
return Value{}, false
|
||||||
}
|
}
|
||||||
rValue := l.equivalent.reflectValue()
|
rValue := l.equivalent.reflectValue()
|
||||||
@ -191,7 +191,9 @@ func NewSet(kvs ...KeyValue) Set {
|
|||||||
if len(kvs) == 0 {
|
if len(kvs) == 0 {
|
||||||
return empty()
|
return empty()
|
||||||
}
|
}
|
||||||
s, _ := NewSetWithSortableFiltered(kvs, new(Sortable), nil)
|
srt := sortables.Get().(*Sortable)
|
||||||
|
s, _ := NewSetWithSortableFiltered(kvs, srt, nil)
|
||||||
|
sortables.Put(srt)
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -218,7 +220,10 @@ func NewSetWithFiltered(kvs []KeyValue, filter Filter) (Set, []KeyValue) {
|
|||||||
if len(kvs) == 0 {
|
if len(kvs) == 0 {
|
||||||
return empty(), nil
|
return empty(), nil
|
||||||
}
|
}
|
||||||
return NewSetWithSortableFiltered(kvs, new(Sortable), filter)
|
srt := sortables.Get().(*Sortable)
|
||||||
|
s, filtered := NewSetWithSortableFiltered(kvs, srt, filter)
|
||||||
|
sortables.Put(srt)
|
||||||
|
return s, filtered
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewSetWithSortableFiltered returns a new Set.
|
// NewSetWithSortableFiltered returns a new Set.
|
||||||
|
68
src/vendor/go.opentelemetry.io/otel/baggage/baggage.go
generated
vendored
68
src/vendor/go.opentelemetry.io/otel/baggage/baggage.go
generated
vendored
@ -61,11 +61,6 @@ type Property struct {
|
|||||||
// hasValue indicates if a zero-value value means the property does not
|
// hasValue indicates if a zero-value value means the property does not
|
||||||
// have a value or if it was the zero-value.
|
// have a value or if it was the zero-value.
|
||||||
hasValue bool
|
hasValue bool
|
||||||
|
|
||||||
// hasData indicates whether the created property contains data or not.
|
|
||||||
// Properties that do not contain data are invalid with no other check
|
|
||||||
// required.
|
|
||||||
hasData bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewKeyProperty returns a new Property for key.
|
// NewKeyProperty returns a new Property for key.
|
||||||
@ -76,7 +71,7 @@ func NewKeyProperty(key string) (Property, error) {
|
|||||||
return newInvalidProperty(), fmt.Errorf("%w: %q", errInvalidKey, key)
|
return newInvalidProperty(), fmt.Errorf("%w: %q", errInvalidKey, key)
|
||||||
}
|
}
|
||||||
|
|
||||||
p := Property{key: key, hasData: true}
|
p := Property{key: key}
|
||||||
return p, nil
|
return p, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -95,7 +90,6 @@ func NewKeyValueProperty(key, value string) (Property, error) {
|
|||||||
key: key,
|
key: key,
|
||||||
value: value,
|
value: value,
|
||||||
hasValue: true,
|
hasValue: true,
|
||||||
hasData: true,
|
|
||||||
}
|
}
|
||||||
return p, nil
|
return p, nil
|
||||||
}
|
}
|
||||||
@ -117,7 +111,7 @@ func parseProperty(property string) (Property, error) {
|
|||||||
return newInvalidProperty(), fmt.Errorf("%w: %q", errInvalidProperty, property)
|
return newInvalidProperty(), fmt.Errorf("%w: %q", errInvalidProperty, property)
|
||||||
}
|
}
|
||||||
|
|
||||||
p := Property{hasData: true}
|
var p Property
|
||||||
if match[1] != "" {
|
if match[1] != "" {
|
||||||
p.key = match[1]
|
p.key = match[1]
|
||||||
} else {
|
} else {
|
||||||
@ -136,10 +130,6 @@ func (p Property) validate() error {
|
|||||||
return fmt.Errorf("invalid property: %w", err)
|
return fmt.Errorf("invalid property: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !p.hasData {
|
|
||||||
return errFunc(fmt.Errorf("%w: %q", errInvalidProperty, p))
|
|
||||||
}
|
|
||||||
|
|
||||||
if !keyRe.MatchString(p.key) {
|
if !keyRe.MatchString(p.key) {
|
||||||
return errFunc(fmt.Errorf("%w: %q", errInvalidKey, p.key))
|
return errFunc(fmt.Errorf("%w: %q", errInvalidKey, p.key))
|
||||||
}
|
}
|
||||||
@ -289,45 +279,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
|
||||||
|
2
src/vendor/go.opentelemetry.io/otel/codes/doc.go
generated
vendored
2
src/vendor/go.opentelemetry.io/otel/codes/doc.go
generated
vendored
@ -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"
|
||||||
|
64
src/vendor/go.opentelemetry.io/otel/handler.go
generated
vendored
64
src/vendor/go.opentelemetry.io/otel/handler.go
generated
vendored
@ -15,58 +15,16 @@
|
|||||||
package otel // import "go.opentelemetry.io/otel"
|
package otel // import "go.opentelemetry.io/otel"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"log"
|
"go.opentelemetry.io/otel/internal/global"
|
||||||
"os"
|
|
||||||
"sync/atomic"
|
|
||||||
"unsafe"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// globalErrorHandler provides an ErrorHandler that can be used
|
// Compile-time check global.ErrDelegator implements ErrorHandler.
|
||||||
// throughout an OpenTelemetry instrumented project. When a user
|
_ ErrorHandler = (*global.ErrDelegator)(nil)
|
||||||
// specified ErrorHandler is registered (`SetErrorHandler`) all calls to
|
// Compile-time check global.ErrLogger implements ErrorHandler.
|
||||||
// `Handle` and will be delegated to the registered ErrorHandler.
|
_ ErrorHandler = (*global.ErrLogger)(nil)
|
||||||
globalErrorHandler = defaultErrorHandler()
|
|
||||||
|
|
||||||
// Compile-time check that delegator implements ErrorHandler.
|
|
||||||
_ ErrorHandler = (*delegator)(nil)
|
|
||||||
// Compile-time check that errLogger implements ErrorHandler.
|
|
||||||
_ ErrorHandler = (*errLogger)(nil)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type delegator struct {
|
|
||||||
delegate unsafe.Pointer
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *delegator) Handle(err error) {
|
|
||||||
d.getDelegate().Handle(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *delegator) getDelegate() ErrorHandler {
|
|
||||||
return *(*ErrorHandler)(atomic.LoadPointer(&d.delegate))
|
|
||||||
}
|
|
||||||
|
|
||||||
// setDelegate sets the ErrorHandler delegate.
|
|
||||||
func (d *delegator) setDelegate(eh ErrorHandler) {
|
|
||||||
atomic.StorePointer(&d.delegate, unsafe.Pointer(&eh))
|
|
||||||
}
|
|
||||||
|
|
||||||
func defaultErrorHandler() *delegator {
|
|
||||||
d := &delegator{}
|
|
||||||
d.setDelegate(&errLogger{l: log.New(os.Stderr, "", log.LstdFlags)})
|
|
||||||
return d
|
|
||||||
}
|
|
||||||
|
|
||||||
// errLogger logs errors if no delegate is set, otherwise they are delegated.
|
|
||||||
type errLogger struct {
|
|
||||||
l *log.Logger
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle logs err if no delegate is set, otherwise it is delegated.
|
|
||||||
func (h *errLogger) Handle(err error) {
|
|
||||||
h.l.Print(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetErrorHandler returns the global ErrorHandler instance.
|
// GetErrorHandler returns the global ErrorHandler instance.
|
||||||
//
|
//
|
||||||
// The default ErrorHandler instance returned will log all errors to STDERR
|
// The default ErrorHandler instance returned will log all errors to STDERR
|
||||||
@ -76,9 +34,7 @@ func (h *errLogger) Handle(err error) {
|
|||||||
//
|
//
|
||||||
// Subsequent calls to SetErrorHandler after the first will not forward errors
|
// Subsequent calls to SetErrorHandler after the first will not forward errors
|
||||||
// to the new ErrorHandler for prior returned instances.
|
// to the new ErrorHandler for prior returned instances.
|
||||||
func GetErrorHandler() ErrorHandler {
|
func GetErrorHandler() ErrorHandler { return global.GetErrorHandler() }
|
||||||
return globalErrorHandler
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetErrorHandler sets the global ErrorHandler to h.
|
// SetErrorHandler sets the global ErrorHandler to h.
|
||||||
//
|
//
|
||||||
@ -86,11 +42,7 @@ func GetErrorHandler() ErrorHandler {
|
|||||||
// GetErrorHandler will send errors to h instead of the default logging
|
// GetErrorHandler will send errors to h instead of the default logging
|
||||||
// ErrorHandler. Subsequent calls will set the global ErrorHandler, but not
|
// ErrorHandler. Subsequent calls will set the global ErrorHandler, but not
|
||||||
// delegate errors to h.
|
// delegate errors to h.
|
||||||
func SetErrorHandler(h ErrorHandler) {
|
func SetErrorHandler(h ErrorHandler) { global.SetErrorHandler(h) }
|
||||||
globalErrorHandler.setDelegate(h)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle is a convenience function for ErrorHandler().Handle(err).
|
// Handle is a convenience function for ErrorHandler().Handle(err).
|
||||||
func Handle(err error) {
|
func Handle(err error) { global.Handle(err) }
|
||||||
GetErrorHandler().Handle(err)
|
|
||||||
}
|
|
||||||
|
29
src/vendor/go.opentelemetry.io/otel/internal/gen.go
generated
vendored
Normal file
29
src/vendor/go.opentelemetry.io/otel/internal/gen.go
generated
vendored
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
// 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 internal // import "go.opentelemetry.io/otel/internal"
|
||||||
|
|
||||||
|
//go:generate gotmpl --body=./shared/matchers/expectation.go.tmpl "--data={}" --out=matchers/expectation.go
|
||||||
|
//go:generate gotmpl --body=./shared/matchers/expecter.go.tmpl "--data={}" --out=matchers/expecter.go
|
||||||
|
//go:generate gotmpl --body=./shared/matchers/temporal_matcher.go.tmpl "--data={}" --out=matchers/temporal_matcher.go
|
||||||
|
|
||||||
|
//go:generate gotmpl --body=./shared/internaltest/alignment.go.tmpl "--data={}" --out=internaltest/alignment.go
|
||||||
|
//go:generate gotmpl --body=./shared/internaltest/env.go.tmpl "--data={}" --out=internaltest/env.go
|
||||||
|
//go:generate gotmpl --body=./shared/internaltest/env_test.go.tmpl "--data={}" --out=internaltest/env_test.go
|
||||||
|
//go:generate gotmpl --body=./shared/internaltest/errors.go.tmpl "--data={}" --out=internaltest/errors.go
|
||||||
|
//go:generate gotmpl --body=./shared/internaltest/harness.go.tmpl "--data={\"matchersImportPath\": \"go.opentelemetry.io/otel/internal/matchers\"}" --out=internaltest/harness.go
|
||||||
|
//go:generate gotmpl --body=./shared/internaltest/text_map_carrier.go.tmpl "--data={}" --out=internaltest/text_map_carrier.go
|
||||||
|
//go:generate gotmpl --body=./shared/internaltest/text_map_carrier_test.go.tmpl "--data={}" --out=internaltest/text_map_carrier_test.go
|
||||||
|
//go:generate gotmpl --body=./shared/internaltest/text_map_propagator.go.tmpl "--data={}" --out=internaltest/text_map_propagator.go
|
||||||
|
//go:generate gotmpl --body=./shared/internaltest/text_map_propagator_test.go.tmpl "--data={}" --out=internaltest/text_map_propagator_test.go
|
102
src/vendor/go.opentelemetry.io/otel/internal/global/handler.go
generated
vendored
Normal file
102
src/vendor/go.opentelemetry.io/otel/internal/global/handler.go
generated
vendored
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
// 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 (
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"sync/atomic"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// GlobalErrorHandler provides an ErrorHandler that can be used
|
||||||
|
// throughout an OpenTelemetry instrumented project. When a user
|
||||||
|
// specified ErrorHandler is registered (`SetErrorHandler`) all calls to
|
||||||
|
// `Handle` and will be delegated to the registered ErrorHandler.
|
||||||
|
GlobalErrorHandler = defaultErrorHandler()
|
||||||
|
|
||||||
|
// Compile-time check that delegator implements ErrorHandler.
|
||||||
|
_ ErrorHandler = (*ErrDelegator)(nil)
|
||||||
|
// Compile-time check that errLogger implements ErrorHandler.
|
||||||
|
_ ErrorHandler = (*ErrLogger)(nil)
|
||||||
|
)
|
||||||
|
|
||||||
|
// ErrorHandler handles irremediable events.
|
||||||
|
type ErrorHandler interface {
|
||||||
|
// Handle handles any error deemed irremediable by an OpenTelemetry
|
||||||
|
// component.
|
||||||
|
Handle(error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type ErrDelegator struct {
|
||||||
|
delegate atomic.Pointer[ErrorHandler]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *ErrDelegator) Handle(err error) {
|
||||||
|
d.getDelegate().Handle(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *ErrDelegator) getDelegate() ErrorHandler {
|
||||||
|
return *d.delegate.Load()
|
||||||
|
}
|
||||||
|
|
||||||
|
// setDelegate sets the ErrorHandler delegate.
|
||||||
|
func (d *ErrDelegator) setDelegate(eh ErrorHandler) {
|
||||||
|
d.delegate.Store(&eh)
|
||||||
|
}
|
||||||
|
|
||||||
|
func defaultErrorHandler() *ErrDelegator {
|
||||||
|
d := &ErrDelegator{}
|
||||||
|
d.setDelegate(&ErrLogger{l: log.New(os.Stderr, "", log.LstdFlags)})
|
||||||
|
return d
|
||||||
|
}
|
||||||
|
|
||||||
|
// ErrLogger logs errors if no delegate is set, otherwise they are delegated.
|
||||||
|
type ErrLogger struct {
|
||||||
|
l *log.Logger
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle logs err if no delegate is set, otherwise it is delegated.
|
||||||
|
func (h *ErrLogger) Handle(err error) {
|
||||||
|
h.l.Print(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetErrorHandler returns the global ErrorHandler instance.
|
||||||
|
//
|
||||||
|
// The default ErrorHandler instance returned will log all errors to STDERR
|
||||||
|
// until an override ErrorHandler is set with SetErrorHandler. All
|
||||||
|
// ErrorHandler returned prior to this will automatically forward errors to
|
||||||
|
// the set instance instead of logging.
|
||||||
|
//
|
||||||
|
// Subsequent calls to SetErrorHandler after the first will not forward errors
|
||||||
|
// to the new ErrorHandler for prior returned instances.
|
||||||
|
func GetErrorHandler() ErrorHandler {
|
||||||
|
return GlobalErrorHandler
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetErrorHandler sets the global ErrorHandler to h.
|
||||||
|
//
|
||||||
|
// The first time this is called all ErrorHandler previously returned from
|
||||||
|
// GetErrorHandler will send errors to h instead of the default logging
|
||||||
|
// ErrorHandler. Subsequent calls will set the global ErrorHandler, but not
|
||||||
|
// delegate errors to h.
|
||||||
|
func SetErrorHandler(h ErrorHandler) {
|
||||||
|
GlobalErrorHandler.setDelegate(h)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle is a convenience function for ErrorHandler().Handle(err).
|
||||||
|
func Handle(err error) {
|
||||||
|
GetErrorHandler().Handle(err)
|
||||||
|
}
|
359
src/vendor/go.opentelemetry.io/otel/internal/global/instruments.go
generated
vendored
Normal file
359
src/vendor/go.opentelemetry.io/otel/internal/global/instruments.go
generated
vendored
Normal file
@ -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...)
|
||||||
|
}
|
||||||
|
}
|
26
src/vendor/go.opentelemetry.io/otel/internal/global/internal_logging.go
generated
vendored
26
src/vendor/go.opentelemetry.io/otel/internal/global/internal_logging.go
generated
vendored
@ -18,17 +18,16 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"unsafe"
|
|
||||||
|
|
||||||
"github.com/go-logr/logr"
|
"github.com/go-logr/logr"
|
||||||
"github.com/go-logr/stdr"
|
"github.com/go-logr/stdr"
|
||||||
)
|
)
|
||||||
|
|
||||||
// globalLogger is the logging interface used within the otel api and sdk provide deatails of the internals.
|
// globalLogger is the logging interface used within the otel api and sdk provide details of the internals.
|
||||||
//
|
//
|
||||||
// The default logger uses stdr which is backed by the standard `log.Logger`
|
// The default logger uses stdr which is backed by the standard `log.Logger`
|
||||||
// interface. This logger will only show messages at the Error Level.
|
// interface. This logger will only show messages at the Error Level.
|
||||||
var globalLogger unsafe.Pointer
|
var globalLogger atomic.Pointer[logr.Logger]
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
SetLogger(stdr.New(log.New(os.Stderr, "", log.LstdFlags|log.Lshortfile)))
|
SetLogger(stdr.New(log.New(os.Stderr, "", log.LstdFlags|log.Lshortfile)))
|
||||||
@ -36,20 +35,21 @@ func init() {
|
|||||||
|
|
||||||
// SetLogger overrides the globalLogger with l.
|
// SetLogger overrides the globalLogger with l.
|
||||||
//
|
//
|
||||||
// To see Info messages use a logger with `l.V(1).Enabled() == true`
|
// To see Warn messages use a logger with `l.V(1).Enabled() == true`
|
||||||
// To see Debug messages use a logger with `l.V(5).Enabled() == true`.
|
// To see Info messages use a logger with `l.V(4).Enabled() == true`
|
||||||
|
// To see Debug messages use a logger with `l.V(8).Enabled() == true`.
|
||||||
func SetLogger(l logr.Logger) {
|
func SetLogger(l logr.Logger) {
|
||||||
atomic.StorePointer(&globalLogger, unsafe.Pointer(&l))
|
globalLogger.Store(&l)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getLogger() logr.Logger {
|
func getLogger() logr.Logger {
|
||||||
return *(*logr.Logger)(atomic.LoadPointer(&globalLogger))
|
return *globalLogger.Load()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Info prints messages about the general state of the API or SDK.
|
// Info prints messages about the general state of the API or SDK.
|
||||||
// This should usually be less then 5 messages a minute.
|
// This should usually be less than 5 messages a minute.
|
||||||
func Info(msg string, keysAndValues ...interface{}) {
|
func Info(msg string, keysAndValues ...interface{}) {
|
||||||
getLogger().V(1).Info(msg, keysAndValues...)
|
getLogger().V(4).Info(msg, keysAndValues...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Error prints messages about exceptional states of the API or SDK.
|
// Error prints messages about exceptional states of the API or SDK.
|
||||||
@ -59,5 +59,11 @@ func Error(err error, msg string, keysAndValues ...interface{}) {
|
|||||||
|
|
||||||
// Debug prints messages about all internal changes in the API or SDK.
|
// Debug prints messages about all internal changes in the API or SDK.
|
||||||
func Debug(msg string, keysAndValues ...interface{}) {
|
func Debug(msg string, keysAndValues ...interface{}) {
|
||||||
getLogger().V(5).Info(msg, keysAndValues...)
|
getLogger().V(8).Info(msg, keysAndValues...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Warn prints messages about warnings in the API or SDK.
|
||||||
|
// Not an error but is likely more important than an informational event.
|
||||||
|
func Warn(msg string, keysAndValues ...interface{}) {
|
||||||
|
getLogger().V(1).Info(msg, keysAndValues...)
|
||||||
}
|
}
|
||||||
|
354
src/vendor/go.opentelemetry.io/otel/internal/global/meter.go
generated
vendored
Normal file
354
src/vendor/go.opentelemetry.io/otel/internal/global/meter.go
generated
vendored
Normal file
@ -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
|
||||||
|
}
|
45
src/vendor/go.opentelemetry.io/otel/internal/global/state.go
generated
vendored
45
src/vendor/go.opentelemetry.io/otel/internal/global/state.go
generated
vendored
@ -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
|
||||||
|
}
|
||||||
|
201
src/vendor/go.opentelemetry.io/otel/internal/metric/LICENSE
generated
vendored
201
src/vendor/go.opentelemetry.io/otel/internal/metric/LICENSE
generated
vendored
@ -1,201 +0,0 @@
|
|||||||
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.
|
|
348
src/vendor/go.opentelemetry.io/otel/internal/metric/global/meter.go
generated
vendored
348
src/vendor/go.opentelemetry.io/otel/internal/metric/global/meter.go
generated
vendored
@ -1,348 +0,0 @@
|
|||||||
// 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 (
|
|
||||||
"context"
|
|
||||||
"sync"
|
|
||||||
"sync/atomic"
|
|
||||||
"unsafe"
|
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/attribute"
|
|
||||||
"go.opentelemetry.io/otel/metric"
|
|
||||||
"go.opentelemetry.io/otel/metric/number"
|
|
||||||
"go.opentelemetry.io/otel/metric/registry"
|
|
||||||
)
|
|
||||||
|
|
||||||
// This file contains the forwarding implementation of MeterProvider used as
|
|
||||||
// the default global instance. Metric events using instruments provided by
|
|
||||||
// this implementation are no-ops until the first Meter implementation is set
|
|
||||||
// as the global provider.
|
|
||||||
//
|
|
||||||
// The implementation here uses Mutexes to maintain a list of active Meters in
|
|
||||||
// the MeterProvider and Instruments in each Meter, under the assumption that
|
|
||||||
// these interfaces are not performance-critical.
|
|
||||||
//
|
|
||||||
// We have the invariant that setDelegate() will be called before a new
|
|
||||||
// MeterProvider implementation is registered as the global provider. Mutexes
|
|
||||||
// in the MeterProvider and Meters ensure that each instrument has a delegate
|
|
||||||
// before the global provider is set.
|
|
||||||
//
|
|
||||||
// Bound instrument operations are implemented by delegating to the
|
|
||||||
// instrument after it is registered, with a sync.Once initializer to
|
|
||||||
// protect against races with Release().
|
|
||||||
//
|
|
||||||
// Metric uniqueness checking is implemented by calling the exported
|
|
||||||
// methods of the api/metric/registry package.
|
|
||||||
|
|
||||||
type meterKey struct {
|
|
||||||
Name, Version string
|
|
||||||
}
|
|
||||||
|
|
||||||
type meterProvider struct {
|
|
||||||
delegate metric.MeterProvider
|
|
||||||
|
|
||||||
// lock protects `delegate` and `meters`.
|
|
||||||
lock sync.Mutex
|
|
||||||
|
|
||||||
// meters maintains a unique entry for every named Meter
|
|
||||||
// that has been registered through the global instance.
|
|
||||||
meters map[meterKey]*meterEntry
|
|
||||||
}
|
|
||||||
|
|
||||||
type meterImpl struct {
|
|
||||||
delegate unsafe.Pointer // (*metric.MeterImpl)
|
|
||||||
|
|
||||||
lock sync.Mutex
|
|
||||||
syncInsts []*syncImpl
|
|
||||||
asyncInsts []*asyncImpl
|
|
||||||
}
|
|
||||||
|
|
||||||
type meterEntry struct {
|
|
||||||
unique metric.MeterImpl
|
|
||||||
impl meterImpl
|
|
||||||
}
|
|
||||||
|
|
||||||
type instrument struct {
|
|
||||||
descriptor metric.Descriptor
|
|
||||||
}
|
|
||||||
|
|
||||||
type syncImpl struct {
|
|
||||||
delegate unsafe.Pointer // (*metric.SyncImpl)
|
|
||||||
|
|
||||||
instrument
|
|
||||||
}
|
|
||||||
|
|
||||||
type asyncImpl struct {
|
|
||||||
delegate unsafe.Pointer // (*metric.AsyncImpl)
|
|
||||||
|
|
||||||
instrument
|
|
||||||
|
|
||||||
runner metric.AsyncRunner
|
|
||||||
}
|
|
||||||
|
|
||||||
// SyncImpler is implemented by all of the sync metric
|
|
||||||
// instruments.
|
|
||||||
type SyncImpler interface {
|
|
||||||
SyncImpl() metric.SyncImpl
|
|
||||||
}
|
|
||||||
|
|
||||||
// AsyncImpler is implemented by all of the async
|
|
||||||
// metric instruments.
|
|
||||||
type AsyncImpler interface {
|
|
||||||
AsyncImpl() metric.AsyncImpl
|
|
||||||
}
|
|
||||||
|
|
||||||
type syncHandle struct {
|
|
||||||
delegate unsafe.Pointer // (*metric.BoundInstrumentImpl)
|
|
||||||
|
|
||||||
inst *syncImpl
|
|
||||||
labels []attribute.KeyValue
|
|
||||||
|
|
||||||
initialize sync.Once
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ metric.MeterProvider = &meterProvider{}
|
|
||||||
var _ metric.MeterImpl = &meterImpl{}
|
|
||||||
var _ metric.InstrumentImpl = &syncImpl{}
|
|
||||||
var _ metric.BoundSyncImpl = &syncHandle{}
|
|
||||||
var _ metric.AsyncImpl = &asyncImpl{}
|
|
||||||
|
|
||||||
func (inst *instrument) Descriptor() metric.Descriptor {
|
|
||||||
return inst.descriptor
|
|
||||||
}
|
|
||||||
|
|
||||||
// MeterProvider interface and delegation
|
|
||||||
|
|
||||||
func newMeterProvider() *meterProvider {
|
|
||||||
return &meterProvider{
|
|
||||||
meters: map[meterKey]*meterEntry{},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *meterProvider) setDelegate(provider metric.MeterProvider) {
|
|
||||||
p.lock.Lock()
|
|
||||||
defer p.lock.Unlock()
|
|
||||||
|
|
||||||
p.delegate = provider
|
|
||||||
for key, entry := range p.meters {
|
|
||||||
entry.impl.setDelegate(key.Name, key.Version, provider)
|
|
||||||
}
|
|
||||||
p.meters = nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *meterProvider) Meter(instrumentationName string, opts ...metric.MeterOption) metric.Meter {
|
|
||||||
p.lock.Lock()
|
|
||||||
defer p.lock.Unlock()
|
|
||||||
|
|
||||||
if p.delegate != nil {
|
|
||||||
return p.delegate.Meter(instrumentationName, opts...)
|
|
||||||
}
|
|
||||||
|
|
||||||
key := meterKey{
|
|
||||||
Name: instrumentationName,
|
|
||||||
Version: metric.NewMeterConfig(opts...).InstrumentationVersion(),
|
|
||||||
}
|
|
||||||
entry, ok := p.meters[key]
|
|
||||||
if !ok {
|
|
||||||
entry = &meterEntry{}
|
|
||||||
entry.unique = registry.NewUniqueInstrumentMeterImpl(&entry.impl)
|
|
||||||
p.meters[key] = entry
|
|
||||||
|
|
||||||
}
|
|
||||||
return metric.WrapMeterImpl(entry.unique, key.Name, metric.WithInstrumentationVersion(key.Version))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Meter interface and delegation
|
|
||||||
|
|
||||||
func (m *meterImpl) setDelegate(name, version string, provider metric.MeterProvider) {
|
|
||||||
m.lock.Lock()
|
|
||||||
defer m.lock.Unlock()
|
|
||||||
|
|
||||||
d := new(metric.MeterImpl)
|
|
||||||
*d = provider.Meter(name, metric.WithInstrumentationVersion(version)).MeterImpl()
|
|
||||||
m.delegate = unsafe.Pointer(d)
|
|
||||||
|
|
||||||
for _, inst := range m.syncInsts {
|
|
||||||
inst.setDelegate(*d)
|
|
||||||
}
|
|
||||||
m.syncInsts = nil
|
|
||||||
for _, obs := range m.asyncInsts {
|
|
||||||
obs.setDelegate(*d)
|
|
||||||
}
|
|
||||||
m.asyncInsts = nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *meterImpl) NewSyncInstrument(desc metric.Descriptor) (metric.SyncImpl, error) {
|
|
||||||
m.lock.Lock()
|
|
||||||
defer m.lock.Unlock()
|
|
||||||
|
|
||||||
if meterPtr := (*metric.MeterImpl)(atomic.LoadPointer(&m.delegate)); meterPtr != nil {
|
|
||||||
return (*meterPtr).NewSyncInstrument(desc)
|
|
||||||
}
|
|
||||||
|
|
||||||
inst := &syncImpl{
|
|
||||||
instrument: instrument{
|
|
||||||
descriptor: desc,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
m.syncInsts = append(m.syncInsts, inst)
|
|
||||||
return inst, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Synchronous delegation
|
|
||||||
|
|
||||||
func (inst *syncImpl) setDelegate(d metric.MeterImpl) {
|
|
||||||
implPtr := new(metric.SyncImpl)
|
|
||||||
|
|
||||||
var err error
|
|
||||||
*implPtr, err = d.NewSyncInstrument(inst.descriptor)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
// TODO: There is no standard way to deliver this error to the user.
|
|
||||||
// See https://github.com/open-telemetry/opentelemetry-go/issues/514
|
|
||||||
// Note that the default SDK will not generate any errors yet, this is
|
|
||||||
// only for added safety.
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
atomic.StorePointer(&inst.delegate, unsafe.Pointer(implPtr))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (inst *syncImpl) Implementation() interface{} {
|
|
||||||
if implPtr := (*metric.SyncImpl)(atomic.LoadPointer(&inst.delegate)); implPtr != nil {
|
|
||||||
return (*implPtr).Implementation()
|
|
||||||
}
|
|
||||||
return inst
|
|
||||||
}
|
|
||||||
|
|
||||||
func (inst *syncImpl) Bind(labels []attribute.KeyValue) metric.BoundSyncImpl {
|
|
||||||
if implPtr := (*metric.SyncImpl)(atomic.LoadPointer(&inst.delegate)); implPtr != nil {
|
|
||||||
return (*implPtr).Bind(labels)
|
|
||||||
}
|
|
||||||
return &syncHandle{
|
|
||||||
inst: inst,
|
|
||||||
labels: labels,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (bound *syncHandle) Unbind() {
|
|
||||||
bound.initialize.Do(func() {})
|
|
||||||
|
|
||||||
implPtr := (*metric.BoundSyncImpl)(atomic.LoadPointer(&bound.delegate))
|
|
||||||
|
|
||||||
if implPtr == nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
(*implPtr).Unbind()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Async delegation
|
|
||||||
|
|
||||||
func (m *meterImpl) NewAsyncInstrument(
|
|
||||||
desc metric.Descriptor,
|
|
||||||
runner metric.AsyncRunner,
|
|
||||||
) (metric.AsyncImpl, error) {
|
|
||||||
|
|
||||||
m.lock.Lock()
|
|
||||||
defer m.lock.Unlock()
|
|
||||||
|
|
||||||
if meterPtr := (*metric.MeterImpl)(atomic.LoadPointer(&m.delegate)); meterPtr != nil {
|
|
||||||
return (*meterPtr).NewAsyncInstrument(desc, runner)
|
|
||||||
}
|
|
||||||
|
|
||||||
inst := &asyncImpl{
|
|
||||||
instrument: instrument{
|
|
||||||
descriptor: desc,
|
|
||||||
},
|
|
||||||
runner: runner,
|
|
||||||
}
|
|
||||||
m.asyncInsts = append(m.asyncInsts, inst)
|
|
||||||
return inst, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (obs *asyncImpl) Implementation() interface{} {
|
|
||||||
if implPtr := (*metric.AsyncImpl)(atomic.LoadPointer(&obs.delegate)); implPtr != nil {
|
|
||||||
return (*implPtr).Implementation()
|
|
||||||
}
|
|
||||||
return obs
|
|
||||||
}
|
|
||||||
|
|
||||||
func (obs *asyncImpl) setDelegate(d metric.MeterImpl) {
|
|
||||||
implPtr := new(metric.AsyncImpl)
|
|
||||||
|
|
||||||
var err error
|
|
||||||
*implPtr, err = d.NewAsyncInstrument(obs.descriptor, obs.runner)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
// TODO: There is no standard way to deliver this error to the user.
|
|
||||||
// See https://github.com/open-telemetry/opentelemetry-go/issues/514
|
|
||||||
// Note that the default SDK will not generate any errors yet, this is
|
|
||||||
// only for added safety.
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
atomic.StorePointer(&obs.delegate, unsafe.Pointer(implPtr))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Metric updates
|
|
||||||
|
|
||||||
func (m *meterImpl) RecordBatch(ctx context.Context, labels []attribute.KeyValue, measurements ...metric.Measurement) {
|
|
||||||
if delegatePtr := (*metric.MeterImpl)(atomic.LoadPointer(&m.delegate)); delegatePtr != nil {
|
|
||||||
(*delegatePtr).RecordBatch(ctx, labels, measurements...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (inst *syncImpl) RecordOne(ctx context.Context, number number.Number, labels []attribute.KeyValue) {
|
|
||||||
if instPtr := (*metric.SyncImpl)(atomic.LoadPointer(&inst.delegate)); instPtr != nil {
|
|
||||||
(*instPtr).RecordOne(ctx, number, labels)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bound instrument initialization
|
|
||||||
|
|
||||||
func (bound *syncHandle) RecordOne(ctx context.Context, number number.Number) {
|
|
||||||
instPtr := (*metric.SyncImpl)(atomic.LoadPointer(&bound.inst.delegate))
|
|
||||||
if instPtr == nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
var implPtr *metric.BoundSyncImpl
|
|
||||||
bound.initialize.Do(func() {
|
|
||||||
implPtr = new(metric.BoundSyncImpl)
|
|
||||||
*implPtr = (*instPtr).Bind(bound.labels)
|
|
||||||
atomic.StorePointer(&bound.delegate, unsafe.Pointer(implPtr))
|
|
||||||
})
|
|
||||||
if implPtr == nil {
|
|
||||||
implPtr = (*metric.BoundSyncImpl)(atomic.LoadPointer(&bound.delegate))
|
|
||||||
}
|
|
||||||
// This may still be nil if instrument was created and bound
|
|
||||||
// without a delegate, then the instrument was set to have a
|
|
||||||
// delegate and unbound.
|
|
||||||
if implPtr == nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
(*implPtr).RecordOne(ctx, number)
|
|
||||||
}
|
|
||||||
|
|
||||||
func AtomicFieldOffsets() map[string]uintptr {
|
|
||||||
return map[string]uintptr{
|
|
||||||
"meterProvider.delegate": unsafe.Offsetof(meterProvider{}.delegate),
|
|
||||||
"meterImpl.delegate": unsafe.Offsetof(meterImpl{}.delegate),
|
|
||||||
"syncImpl.delegate": unsafe.Offsetof(syncImpl{}.delegate),
|
|
||||||
"asyncImpl.delegate": unsafe.Offsetof(asyncImpl{}.delegate),
|
|
||||||
"syncHandle.delegate": unsafe.Offsetof(syncHandle{}.delegate),
|
|
||||||
}
|
|
||||||
}
|
|
66
src/vendor/go.opentelemetry.io/otel/internal/metric/global/metric.go
generated
vendored
66
src/vendor/go.opentelemetry.io/otel/internal/metric/global/metric.go
generated
vendored
@ -1,66 +0,0 @@
|
|||||||
// 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 (
|
|
||||||
"sync"
|
|
||||||
"sync/atomic"
|
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/metric"
|
|
||||||
)
|
|
||||||
|
|
||||||
type meterProviderHolder struct {
|
|
||||||
mp metric.MeterProvider
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
globalMeter = defaultMeterValue()
|
|
||||||
|
|
||||||
delegateMeterOnce sync.Once
|
|
||||||
)
|
|
||||||
|
|
||||||
// MeterProvider is the internal implementation for global.MeterProvider.
|
|
||||||
func MeterProvider() metric.MeterProvider {
|
|
||||||
return globalMeter.Load().(meterProviderHolder).mp
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetMeterProvider is the internal implementation for global.SetMeterProvider.
|
|
||||||
func SetMeterProvider(mp metric.MeterProvider) {
|
|
||||||
delegateMeterOnce.Do(func() {
|
|
||||||
current := MeterProvider()
|
|
||||||
|
|
||||||
if current == mp {
|
|
||||||
// Setting the provider to the prior default is nonsense, panic.
|
|
||||||
// Panic is acceptable because we are likely still early in the
|
|
||||||
// process lifetime.
|
|
||||||
panic("invalid MeterProvider, the global instance cannot be reinstalled")
|
|
||||||
} else if def, ok := current.(*meterProvider); ok {
|
|
||||||
def.setDelegate(mp)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
globalMeter.Store(meterProviderHolder{mp: mp})
|
|
||||||
}
|
|
||||||
|
|
||||||
func defaultMeterValue() *atomic.Value {
|
|
||||||
v := &atomic.Value{}
|
|
||||||
v.Store(meterProviderHolder{mp: newMeterProvider()})
|
|
||||||
return v
|
|
||||||
}
|
|
||||||
|
|
||||||
// ResetForTest restores the initial global state, for testing purposes.
|
|
||||||
func ResetForTest() {
|
|
||||||
globalMeter = defaultMeterValue()
|
|
||||||
delegateMeterOnce = sync.Once{}
|
|
||||||
}
|
|
53
src/vendor/go.opentelemetry.io/otel/metric.go
generated
vendored
Normal file
53
src/vendor/go.opentelemetry.io/otel/metric.go
generated
vendored
Normal file
@ -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)
|
||||||
|
}
|
271
src/vendor/go.opentelemetry.io/otel/metric/asyncfloat64.go
generated
vendored
Normal file
271
src/vendor/go.opentelemetry.io/otel/metric/asyncfloat64.go
generated
vendored
Normal file
@ -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
src/vendor/go.opentelemetry.io/otel/metric/asyncint64.go
generated
vendored
Normal file
269
src/vendor/go.opentelemetry.io/otel/metric/asyncint64.go
generated
vendored
Normal file
@ -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}
|
||||||
|
}
|
139
src/vendor/go.opentelemetry.io/otel/metric/config.go
generated
vendored
139
src/vendor/go.opentelemetry.io/otel/metric/config.go
generated
vendored
@ -14,98 +14,39 @@
|
|||||||
|
|
||||||
package metric // import "go.opentelemetry.io/otel/metric"
|
package metric // import "go.opentelemetry.io/otel/metric"
|
||||||
|
|
||||||
import (
|
import "go.opentelemetry.io/otel/attribute"
|
||||||
"go.opentelemetry.io/otel/metric/unit"
|
|
||||||
)
|
|
||||||
|
|
||||||
// InstrumentConfig contains options for metric instrument descriptors.
|
|
||||||
type InstrumentConfig struct {
|
|
||||||
description string
|
|
||||||
unit unit.Unit
|
|
||||||
instrumentationName string
|
|
||||||
instrumentationVersion string
|
|
||||||
}
|
|
||||||
|
|
||||||
// Description describes the instrument in human-readable terms.
|
|
||||||
func (cfg InstrumentConfig) Description() string {
|
|
||||||
return cfg.description
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unit describes the measurement unit for a instrument.
|
|
||||||
func (cfg InstrumentConfig) Unit() unit.Unit {
|
|
||||||
return cfg.unit
|
|
||||||
}
|
|
||||||
|
|
||||||
// InstrumentationName is the name of the library providing
|
|
||||||
// instrumentation.
|
|
||||||
func (cfg InstrumentConfig) InstrumentationName() string {
|
|
||||||
return cfg.instrumentationName
|
|
||||||
}
|
|
||||||
|
|
||||||
// InstrumentationVersion is the version of the library providing
|
|
||||||
// instrumentation.
|
|
||||||
func (cfg InstrumentConfig) InstrumentationVersion() string {
|
|
||||||
return cfg.instrumentationVersion
|
|
||||||
}
|
|
||||||
|
|
||||||
// InstrumentOption is an interface for applying metric instrument options.
|
|
||||||
type InstrumentOption interface {
|
|
||||||
// ApplyMeter is used to set a InstrumentOption value of a
|
|
||||||
// InstrumentConfig.
|
|
||||||
applyInstrument(*InstrumentConfig)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewInstrumentConfig creates a new InstrumentConfig
|
|
||||||
// and applies all the given options.
|
|
||||||
func NewInstrumentConfig(opts ...InstrumentOption) InstrumentConfig {
|
|
||||||
var config InstrumentConfig
|
|
||||||
for _, o := range opts {
|
|
||||||
o.applyInstrument(&config)
|
|
||||||
}
|
|
||||||
return config
|
|
||||||
}
|
|
||||||
|
|
||||||
type instrumentOptionFunc func(*InstrumentConfig)
|
|
||||||
|
|
||||||
func (fn instrumentOptionFunc) applyInstrument(cfg *InstrumentConfig) {
|
|
||||||
fn(cfg)
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithDescription applies provided description.
|
|
||||||
func WithDescription(desc string) InstrumentOption {
|
|
||||||
return instrumentOptionFunc(func(cfg *InstrumentConfig) {
|
|
||||||
cfg.description = desc
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithUnit applies provided unit.
|
|
||||||
func WithUnit(unit unit.Unit) InstrumentOption {
|
|
||||||
return instrumentOptionFunc(func(cfg *InstrumentConfig) {
|
|
||||||
cfg.unit = unit
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithInstrumentationName sets the instrumentation name.
|
|
||||||
func WithInstrumentationName(name string) InstrumentOption {
|
|
||||||
return instrumentOptionFunc(func(cfg *InstrumentConfig) {
|
|
||||||
cfg.instrumentationName = name
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// MeterConfig contains options for Meters.
|
// MeterConfig contains options for Meters.
|
||||||
type MeterConfig struct {
|
type MeterConfig struct {
|
||||||
instrumentationVersion string
|
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 is the version of the library providing instrumentation.
|
// InstrumentationVersion returns the version of the library providing
|
||||||
|
// instrumentation.
|
||||||
func (cfg MeterConfig) InstrumentationVersion() string {
|
func (cfg MeterConfig) InstrumentationVersion() string {
|
||||||
return cfg.instrumentationVersion
|
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.
|
// MeterOption is an interface for applying Meter options.
|
||||||
type MeterOption interface {
|
type MeterOption interface {
|
||||||
// ApplyMeter is used to set a MeterOption value of a MeterConfig.
|
// applyMeter is used to set a MeterOption value of a MeterConfig.
|
||||||
applyMeter(*MeterConfig)
|
applyMeter(MeterConfig) MeterConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMeterConfig creates a new MeterConfig and applies
|
// NewMeterConfig creates a new MeterConfig and applies
|
||||||
@ -113,29 +54,39 @@ type MeterOption interface {
|
|||||||
func NewMeterConfig(opts ...MeterOption) MeterConfig {
|
func NewMeterConfig(opts ...MeterOption) MeterConfig {
|
||||||
var config MeterConfig
|
var config MeterConfig
|
||||||
for _, o := range opts {
|
for _, o := range opts {
|
||||||
o.applyMeter(&config)
|
config = o.applyMeter(config)
|
||||||
}
|
}
|
||||||
return config
|
return config
|
||||||
}
|
}
|
||||||
|
|
||||||
// InstrumentMeterOption are options that can be used as both an InstrumentOption
|
type meterOptionFunc func(MeterConfig) MeterConfig
|
||||||
// and MeterOption
|
|
||||||
type InstrumentMeterOption interface {
|
func (fn meterOptionFunc) applyMeter(cfg MeterConfig) MeterConfig {
|
||||||
InstrumentOption
|
return fn(cfg)
|
||||||
MeterOption
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithInstrumentationVersion sets the instrumentation version.
|
// WithInstrumentationVersion sets the instrumentation version.
|
||||||
func WithInstrumentationVersion(version string) InstrumentMeterOption {
|
func WithInstrumentationVersion(version string) MeterOption {
|
||||||
return instrumentationVersionOption(version)
|
return meterOptionFunc(func(config MeterConfig) MeterConfig {
|
||||||
|
config.instrumentationVersion = version
|
||||||
|
return config
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
type instrumentationVersionOption string
|
// WithInstrumentationAttributes sets the instrumentation attributes.
|
||||||
|
//
|
||||||
func (i instrumentationVersionOption) applyMeter(config *MeterConfig) {
|
// The passed attributes will be de-duplicated.
|
||||||
config.instrumentationVersion = string(i)
|
func WithInstrumentationAttributes(attr ...attribute.KeyValue) MeterOption {
|
||||||
|
return meterOptionFunc(func(config MeterConfig) MeterConfig {
|
||||||
|
config.attrs = attribute.NewSet(attr...)
|
||||||
|
return config
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i instrumentationVersionOption) applyInstrument(config *InstrumentConfig) {
|
// WithSchemaURL sets the schema URL.
|
||||||
config.instrumentationVersion = string(i)
|
func WithSchemaURL(schemaURL string) MeterOption {
|
||||||
|
return meterOptionFunc(func(config MeterConfig) MeterConfig {
|
||||||
|
config.schemaURL = schemaURL
|
||||||
|
return config
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
179
src/vendor/go.opentelemetry.io/otel/metric/doc.go
generated
vendored
179
src/vendor/go.opentelemetry.io/otel/metric/doc.go
generated
vendored
@ -13,55 +13,158 @@
|
|||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Package metric provides an implementation of the metrics part of the
|
Package metric provides the OpenTelemetry API used to measure metrics about
|
||||||
OpenTelemetry API.
|
source code operation.
|
||||||
|
|
||||||
This package is currently in a pre-GA phase. Backwards incompatible changes
|
This API is separate from its implementation so the instrumentation built from
|
||||||
may be introduced in subsequent minor version releases as we work to track the
|
it is reusable. See [go.opentelemetry.io/otel/sdk/metric] for the official
|
||||||
evolving OpenTelemetry specification and user feedback.
|
OpenTelemetry implementation of this API.
|
||||||
|
|
||||||
Measurements can be made about an operation being performed or the state of a
|
All measurements made with this package are made via instruments. These
|
||||||
system in general. These measurements can be crucial to the reliable operation
|
instruments are created by a [Meter] which itself is created by a
|
||||||
of code and provide valuable insights about the inner workings of a system.
|
[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.
|
||||||
|
|
||||||
Measurements are made using instruments provided by this package. The type of
|
# Instruments
|
||||||
instrument used will depend on the type of measurement being made and of what
|
|
||||||
part of a system is being measured.
|
|
||||||
|
|
||||||
Instruments are categorized as Synchronous or Asynchronous and independently
|
Each instrument is designed to make measurements of a particular type. Broadly,
|
||||||
as Adding or Grouping. Synchronous instruments are called by the user with a
|
all instruments fall into two overlapping logical categories: asynchronous or
|
||||||
Context. Asynchronous instruments are called by the SDK during collection.
|
synchronous, and int64 or float64.
|
||||||
Additive instruments are semantically intended for capturing a sum. Grouping
|
|
||||||
instruments are intended for capturing a distribution.
|
|
||||||
|
|
||||||
Additive instruments may be monotonic, in which case they are non-decreasing
|
All synchronous instruments ([Int64Counter], [Int64UpDownCounter],
|
||||||
and naturally define a rate.
|
[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.
|
||||||
|
|
||||||
The synchronous instrument names are:
|
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.
|
||||||
|
|
||||||
Counter: additive, monotonic
|
Each instrument is also grouped by the value type it measures. Either int64 or
|
||||||
UpDownCounter: additive
|
float64. The value being measured will dictate which instrument in these
|
||||||
ValueRecorder: grouping
|
categories to use.
|
||||||
|
|
||||||
and the asynchronous instruments are:
|
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.
|
||||||
|
|
||||||
SumObserver: additive, monotonic
|
See the [OpenTelemetry documentation] for more information about instruments
|
||||||
UpDownSumObserver: additive
|
and their intended use.
|
||||||
ValueObserver: grouping
|
|
||||||
|
|
||||||
All instruments are provided with support for either float64 or int64 input
|
# Measurements
|
||||||
values.
|
|
||||||
|
|
||||||
An instrument is created using a Meter. Additionally, a Meter is used to
|
Measurements are made by recording values and information about the values with
|
||||||
record batches of synchronous measurements or asynchronous observations. A
|
an instrument. How these measurements are recorded depends on the instrument.
|
||||||
Meter is obtained using a MeterProvider. A Meter, like a Tracer, is unique to
|
|
||||||
the instrumentation it instruments and must be named and versioned when
|
|
||||||
created with a MeterProvider with the name and version of the instrumentation
|
|
||||||
library.
|
|
||||||
|
|
||||||
Instrumentation should be designed to accept a MeterProvider from which it can
|
Measurements for synchronous instruments ([Int64Counter], [Int64UpDownCounter],
|
||||||
create its own unique Meter. Alternatively, the registered global
|
[Int64Histogram], [Float64Counter], [Float64UpDownCounter], and
|
||||||
MeterProvider from the go.opentelemetry.io/otel package can be used as a
|
[Float64Histogram]) are recorded using the instrument methods directly. All
|
||||||
default.
|
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"
|
package metric // import "go.opentelemetry.io/otel/metric"
|
||||||
|
234
src/vendor/go.opentelemetry.io/otel/metric/embedded/embedded.go
generated
vendored
Normal file
234
src/vendor/go.opentelemetry.io/otel/metric/embedded/embedded.go
generated
vendored
Normal file
@ -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() }
|
49
src/vendor/go.opentelemetry.io/otel/metric/global/metric.go
generated
vendored
49
src/vendor/go.opentelemetry.io/otel/metric/global/metric.go
generated
vendored
@ -1,49 +0,0 @@
|
|||||||
// 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/metric/global"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"go.opentelemetry.io/otel/internal/metric/global"
|
|
||||||
"go.opentelemetry.io/otel/metric"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Meter creates an implementation of the Meter interface from the global
|
|
||||||
// MeterProvider. The instrumentationName 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
|
|
||||||
// instrumentationName is empty, then a implementation defined default name
|
|
||||||
// will be used instead.
|
|
||||||
//
|
|
||||||
// This is short for MeterProvider().Meter(name)
|
|
||||||
func Meter(instrumentationName string, opts ...metric.MeterOption) metric.Meter {
|
|
||||||
return GetMeterProvider().Meter(instrumentationName, opts...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetMeterProvider returns the registered global meter provider. If
|
|
||||||
// none is registered then a default meter provider is returned that
|
|
||||||
// forwards the Meter interface to the first registered Meter.
|
|
||||||
//
|
|
||||||
// Use the meter provider to create a named meter. E.g.
|
|
||||||
// meter := global.MeterProvider().Meter("example.com/foo")
|
|
||||||
// or
|
|
||||||
// meter := global.Meter("example.com/foo")
|
|
||||||
func GetMeterProvider() metric.MeterProvider {
|
|
||||||
return global.MeterProvider()
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetMeterProvider registers `mp` as the global meter provider.
|
|
||||||
func SetMeterProvider(mp metric.MeterProvider) {
|
|
||||||
global.SetMeterProvider(mp)
|
|
||||||
}
|
|
334
src/vendor/go.opentelemetry.io/otel/metric/instrument.go
generated
vendored
Normal file
334
src/vendor/go.opentelemetry.io/otel/metric/instrument.go
generated
vendored
Normal file
@ -0,0 +1,334 @@
|
|||||||
|
// 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.
|
||||||
|
//
|
||||||
|
// The unit u should be defined using the appropriate [UCUM](https://ucum.org) case-sensitive code.
|
||||||
|
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...)}
|
||||||
|
}
|
28
src/vendor/go.opentelemetry.io/otel/metric/instrumentkind_string.go
generated
vendored
28
src/vendor/go.opentelemetry.io/otel/metric/instrumentkind_string.go
generated
vendored
@ -1,28 +0,0 @@
|
|||||||
// Code generated by "stringer -type=InstrumentKind"; DO NOT EDIT.
|
|
||||||
|
|
||||||
package metric
|
|
||||||
|
|
||||||
import "strconv"
|
|
||||||
|
|
||||||
func _() {
|
|
||||||
// An "invalid array index" compiler error signifies that the constant values have changed.
|
|
||||||
// Re-run the stringer command to generate them again.
|
|
||||||
var x [1]struct{}
|
|
||||||
_ = x[ValueRecorderInstrumentKind-0]
|
|
||||||
_ = x[ValueObserverInstrumentKind-1]
|
|
||||||
_ = x[CounterInstrumentKind-2]
|
|
||||||
_ = x[UpDownCounterInstrumentKind-3]
|
|
||||||
_ = x[SumObserverInstrumentKind-4]
|
|
||||||
_ = x[UpDownSumObserverInstrumentKind-5]
|
|
||||||
}
|
|
||||||
|
|
||||||
const _InstrumentKind_name = "ValueRecorderInstrumentKindValueObserverInstrumentKindCounterInstrumentKindUpDownCounterInstrumentKindSumObserverInstrumentKindUpDownSumObserverInstrumentKind"
|
|
||||||
|
|
||||||
var _InstrumentKind_index = [...]uint8{0, 27, 54, 75, 102, 127, 158}
|
|
||||||
|
|
||||||
func (i InstrumentKind) String() string {
|
|
||||||
if i < 0 || i >= InstrumentKind(len(_InstrumentKind_index)-1) {
|
|
||||||
return "InstrumentKind(" + strconv.FormatInt(int64(i), 10) + ")"
|
|
||||||
}
|
|
||||||
return _InstrumentKind_name[_InstrumentKind_index[i]:_InstrumentKind_index[i+1]]
|
|
||||||
}
|
|
212
src/vendor/go.opentelemetry.io/otel/metric/meter.go
generated
vendored
Normal file
212
src/vendor/go.opentelemetry.io/otel/metric/meter.go
generated
vendored
Normal file
@ -0,0 +1,212 @@
|
|||||||
|
// 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.
|
||||||
|
//
|
||||||
|
// The function f needs to be concurrent safe.
|
||||||
|
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
|
||||||
|
}
|
577
src/vendor/go.opentelemetry.io/otel/metric/metric.go
generated
vendored
577
src/vendor/go.opentelemetry.io/otel/metric/metric.go
generated
vendored
@ -1,577 +0,0 @@
|
|||||||
// 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/attribute"
|
|
||||||
"go.opentelemetry.io/otel/metric/number"
|
|
||||||
"go.opentelemetry.io/otel/metric/unit"
|
|
||||||
)
|
|
||||||
|
|
||||||
// MeterProvider supports named Meter instances.
|
|
||||||
type MeterProvider interface {
|
|
||||||
// Meter creates an implementation of the Meter interface.
|
|
||||||
// The instrumentationName 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
|
|
||||||
// instrumentationName is empty, then a implementation defined default
|
|
||||||
// name will be used instead.
|
|
||||||
Meter(instrumentationName string, opts ...MeterOption) Meter
|
|
||||||
}
|
|
||||||
|
|
||||||
// Meter is the creator of metric instruments.
|
|
||||||
//
|
|
||||||
// An uninitialized Meter is a no-op implementation.
|
|
||||||
type Meter struct {
|
|
||||||
impl MeterImpl
|
|
||||||
name, version string
|
|
||||||
}
|
|
||||||
|
|
||||||
// RecordBatch atomically records a batch of measurements.
|
|
||||||
func (m Meter) RecordBatch(ctx context.Context, ls []attribute.KeyValue, ms ...Measurement) {
|
|
||||||
if m.impl == nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
m.impl.RecordBatch(ctx, ls, ms...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewBatchObserver creates a new BatchObserver that supports
|
|
||||||
// making batches of observations for multiple instruments.
|
|
||||||
func (m Meter) NewBatchObserver(callback BatchObserverFunc) BatchObserver {
|
|
||||||
return BatchObserver{
|
|
||||||
meter: m,
|
|
||||||
runner: newBatchAsyncRunner(callback),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewInt64Counter creates a new integer Counter instrument with the
|
|
||||||
// given name, customized with options. May return an error if the
|
|
||||||
// name is invalid (e.g., empty) or improperly registered (e.g.,
|
|
||||||
// duplicate registration).
|
|
||||||
func (m Meter) NewInt64Counter(name string, options ...InstrumentOption) (Int64Counter, error) {
|
|
||||||
return wrapInt64CounterInstrument(
|
|
||||||
m.newSync(name, CounterInstrumentKind, number.Int64Kind, options))
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewFloat64Counter creates a new floating point Counter with the
|
|
||||||
// given name, customized with options. May return an error if the
|
|
||||||
// name is invalid (e.g., empty) or improperly registered (e.g.,
|
|
||||||
// duplicate registration).
|
|
||||||
func (m Meter) NewFloat64Counter(name string, options ...InstrumentOption) (Float64Counter, error) {
|
|
||||||
return wrapFloat64CounterInstrument(
|
|
||||||
m.newSync(name, CounterInstrumentKind, number.Float64Kind, options))
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewInt64UpDownCounter creates a new integer UpDownCounter instrument with the
|
|
||||||
// given name, customized with options. May return an error if the
|
|
||||||
// name is invalid (e.g., empty) or improperly registered (e.g.,
|
|
||||||
// duplicate registration).
|
|
||||||
func (m Meter) NewInt64UpDownCounter(name string, options ...InstrumentOption) (Int64UpDownCounter, error) {
|
|
||||||
return wrapInt64UpDownCounterInstrument(
|
|
||||||
m.newSync(name, UpDownCounterInstrumentKind, number.Int64Kind, options))
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewFloat64UpDownCounter creates a new floating point UpDownCounter with the
|
|
||||||
// given name, customized with options. May return an error if the
|
|
||||||
// name is invalid (e.g., empty) or improperly registered (e.g.,
|
|
||||||
// duplicate registration).
|
|
||||||
func (m Meter) NewFloat64UpDownCounter(name string, options ...InstrumentOption) (Float64UpDownCounter, error) {
|
|
||||||
return wrapFloat64UpDownCounterInstrument(
|
|
||||||
m.newSync(name, UpDownCounterInstrumentKind, number.Float64Kind, options))
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewInt64ValueRecorder creates a new integer ValueRecorder instrument with the
|
|
||||||
// given name, customized with options. May return an error if the
|
|
||||||
// name is invalid (e.g., empty) or improperly registered (e.g.,
|
|
||||||
// duplicate registration).
|
|
||||||
func (m Meter) NewInt64ValueRecorder(name string, opts ...InstrumentOption) (Int64ValueRecorder, error) {
|
|
||||||
return wrapInt64ValueRecorderInstrument(
|
|
||||||
m.newSync(name, ValueRecorderInstrumentKind, number.Int64Kind, opts))
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewFloat64ValueRecorder creates a new floating point ValueRecorder with the
|
|
||||||
// given name, customized with options. May return an error if the
|
|
||||||
// name is invalid (e.g., empty) or improperly registered (e.g.,
|
|
||||||
// duplicate registration).
|
|
||||||
func (m Meter) NewFloat64ValueRecorder(name string, opts ...InstrumentOption) (Float64ValueRecorder, error) {
|
|
||||||
return wrapFloat64ValueRecorderInstrument(
|
|
||||||
m.newSync(name, ValueRecorderInstrumentKind, number.Float64Kind, opts))
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewInt64ValueObserver creates a new integer ValueObserver instrument
|
|
||||||
// with the given name, running a given callback, and customized with
|
|
||||||
// options. May return an error if the name is invalid (e.g., empty)
|
|
||||||
// or improperly registered (e.g., duplicate registration).
|
|
||||||
func (m Meter) NewInt64ValueObserver(name string, callback Int64ObserverFunc, opts ...InstrumentOption) (Int64ValueObserver, error) {
|
|
||||||
if callback == nil {
|
|
||||||
return wrapInt64ValueObserverInstrument(NoopAsync{}, nil)
|
|
||||||
}
|
|
||||||
return wrapInt64ValueObserverInstrument(
|
|
||||||
m.newAsync(name, ValueObserverInstrumentKind, number.Int64Kind, opts,
|
|
||||||
newInt64AsyncRunner(callback)))
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewFloat64ValueObserver creates a new floating point ValueObserver with
|
|
||||||
// the given name, running a given callback, and customized with
|
|
||||||
// options. May return an error if the name is invalid (e.g., empty)
|
|
||||||
// or improperly registered (e.g., duplicate registration).
|
|
||||||
func (m Meter) NewFloat64ValueObserver(name string, callback Float64ObserverFunc, opts ...InstrumentOption) (Float64ValueObserver, error) {
|
|
||||||
if callback == nil {
|
|
||||||
return wrapFloat64ValueObserverInstrument(NoopAsync{}, nil)
|
|
||||||
}
|
|
||||||
return wrapFloat64ValueObserverInstrument(
|
|
||||||
m.newAsync(name, ValueObserverInstrumentKind, number.Float64Kind, opts,
|
|
||||||
newFloat64AsyncRunner(callback)))
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewInt64SumObserver creates a new integer SumObserver instrument
|
|
||||||
// with the given name, running a given callback, and customized with
|
|
||||||
// options. May return an error if the name is invalid (e.g., empty)
|
|
||||||
// or improperly registered (e.g., duplicate registration).
|
|
||||||
func (m Meter) NewInt64SumObserver(name string, callback Int64ObserverFunc, opts ...InstrumentOption) (Int64SumObserver, error) {
|
|
||||||
if callback == nil {
|
|
||||||
return wrapInt64SumObserverInstrument(NoopAsync{}, nil)
|
|
||||||
}
|
|
||||||
return wrapInt64SumObserverInstrument(
|
|
||||||
m.newAsync(name, SumObserverInstrumentKind, number.Int64Kind, opts,
|
|
||||||
newInt64AsyncRunner(callback)))
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewFloat64SumObserver creates a new floating point SumObserver with
|
|
||||||
// the given name, running a given callback, and customized with
|
|
||||||
// options. May return an error if the name is invalid (e.g., empty)
|
|
||||||
// or improperly registered (e.g., duplicate registration).
|
|
||||||
func (m Meter) NewFloat64SumObserver(name string, callback Float64ObserverFunc, opts ...InstrumentOption) (Float64SumObserver, error) {
|
|
||||||
if callback == nil {
|
|
||||||
return wrapFloat64SumObserverInstrument(NoopAsync{}, nil)
|
|
||||||
}
|
|
||||||
return wrapFloat64SumObserverInstrument(
|
|
||||||
m.newAsync(name, SumObserverInstrumentKind, number.Float64Kind, opts,
|
|
||||||
newFloat64AsyncRunner(callback)))
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewInt64UpDownSumObserver creates a new integer UpDownSumObserver instrument
|
|
||||||
// with the given name, running a given callback, and customized with
|
|
||||||
// options. May return an error if the name is invalid (e.g., empty)
|
|
||||||
// or improperly registered (e.g., duplicate registration).
|
|
||||||
func (m Meter) NewInt64UpDownSumObserver(name string, callback Int64ObserverFunc, opts ...InstrumentOption) (Int64UpDownSumObserver, error) {
|
|
||||||
if callback == nil {
|
|
||||||
return wrapInt64UpDownSumObserverInstrument(NoopAsync{}, nil)
|
|
||||||
}
|
|
||||||
return wrapInt64UpDownSumObserverInstrument(
|
|
||||||
m.newAsync(name, UpDownSumObserverInstrumentKind, number.Int64Kind, opts,
|
|
||||||
newInt64AsyncRunner(callback)))
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewFloat64UpDownSumObserver creates a new floating point UpDownSumObserver with
|
|
||||||
// the given name, running a given callback, and customized with
|
|
||||||
// options. May return an error if the name is invalid (e.g., empty)
|
|
||||||
// or improperly registered (e.g., duplicate registration).
|
|
||||||
func (m Meter) NewFloat64UpDownSumObserver(name string, callback Float64ObserverFunc, opts ...InstrumentOption) (Float64UpDownSumObserver, error) {
|
|
||||||
if callback == nil {
|
|
||||||
return wrapFloat64UpDownSumObserverInstrument(NoopAsync{}, nil)
|
|
||||||
}
|
|
||||||
return wrapFloat64UpDownSumObserverInstrument(
|
|
||||||
m.newAsync(name, UpDownSumObserverInstrumentKind, number.Float64Kind, opts,
|
|
||||||
newFloat64AsyncRunner(callback)))
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewInt64ValueObserver creates a new integer ValueObserver instrument
|
|
||||||
// with the given name, running in a batch callback, and customized with
|
|
||||||
// options. May return an error if the name is invalid (e.g., empty)
|
|
||||||
// or improperly registered (e.g., duplicate registration).
|
|
||||||
func (b BatchObserver) NewInt64ValueObserver(name string, opts ...InstrumentOption) (Int64ValueObserver, error) {
|
|
||||||
if b.runner == nil {
|
|
||||||
return wrapInt64ValueObserverInstrument(NoopAsync{}, nil)
|
|
||||||
}
|
|
||||||
return wrapInt64ValueObserverInstrument(
|
|
||||||
b.meter.newAsync(name, ValueObserverInstrumentKind, number.Int64Kind, opts, b.runner))
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewFloat64ValueObserver creates a new floating point ValueObserver with
|
|
||||||
// the given name, running in a batch callback, and customized with
|
|
||||||
// options. May return an error if the name is invalid (e.g., empty)
|
|
||||||
// or improperly registered (e.g., duplicate registration).
|
|
||||||
func (b BatchObserver) NewFloat64ValueObserver(name string, opts ...InstrumentOption) (Float64ValueObserver, error) {
|
|
||||||
if b.runner == nil {
|
|
||||||
return wrapFloat64ValueObserverInstrument(NoopAsync{}, nil)
|
|
||||||
}
|
|
||||||
return wrapFloat64ValueObserverInstrument(
|
|
||||||
b.meter.newAsync(name, ValueObserverInstrumentKind, number.Float64Kind, opts,
|
|
||||||
b.runner))
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewInt64SumObserver creates a new integer SumObserver instrument
|
|
||||||
// with the given name, running in a batch callback, and customized with
|
|
||||||
// options. May return an error if the name is invalid (e.g., empty)
|
|
||||||
// or improperly registered (e.g., duplicate registration).
|
|
||||||
func (b BatchObserver) NewInt64SumObserver(name string, opts ...InstrumentOption) (Int64SumObserver, error) {
|
|
||||||
if b.runner == nil {
|
|
||||||
return wrapInt64SumObserverInstrument(NoopAsync{}, nil)
|
|
||||||
}
|
|
||||||
return wrapInt64SumObserverInstrument(
|
|
||||||
b.meter.newAsync(name, SumObserverInstrumentKind, number.Int64Kind, opts, b.runner))
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewFloat64SumObserver creates a new floating point SumObserver with
|
|
||||||
// the given name, running in a batch callback, and customized with
|
|
||||||
// options. May return an error if the name is invalid (e.g., empty)
|
|
||||||
// or improperly registered (e.g., duplicate registration).
|
|
||||||
func (b BatchObserver) NewFloat64SumObserver(name string, opts ...InstrumentOption) (Float64SumObserver, error) {
|
|
||||||
if b.runner == nil {
|
|
||||||
return wrapFloat64SumObserverInstrument(NoopAsync{}, nil)
|
|
||||||
}
|
|
||||||
return wrapFloat64SumObserverInstrument(
|
|
||||||
b.meter.newAsync(name, SumObserverInstrumentKind, number.Float64Kind, opts,
|
|
||||||
b.runner))
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewInt64UpDownSumObserver creates a new integer UpDownSumObserver instrument
|
|
||||||
// with the given name, running in a batch callback, and customized with
|
|
||||||
// options. May return an error if the name is invalid (e.g., empty)
|
|
||||||
// or improperly registered (e.g., duplicate registration).
|
|
||||||
func (b BatchObserver) NewInt64UpDownSumObserver(name string, opts ...InstrumentOption) (Int64UpDownSumObserver, error) {
|
|
||||||
if b.runner == nil {
|
|
||||||
return wrapInt64UpDownSumObserverInstrument(NoopAsync{}, nil)
|
|
||||||
}
|
|
||||||
return wrapInt64UpDownSumObserverInstrument(
|
|
||||||
b.meter.newAsync(name, UpDownSumObserverInstrumentKind, number.Int64Kind, opts, b.runner))
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewFloat64UpDownSumObserver creates a new floating point UpDownSumObserver with
|
|
||||||
// the given name, running in a batch callback, and customized with
|
|
||||||
// options. May return an error if the name is invalid (e.g., empty)
|
|
||||||
// or improperly registered (e.g., duplicate registration).
|
|
||||||
func (b BatchObserver) NewFloat64UpDownSumObserver(name string, opts ...InstrumentOption) (Float64UpDownSumObserver, error) {
|
|
||||||
if b.runner == nil {
|
|
||||||
return wrapFloat64UpDownSumObserverInstrument(NoopAsync{}, nil)
|
|
||||||
}
|
|
||||||
return wrapFloat64UpDownSumObserverInstrument(
|
|
||||||
b.meter.newAsync(name, UpDownSumObserverInstrumentKind, number.Float64Kind, opts,
|
|
||||||
b.runner))
|
|
||||||
}
|
|
||||||
|
|
||||||
// MeterImpl returns the underlying MeterImpl of this Meter.
|
|
||||||
func (m Meter) MeterImpl() MeterImpl {
|
|
||||||
return m.impl
|
|
||||||
}
|
|
||||||
|
|
||||||
// newAsync constructs one new asynchronous instrument.
|
|
||||||
func (m Meter) newAsync(
|
|
||||||
name string,
|
|
||||||
mkind InstrumentKind,
|
|
||||||
nkind number.Kind,
|
|
||||||
opts []InstrumentOption,
|
|
||||||
runner AsyncRunner,
|
|
||||||
) (
|
|
||||||
AsyncImpl,
|
|
||||||
error,
|
|
||||||
) {
|
|
||||||
if m.impl == nil {
|
|
||||||
return NoopAsync{}, nil
|
|
||||||
}
|
|
||||||
desc := NewDescriptor(name, mkind, nkind, opts...)
|
|
||||||
desc.config.instrumentationName = m.name
|
|
||||||
desc.config.instrumentationVersion = m.version
|
|
||||||
return m.impl.NewAsyncInstrument(desc, runner)
|
|
||||||
}
|
|
||||||
|
|
||||||
// newSync constructs one new synchronous instrument.
|
|
||||||
func (m Meter) newSync(
|
|
||||||
name string,
|
|
||||||
metricKind InstrumentKind,
|
|
||||||
numberKind number.Kind,
|
|
||||||
opts []InstrumentOption,
|
|
||||||
) (
|
|
||||||
SyncImpl,
|
|
||||||
error,
|
|
||||||
) {
|
|
||||||
if m.impl == nil {
|
|
||||||
return NoopSync{}, nil
|
|
||||||
}
|
|
||||||
desc := NewDescriptor(name, metricKind, numberKind, opts...)
|
|
||||||
desc.config.instrumentationName = m.name
|
|
||||||
desc.config.instrumentationVersion = m.version
|
|
||||||
return m.impl.NewSyncInstrument(desc)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MeterMust is a wrapper for Meter interfaces that panics when any
|
|
||||||
// instrument constructor encounters an error.
|
|
||||||
type MeterMust struct {
|
|
||||||
meter Meter
|
|
||||||
}
|
|
||||||
|
|
||||||
// BatchObserverMust is a wrapper for BatchObserver that panics when
|
|
||||||
// any instrument constructor encounters an error.
|
|
||||||
type BatchObserverMust struct {
|
|
||||||
batch BatchObserver
|
|
||||||
}
|
|
||||||
|
|
||||||
// Must constructs a MeterMust implementation from a Meter, allowing
|
|
||||||
// the application to panic when any instrument constructor yields an
|
|
||||||
// error.
|
|
||||||
func Must(meter Meter) MeterMust {
|
|
||||||
return MeterMust{meter: meter}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewInt64Counter calls `Meter.NewInt64Counter` and returns the
|
|
||||||
// instrument, panicking if it encounters an error.
|
|
||||||
func (mm MeterMust) NewInt64Counter(name string, cos ...InstrumentOption) Int64Counter {
|
|
||||||
if inst, err := mm.meter.NewInt64Counter(name, cos...); err != nil {
|
|
||||||
panic(err)
|
|
||||||
} else {
|
|
||||||
return inst
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewFloat64Counter calls `Meter.NewFloat64Counter` and returns the
|
|
||||||
// instrument, panicking if it encounters an error.
|
|
||||||
func (mm MeterMust) NewFloat64Counter(name string, cos ...InstrumentOption) Float64Counter {
|
|
||||||
if inst, err := mm.meter.NewFloat64Counter(name, cos...); err != nil {
|
|
||||||
panic(err)
|
|
||||||
} else {
|
|
||||||
return inst
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewInt64UpDownCounter calls `Meter.NewInt64UpDownCounter` and returns the
|
|
||||||
// instrument, panicking if it encounters an error.
|
|
||||||
func (mm MeterMust) NewInt64UpDownCounter(name string, cos ...InstrumentOption) Int64UpDownCounter {
|
|
||||||
if inst, err := mm.meter.NewInt64UpDownCounter(name, cos...); err != nil {
|
|
||||||
panic(err)
|
|
||||||
} else {
|
|
||||||
return inst
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewFloat64UpDownCounter calls `Meter.NewFloat64UpDownCounter` and returns the
|
|
||||||
// instrument, panicking if it encounters an error.
|
|
||||||
func (mm MeterMust) NewFloat64UpDownCounter(name string, cos ...InstrumentOption) Float64UpDownCounter {
|
|
||||||
if inst, err := mm.meter.NewFloat64UpDownCounter(name, cos...); err != nil {
|
|
||||||
panic(err)
|
|
||||||
} else {
|
|
||||||
return inst
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewInt64ValueRecorder calls `Meter.NewInt64ValueRecorder` and returns the
|
|
||||||
// instrument, panicking if it encounters an error.
|
|
||||||
func (mm MeterMust) NewInt64ValueRecorder(name string, mos ...InstrumentOption) Int64ValueRecorder {
|
|
||||||
if inst, err := mm.meter.NewInt64ValueRecorder(name, mos...); err != nil {
|
|
||||||
panic(err)
|
|
||||||
} else {
|
|
||||||
return inst
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewFloat64ValueRecorder calls `Meter.NewFloat64ValueRecorder` and returns the
|
|
||||||
// instrument, panicking if it encounters an error.
|
|
||||||
func (mm MeterMust) NewFloat64ValueRecorder(name string, mos ...InstrumentOption) Float64ValueRecorder {
|
|
||||||
if inst, err := mm.meter.NewFloat64ValueRecorder(name, mos...); err != nil {
|
|
||||||
panic(err)
|
|
||||||
} else {
|
|
||||||
return inst
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewInt64ValueObserver calls `Meter.NewInt64ValueObserver` and
|
|
||||||
// returns the instrument, panicking if it encounters an error.
|
|
||||||
func (mm MeterMust) NewInt64ValueObserver(name string, callback Int64ObserverFunc, oos ...InstrumentOption) Int64ValueObserver {
|
|
||||||
if inst, err := mm.meter.NewInt64ValueObserver(name, callback, oos...); err != nil {
|
|
||||||
panic(err)
|
|
||||||
} else {
|
|
||||||
return inst
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewFloat64ValueObserver calls `Meter.NewFloat64ValueObserver` and
|
|
||||||
// returns the instrument, panicking if it encounters an error.
|
|
||||||
func (mm MeterMust) NewFloat64ValueObserver(name string, callback Float64ObserverFunc, oos ...InstrumentOption) Float64ValueObserver {
|
|
||||||
if inst, err := mm.meter.NewFloat64ValueObserver(name, callback, oos...); err != nil {
|
|
||||||
panic(err)
|
|
||||||
} else {
|
|
||||||
return inst
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewInt64SumObserver calls `Meter.NewInt64SumObserver` and
|
|
||||||
// returns the instrument, panicking if it encounters an error.
|
|
||||||
func (mm MeterMust) NewInt64SumObserver(name string, callback Int64ObserverFunc, oos ...InstrumentOption) Int64SumObserver {
|
|
||||||
if inst, err := mm.meter.NewInt64SumObserver(name, callback, oos...); err != nil {
|
|
||||||
panic(err)
|
|
||||||
} else {
|
|
||||||
return inst
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewFloat64SumObserver calls `Meter.NewFloat64SumObserver` and
|
|
||||||
// returns the instrument, panicking if it encounters an error.
|
|
||||||
func (mm MeterMust) NewFloat64SumObserver(name string, callback Float64ObserverFunc, oos ...InstrumentOption) Float64SumObserver {
|
|
||||||
if inst, err := mm.meter.NewFloat64SumObserver(name, callback, oos...); err != nil {
|
|
||||||
panic(err)
|
|
||||||
} else {
|
|
||||||
return inst
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewInt64UpDownSumObserver calls `Meter.NewInt64UpDownSumObserver` and
|
|
||||||
// returns the instrument, panicking if it encounters an error.
|
|
||||||
func (mm MeterMust) NewInt64UpDownSumObserver(name string, callback Int64ObserverFunc, oos ...InstrumentOption) Int64UpDownSumObserver {
|
|
||||||
if inst, err := mm.meter.NewInt64UpDownSumObserver(name, callback, oos...); err != nil {
|
|
||||||
panic(err)
|
|
||||||
} else {
|
|
||||||
return inst
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewFloat64UpDownSumObserver calls `Meter.NewFloat64UpDownSumObserver` and
|
|
||||||
// returns the instrument, panicking if it encounters an error.
|
|
||||||
func (mm MeterMust) NewFloat64UpDownSumObserver(name string, callback Float64ObserverFunc, oos ...InstrumentOption) Float64UpDownSumObserver {
|
|
||||||
if inst, err := mm.meter.NewFloat64UpDownSumObserver(name, callback, oos...); err != nil {
|
|
||||||
panic(err)
|
|
||||||
} else {
|
|
||||||
return inst
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewBatchObserver returns a wrapper around BatchObserver that panics
|
|
||||||
// when any instrument constructor returns an error.
|
|
||||||
func (mm MeterMust) NewBatchObserver(callback BatchObserverFunc) BatchObserverMust {
|
|
||||||
return BatchObserverMust{
|
|
||||||
batch: mm.meter.NewBatchObserver(callback),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewInt64ValueObserver calls `BatchObserver.NewInt64ValueObserver` and
|
|
||||||
// returns the instrument, panicking if it encounters an error.
|
|
||||||
func (bm BatchObserverMust) NewInt64ValueObserver(name string, oos ...InstrumentOption) Int64ValueObserver {
|
|
||||||
if inst, err := bm.batch.NewInt64ValueObserver(name, oos...); err != nil {
|
|
||||||
panic(err)
|
|
||||||
} else {
|
|
||||||
return inst
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewFloat64ValueObserver calls `BatchObserver.NewFloat64ValueObserver` and
|
|
||||||
// returns the instrument, panicking if it encounters an error.
|
|
||||||
func (bm BatchObserverMust) NewFloat64ValueObserver(name string, oos ...InstrumentOption) Float64ValueObserver {
|
|
||||||
if inst, err := bm.batch.NewFloat64ValueObserver(name, oos...); err != nil {
|
|
||||||
panic(err)
|
|
||||||
} else {
|
|
||||||
return inst
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewInt64SumObserver calls `BatchObserver.NewInt64SumObserver` and
|
|
||||||
// returns the instrument, panicking if it encounters an error.
|
|
||||||
func (bm BatchObserverMust) NewInt64SumObserver(name string, oos ...InstrumentOption) Int64SumObserver {
|
|
||||||
if inst, err := bm.batch.NewInt64SumObserver(name, oos...); err != nil {
|
|
||||||
panic(err)
|
|
||||||
} else {
|
|
||||||
return inst
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewFloat64SumObserver calls `BatchObserver.NewFloat64SumObserver` and
|
|
||||||
// returns the instrument, panicking if it encounters an error.
|
|
||||||
func (bm BatchObserverMust) NewFloat64SumObserver(name string, oos ...InstrumentOption) Float64SumObserver {
|
|
||||||
if inst, err := bm.batch.NewFloat64SumObserver(name, oos...); err != nil {
|
|
||||||
panic(err)
|
|
||||||
} else {
|
|
||||||
return inst
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewInt64UpDownSumObserver calls `BatchObserver.NewInt64UpDownSumObserver` and
|
|
||||||
// returns the instrument, panicking if it encounters an error.
|
|
||||||
func (bm BatchObserverMust) NewInt64UpDownSumObserver(name string, oos ...InstrumentOption) Int64UpDownSumObserver {
|
|
||||||
if inst, err := bm.batch.NewInt64UpDownSumObserver(name, oos...); err != nil {
|
|
||||||
panic(err)
|
|
||||||
} else {
|
|
||||||
return inst
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewFloat64UpDownSumObserver calls `BatchObserver.NewFloat64UpDownSumObserver` and
|
|
||||||
// returns the instrument, panicking if it encounters an error.
|
|
||||||
func (bm BatchObserverMust) NewFloat64UpDownSumObserver(name string, oos ...InstrumentOption) Float64UpDownSumObserver {
|
|
||||||
if inst, err := bm.batch.NewFloat64UpDownSumObserver(name, oos...); err != nil {
|
|
||||||
panic(err)
|
|
||||||
} else {
|
|
||||||
return inst
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Descriptor contains all the settings that describe an instrument,
|
|
||||||
// including its name, metric kind, number kind, and the configurable
|
|
||||||
// options.
|
|
||||||
type Descriptor struct {
|
|
||||||
name string
|
|
||||||
instrumentKind InstrumentKind
|
|
||||||
numberKind number.Kind
|
|
||||||
config InstrumentConfig
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewDescriptor returns a Descriptor with the given contents.
|
|
||||||
func NewDescriptor(name string, ikind InstrumentKind, nkind number.Kind, opts ...InstrumentOption) Descriptor {
|
|
||||||
return Descriptor{
|
|
||||||
name: name,
|
|
||||||
instrumentKind: ikind,
|
|
||||||
numberKind: nkind,
|
|
||||||
config: NewInstrumentConfig(opts...),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Name returns the metric instrument's name.
|
|
||||||
func (d Descriptor) Name() string {
|
|
||||||
return d.name
|
|
||||||
}
|
|
||||||
|
|
||||||
// InstrumentKind returns the specific kind of instrument.
|
|
||||||
func (d Descriptor) InstrumentKind() InstrumentKind {
|
|
||||||
return d.instrumentKind
|
|
||||||
}
|
|
||||||
|
|
||||||
// Description provides a human-readable description of the metric
|
|
||||||
// instrument.
|
|
||||||
func (d Descriptor) Description() string {
|
|
||||||
return d.config.Description()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unit describes the units of the metric instrument. Unitless
|
|
||||||
// metrics return the empty string.
|
|
||||||
func (d Descriptor) Unit() unit.Unit {
|
|
||||||
return d.config.Unit()
|
|
||||||
}
|
|
||||||
|
|
||||||
// NumberKind returns whether this instrument is declared over int64,
|
|
||||||
// float64, or uint64 values.
|
|
||||||
func (d Descriptor) NumberKind() number.Kind {
|
|
||||||
return d.numberKind
|
|
||||||
}
|
|
||||||
|
|
||||||
// InstrumentationName returns the name of the library that provided
|
|
||||||
// instrumentation for this instrument.
|
|
||||||
func (d Descriptor) InstrumentationName() string {
|
|
||||||
return d.config.InstrumentationName()
|
|
||||||
}
|
|
||||||
|
|
||||||
// InstrumentationVersion returns the version of the library that provided
|
|
||||||
// instrumentation for this instrument.
|
|
||||||
func (d Descriptor) InstrumentationVersion() string {
|
|
||||||
return d.config.InstrumentationVersion()
|
|
||||||
}
|
|
777
src/vendor/go.opentelemetry.io/otel/metric/metric_instrument.go
generated
vendored
777
src/vendor/go.opentelemetry.io/otel/metric/metric_instrument.go
generated
vendored
@ -1,777 +0,0 @@
|
|||||||
// 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.
|
|
||||||
|
|
||||||
//go:generate stringer -type=InstrumentKind
|
|
||||||
|
|
||||||
package metric // import "go.opentelemetry.io/otel/metric"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"errors"
|
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/attribute"
|
|
||||||
"go.opentelemetry.io/otel/metric/number"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ErrSDKReturnedNilImpl is returned when a new `MeterImpl` returns nil.
|
|
||||||
var ErrSDKReturnedNilImpl = errors.New("SDK returned a nil implementation")
|
|
||||||
|
|
||||||
// InstrumentKind describes the kind of instrument.
|
|
||||||
type InstrumentKind int8
|
|
||||||
|
|
||||||
const (
|
|
||||||
// ValueRecorderInstrumentKind indicates a ValueRecorder instrument.
|
|
||||||
ValueRecorderInstrumentKind InstrumentKind = iota
|
|
||||||
// ValueObserverInstrumentKind indicates an ValueObserver instrument.
|
|
||||||
ValueObserverInstrumentKind
|
|
||||||
|
|
||||||
// CounterInstrumentKind indicates a Counter instrument.
|
|
||||||
CounterInstrumentKind
|
|
||||||
// UpDownCounterInstrumentKind indicates a UpDownCounter instrument.
|
|
||||||
UpDownCounterInstrumentKind
|
|
||||||
|
|
||||||
// SumObserverInstrumentKind indicates a SumObserver instrument.
|
|
||||||
SumObserverInstrumentKind
|
|
||||||
// UpDownSumObserverInstrumentKind indicates a UpDownSumObserver
|
|
||||||
// instrument.
|
|
||||||
UpDownSumObserverInstrumentKind
|
|
||||||
)
|
|
||||||
|
|
||||||
// Synchronous returns whether this is a synchronous kind of instrument.
|
|
||||||
func (k InstrumentKind) Synchronous() bool {
|
|
||||||
switch k {
|
|
||||||
case CounterInstrumentKind, UpDownCounterInstrumentKind, ValueRecorderInstrumentKind:
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// Asynchronous returns whether this is an asynchronous kind of instrument.
|
|
||||||
func (k InstrumentKind) Asynchronous() bool {
|
|
||||||
return !k.Synchronous()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Adding returns whether this kind of instrument adds its inputs (as opposed to Grouping).
|
|
||||||
func (k InstrumentKind) Adding() bool {
|
|
||||||
switch k {
|
|
||||||
case CounterInstrumentKind, UpDownCounterInstrumentKind, SumObserverInstrumentKind, UpDownSumObserverInstrumentKind:
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// Grouping returns whether this kind of instrument groups its inputs (as opposed to Adding).
|
|
||||||
func (k InstrumentKind) Grouping() bool {
|
|
||||||
return !k.Adding()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Monotonic returns whether this kind of instrument exposes a non-decreasing sum.
|
|
||||||
func (k InstrumentKind) Monotonic() bool {
|
|
||||||
switch k {
|
|
||||||
case CounterInstrumentKind, SumObserverInstrumentKind:
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// PrecomputedSum returns whether this kind of instrument receives precomputed sums.
|
|
||||||
func (k InstrumentKind) PrecomputedSum() bool {
|
|
||||||
return k.Adding() && k.Asynchronous()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Observation is used for reporting an asynchronous batch of metric
|
|
||||||
// values. Instances of this type should be created by asynchronous
|
|
||||||
// instruments (e.g., Int64ValueObserver.Observation()).
|
|
||||||
type Observation struct {
|
|
||||||
// number needs to be aligned for 64-bit atomic operations.
|
|
||||||
number number.Number
|
|
||||||
instrument AsyncImpl
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int64ObserverFunc is a type of callback that integral
|
|
||||||
// observers run.
|
|
||||||
type Int64ObserverFunc func(context.Context, Int64ObserverResult)
|
|
||||||
|
|
||||||
// Float64ObserverFunc is a type of callback that floating point
|
|
||||||
// observers run.
|
|
||||||
type Float64ObserverFunc func(context.Context, Float64ObserverResult)
|
|
||||||
|
|
||||||
// BatchObserverFunc is a callback argument for use with any
|
|
||||||
// Observer instrument that will be reported as a batch of
|
|
||||||
// observations.
|
|
||||||
type BatchObserverFunc func(context.Context, BatchObserverResult)
|
|
||||||
|
|
||||||
// Int64ObserverResult is passed to an observer callback to capture
|
|
||||||
// observations for one asynchronous integer metric instrument.
|
|
||||||
type Int64ObserverResult struct {
|
|
||||||
instrument AsyncImpl
|
|
||||||
function func([]attribute.KeyValue, ...Observation)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Float64ObserverResult is passed to an observer callback to capture
|
|
||||||
// observations for one asynchronous floating point metric instrument.
|
|
||||||
type Float64ObserverResult struct {
|
|
||||||
instrument AsyncImpl
|
|
||||||
function func([]attribute.KeyValue, ...Observation)
|
|
||||||
}
|
|
||||||
|
|
||||||
// BatchObserverResult is passed to a batch observer callback to
|
|
||||||
// capture observations for multiple asynchronous instruments.
|
|
||||||
type BatchObserverResult struct {
|
|
||||||
function func([]attribute.KeyValue, ...Observation)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Observe captures a single integer value from the associated
|
|
||||||
// instrument callback, with the given labels.
|
|
||||||
func (ir Int64ObserverResult) Observe(value int64, labels ...attribute.KeyValue) {
|
|
||||||
ir.function(labels, Observation{
|
|
||||||
instrument: ir.instrument,
|
|
||||||
number: number.NewInt64Number(value),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// Observe captures a single floating point value from the associated
|
|
||||||
// instrument callback, with the given labels.
|
|
||||||
func (fr Float64ObserverResult) Observe(value float64, labels ...attribute.KeyValue) {
|
|
||||||
fr.function(labels, Observation{
|
|
||||||
instrument: fr.instrument,
|
|
||||||
number: number.NewFloat64Number(value),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// Observe captures a multiple observations from the associated batch
|
|
||||||
// instrument callback, with the given labels.
|
|
||||||
func (br BatchObserverResult) Observe(labels []attribute.KeyValue, obs ...Observation) {
|
|
||||||
br.function(labels, obs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// AsyncRunner is expected to convert into an AsyncSingleRunner or an
|
|
||||||
// AsyncBatchRunner. SDKs will encounter an error if the AsyncRunner
|
|
||||||
// does not satisfy one of these interfaces.
|
|
||||||
type AsyncRunner interface {
|
|
||||||
// AnyRunner() is a non-exported method with no functional use
|
|
||||||
// other than to make this a non-empty interface.
|
|
||||||
AnyRunner()
|
|
||||||
}
|
|
||||||
|
|
||||||
// AsyncSingleRunner is an interface implemented by single-observer
|
|
||||||
// callbacks.
|
|
||||||
type AsyncSingleRunner interface {
|
|
||||||
// Run accepts a single instrument and function for capturing
|
|
||||||
// observations of that instrument. Each call to the function
|
|
||||||
// receives one captured observation. (The function accepts
|
|
||||||
// multiple observations so the same implementation can be
|
|
||||||
// used for batch runners.)
|
|
||||||
Run(ctx context.Context, single AsyncImpl, capture func([]attribute.KeyValue, ...Observation))
|
|
||||||
|
|
||||||
AsyncRunner
|
|
||||||
}
|
|
||||||
|
|
||||||
// AsyncBatchRunner is an interface implemented by batch-observer
|
|
||||||
// callbacks.
|
|
||||||
type AsyncBatchRunner interface {
|
|
||||||
// Run accepts a function for capturing observations of
|
|
||||||
// multiple instruments.
|
|
||||||
Run(ctx context.Context, capture func([]attribute.KeyValue, ...Observation))
|
|
||||||
|
|
||||||
AsyncRunner
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ AsyncSingleRunner = (*Int64ObserverFunc)(nil)
|
|
||||||
var _ AsyncSingleRunner = (*Float64ObserverFunc)(nil)
|
|
||||||
var _ AsyncBatchRunner = (*BatchObserverFunc)(nil)
|
|
||||||
|
|
||||||
// newInt64AsyncRunner returns a single-observer callback for integer Observer instruments.
|
|
||||||
func newInt64AsyncRunner(c Int64ObserverFunc) AsyncSingleRunner {
|
|
||||||
return &c
|
|
||||||
}
|
|
||||||
|
|
||||||
// newFloat64AsyncRunner returns a single-observer callback for floating point Observer instruments.
|
|
||||||
func newFloat64AsyncRunner(c Float64ObserverFunc) AsyncSingleRunner {
|
|
||||||
return &c
|
|
||||||
}
|
|
||||||
|
|
||||||
// newBatchAsyncRunner returns a batch-observer callback use with multiple Observer instruments.
|
|
||||||
func newBatchAsyncRunner(c BatchObserverFunc) AsyncBatchRunner {
|
|
||||||
return &c
|
|
||||||
}
|
|
||||||
|
|
||||||
// AnyRunner implements AsyncRunner.
|
|
||||||
func (*Int64ObserverFunc) AnyRunner() {}
|
|
||||||
|
|
||||||
// AnyRunner implements AsyncRunner.
|
|
||||||
func (*Float64ObserverFunc) AnyRunner() {}
|
|
||||||
|
|
||||||
// AnyRunner implements AsyncRunner.
|
|
||||||
func (*BatchObserverFunc) AnyRunner() {}
|
|
||||||
|
|
||||||
// Run implements AsyncSingleRunner.
|
|
||||||
func (i *Int64ObserverFunc) Run(ctx context.Context, impl AsyncImpl, function func([]attribute.KeyValue, ...Observation)) {
|
|
||||||
(*i)(ctx, Int64ObserverResult{
|
|
||||||
instrument: impl,
|
|
||||||
function: function,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// Run implements AsyncSingleRunner.
|
|
||||||
func (f *Float64ObserverFunc) Run(ctx context.Context, impl AsyncImpl, function func([]attribute.KeyValue, ...Observation)) {
|
|
||||||
(*f)(ctx, Float64ObserverResult{
|
|
||||||
instrument: impl,
|
|
||||||
function: function,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// Run implements AsyncBatchRunner.
|
|
||||||
func (b *BatchObserverFunc) Run(ctx context.Context, function func([]attribute.KeyValue, ...Observation)) {
|
|
||||||
(*b)(ctx, BatchObserverResult{
|
|
||||||
function: function,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// wrapInt64ValueObserverInstrument converts an AsyncImpl into Int64ValueObserver.
|
|
||||||
func wrapInt64ValueObserverInstrument(asyncInst AsyncImpl, err error) (Int64ValueObserver, error) {
|
|
||||||
common, err := checkNewAsync(asyncInst, err)
|
|
||||||
return Int64ValueObserver{asyncInstrument: common}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// wrapFloat64ValueObserverInstrument converts an AsyncImpl into Float64ValueObserver.
|
|
||||||
func wrapFloat64ValueObserverInstrument(asyncInst AsyncImpl, err error) (Float64ValueObserver, error) {
|
|
||||||
common, err := checkNewAsync(asyncInst, err)
|
|
||||||
return Float64ValueObserver{asyncInstrument: common}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// wrapInt64SumObserverInstrument converts an AsyncImpl into Int64SumObserver.
|
|
||||||
func wrapInt64SumObserverInstrument(asyncInst AsyncImpl, err error) (Int64SumObserver, error) {
|
|
||||||
common, err := checkNewAsync(asyncInst, err)
|
|
||||||
return Int64SumObserver{asyncInstrument: common}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// wrapFloat64SumObserverInstrument converts an AsyncImpl into Float64SumObserver.
|
|
||||||
func wrapFloat64SumObserverInstrument(asyncInst AsyncImpl, err error) (Float64SumObserver, error) {
|
|
||||||
common, err := checkNewAsync(asyncInst, err)
|
|
||||||
return Float64SumObserver{asyncInstrument: common}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// wrapInt64UpDownSumObserverInstrument converts an AsyncImpl into Int64UpDownSumObserver.
|
|
||||||
func wrapInt64UpDownSumObserverInstrument(asyncInst AsyncImpl, err error) (Int64UpDownSumObserver, error) {
|
|
||||||
common, err := checkNewAsync(asyncInst, err)
|
|
||||||
return Int64UpDownSumObserver{asyncInstrument: common}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// wrapFloat64UpDownSumObserverInstrument converts an AsyncImpl into Float64UpDownSumObserver.
|
|
||||||
func wrapFloat64UpDownSumObserverInstrument(asyncInst AsyncImpl, err error) (Float64UpDownSumObserver, error) {
|
|
||||||
common, err := checkNewAsync(asyncInst, err)
|
|
||||||
return Float64UpDownSumObserver{asyncInstrument: common}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// BatchObserver represents an Observer callback that can report
|
|
||||||
// observations for multiple instruments.
|
|
||||||
type BatchObserver struct {
|
|
||||||
meter Meter
|
|
||||||
runner AsyncBatchRunner
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int64ValueObserver is a metric that captures a set of int64 values at a
|
|
||||||
// point in time.
|
|
||||||
type Int64ValueObserver struct {
|
|
||||||
asyncInstrument
|
|
||||||
}
|
|
||||||
|
|
||||||
// Float64ValueObserver is a metric that captures a set of float64 values
|
|
||||||
// at a point in time.
|
|
||||||
type Float64ValueObserver struct {
|
|
||||||
asyncInstrument
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int64SumObserver is a metric that captures a precomputed sum of
|
|
||||||
// int64 values at a point in time.
|
|
||||||
type Int64SumObserver struct {
|
|
||||||
asyncInstrument
|
|
||||||
}
|
|
||||||
|
|
||||||
// Float64SumObserver is a metric that captures a precomputed sum of
|
|
||||||
// float64 values at a point in time.
|
|
||||||
type Float64SumObserver struct {
|
|
||||||
asyncInstrument
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int64UpDownSumObserver is a metric that captures a precomputed sum of
|
|
||||||
// int64 values at a point in time.
|
|
||||||
type Int64UpDownSumObserver struct {
|
|
||||||
asyncInstrument
|
|
||||||
}
|
|
||||||
|
|
||||||
// Float64UpDownSumObserver is a metric that captures a precomputed sum of
|
|
||||||
// float64 values at a point in time.
|
|
||||||
type Float64UpDownSumObserver struct {
|
|
||||||
asyncInstrument
|
|
||||||
}
|
|
||||||
|
|
||||||
// Observation returns an Observation, a BatchObserverFunc
|
|
||||||
// argument, for an asynchronous integer instrument.
|
|
||||||
// This returns an implementation-level object for use by the SDK,
|
|
||||||
// users should not refer to this.
|
|
||||||
func (i Int64ValueObserver) Observation(v int64) Observation {
|
|
||||||
return Observation{
|
|
||||||
number: number.NewInt64Number(v),
|
|
||||||
instrument: i.instrument,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Observation returns an Observation, a BatchObserverFunc
|
|
||||||
// argument, for an asynchronous integer instrument.
|
|
||||||
// This returns an implementation-level object for use by the SDK,
|
|
||||||
// users should not refer to this.
|
|
||||||
func (f Float64ValueObserver) Observation(v float64) Observation {
|
|
||||||
return Observation{
|
|
||||||
number: number.NewFloat64Number(v),
|
|
||||||
instrument: f.instrument,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Observation returns an Observation, a BatchObserverFunc
|
|
||||||
// argument, for an asynchronous integer instrument.
|
|
||||||
// This returns an implementation-level object for use by the SDK,
|
|
||||||
// users should not refer to this.
|
|
||||||
func (i Int64SumObserver) Observation(v int64) Observation {
|
|
||||||
return Observation{
|
|
||||||
number: number.NewInt64Number(v),
|
|
||||||
instrument: i.instrument,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Observation returns an Observation, a BatchObserverFunc
|
|
||||||
// argument, for an asynchronous integer instrument.
|
|
||||||
// This returns an implementation-level object for use by the SDK,
|
|
||||||
// users should not refer to this.
|
|
||||||
func (f Float64SumObserver) Observation(v float64) Observation {
|
|
||||||
return Observation{
|
|
||||||
number: number.NewFloat64Number(v),
|
|
||||||
instrument: f.instrument,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Observation returns an Observation, a BatchObserverFunc
|
|
||||||
// argument, for an asynchronous integer instrument.
|
|
||||||
// This returns an implementation-level object for use by the SDK,
|
|
||||||
// users should not refer to this.
|
|
||||||
func (i Int64UpDownSumObserver) Observation(v int64) Observation {
|
|
||||||
return Observation{
|
|
||||||
number: number.NewInt64Number(v),
|
|
||||||
instrument: i.instrument,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Observation returns an Observation, a BatchObserverFunc
|
|
||||||
// argument, for an asynchronous integer instrument.
|
|
||||||
// This returns an implementation-level object for use by the SDK,
|
|
||||||
// users should not refer to this.
|
|
||||||
func (f Float64UpDownSumObserver) Observation(v float64) Observation {
|
|
||||||
return Observation{
|
|
||||||
number: number.NewFloat64Number(v),
|
|
||||||
instrument: f.instrument,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Measurement is used for reporting a synchronous batch of metric
|
|
||||||
// values. Instances of this type should be created by synchronous
|
|
||||||
// instruments (e.g., Int64Counter.Measurement()).
|
|
||||||
type Measurement struct {
|
|
||||||
// number needs to be aligned for 64-bit atomic operations.
|
|
||||||
number number.Number
|
|
||||||
instrument SyncImpl
|
|
||||||
}
|
|
||||||
|
|
||||||
// syncInstrument contains a SyncImpl.
|
|
||||||
type syncInstrument struct {
|
|
||||||
instrument SyncImpl
|
|
||||||
}
|
|
||||||
|
|
||||||
// syncBoundInstrument contains a BoundSyncImpl.
|
|
||||||
type syncBoundInstrument struct {
|
|
||||||
boundInstrument BoundSyncImpl
|
|
||||||
}
|
|
||||||
|
|
||||||
// asyncInstrument contains a AsyncImpl.
|
|
||||||
type asyncInstrument struct {
|
|
||||||
instrument AsyncImpl
|
|
||||||
}
|
|
||||||
|
|
||||||
// SyncImpl returns the instrument that created this measurement.
|
|
||||||
// This returns an implementation-level object for use by the SDK,
|
|
||||||
// users should not refer to this.
|
|
||||||
func (m Measurement) SyncImpl() SyncImpl {
|
|
||||||
return m.instrument
|
|
||||||
}
|
|
||||||
|
|
||||||
// Number returns a number recorded in this measurement.
|
|
||||||
func (m Measurement) Number() number.Number {
|
|
||||||
return m.number
|
|
||||||
}
|
|
||||||
|
|
||||||
// AsyncImpl returns the instrument that created this observation.
|
|
||||||
// This returns an implementation-level object for use by the SDK,
|
|
||||||
// users should not refer to this.
|
|
||||||
func (m Observation) AsyncImpl() AsyncImpl {
|
|
||||||
return m.instrument
|
|
||||||
}
|
|
||||||
|
|
||||||
// Number returns a number recorded in this observation.
|
|
||||||
func (m Observation) Number() number.Number {
|
|
||||||
return m.number
|
|
||||||
}
|
|
||||||
|
|
||||||
// AsyncImpl implements AsyncImpl.
|
|
||||||
func (a asyncInstrument) AsyncImpl() AsyncImpl {
|
|
||||||
return a.instrument
|
|
||||||
}
|
|
||||||
|
|
||||||
// SyncImpl returns the implementation object for synchronous instruments.
|
|
||||||
func (s syncInstrument) SyncImpl() SyncImpl {
|
|
||||||
return s.instrument
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s syncInstrument) bind(labels []attribute.KeyValue) syncBoundInstrument {
|
|
||||||
return newSyncBoundInstrument(s.instrument.Bind(labels))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s syncInstrument) float64Measurement(value float64) Measurement {
|
|
||||||
return newMeasurement(s.instrument, number.NewFloat64Number(value))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s syncInstrument) int64Measurement(value int64) Measurement {
|
|
||||||
return newMeasurement(s.instrument, number.NewInt64Number(value))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s syncInstrument) directRecord(ctx context.Context, number number.Number, labels []attribute.KeyValue) {
|
|
||||||
s.instrument.RecordOne(ctx, number, labels)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (h syncBoundInstrument) directRecord(ctx context.Context, number number.Number) {
|
|
||||||
h.boundInstrument.RecordOne(ctx, number)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unbind calls SyncImpl.Unbind.
|
|
||||||
func (h syncBoundInstrument) Unbind() {
|
|
||||||
h.boundInstrument.Unbind()
|
|
||||||
}
|
|
||||||
|
|
||||||
// checkNewAsync receives an AsyncImpl and potential
|
|
||||||
// error, and returns the same types, checking for and ensuring that
|
|
||||||
// the returned interface is not nil.
|
|
||||||
func checkNewAsync(instrument AsyncImpl, err error) (asyncInstrument, error) {
|
|
||||||
if instrument == nil {
|
|
||||||
if err == nil {
|
|
||||||
err = ErrSDKReturnedNilImpl
|
|
||||||
}
|
|
||||||
instrument = NoopAsync{}
|
|
||||||
}
|
|
||||||
return asyncInstrument{
|
|
||||||
instrument: instrument,
|
|
||||||
}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// checkNewSync receives an SyncImpl and potential
|
|
||||||
// error, and returns the same types, checking for and ensuring that
|
|
||||||
// the returned interface is not nil.
|
|
||||||
func checkNewSync(instrument SyncImpl, err error) (syncInstrument, error) {
|
|
||||||
if instrument == nil {
|
|
||||||
if err == nil {
|
|
||||||
err = ErrSDKReturnedNilImpl
|
|
||||||
}
|
|
||||||
// Note: an alternate behavior would be to synthesize a new name
|
|
||||||
// or group all duplicately-named instruments of a certain type
|
|
||||||
// together and use a tag for the original name, e.g.,
|
|
||||||
// name = 'invalid.counter.int64'
|
|
||||||
// label = 'original-name=duplicate-counter-name'
|
|
||||||
instrument = NoopSync{}
|
|
||||||
}
|
|
||||||
return syncInstrument{
|
|
||||||
instrument: instrument,
|
|
||||||
}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func newSyncBoundInstrument(boundInstrument BoundSyncImpl) syncBoundInstrument {
|
|
||||||
return syncBoundInstrument{
|
|
||||||
boundInstrument: boundInstrument,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func newMeasurement(instrument SyncImpl, number number.Number) Measurement {
|
|
||||||
return Measurement{
|
|
||||||
instrument: instrument,
|
|
||||||
number: number,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// wrapInt64CounterInstrument converts a SyncImpl into Int64Counter.
|
|
||||||
func wrapInt64CounterInstrument(syncInst SyncImpl, err error) (Int64Counter, error) {
|
|
||||||
common, err := checkNewSync(syncInst, err)
|
|
||||||
return Int64Counter{syncInstrument: common}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// wrapFloat64CounterInstrument converts a SyncImpl into Float64Counter.
|
|
||||||
func wrapFloat64CounterInstrument(syncInst SyncImpl, err error) (Float64Counter, error) {
|
|
||||||
common, err := checkNewSync(syncInst, err)
|
|
||||||
return Float64Counter{syncInstrument: common}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// wrapInt64UpDownCounterInstrument converts a SyncImpl into Int64UpDownCounter.
|
|
||||||
func wrapInt64UpDownCounterInstrument(syncInst SyncImpl, err error) (Int64UpDownCounter, error) {
|
|
||||||
common, err := checkNewSync(syncInst, err)
|
|
||||||
return Int64UpDownCounter{syncInstrument: common}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// wrapFloat64UpDownCounterInstrument converts a SyncImpl into Float64UpDownCounter.
|
|
||||||
func wrapFloat64UpDownCounterInstrument(syncInst SyncImpl, err error) (Float64UpDownCounter, error) {
|
|
||||||
common, err := checkNewSync(syncInst, err)
|
|
||||||
return Float64UpDownCounter{syncInstrument: common}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// wrapInt64ValueRecorderInstrument converts a SyncImpl into Int64ValueRecorder.
|
|
||||||
func wrapInt64ValueRecorderInstrument(syncInst SyncImpl, err error) (Int64ValueRecorder, error) {
|
|
||||||
common, err := checkNewSync(syncInst, err)
|
|
||||||
return Int64ValueRecorder{syncInstrument: common}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// wrapFloat64ValueRecorderInstrument converts a SyncImpl into Float64ValueRecorder.
|
|
||||||
func wrapFloat64ValueRecorderInstrument(syncInst SyncImpl, err error) (Float64ValueRecorder, error) {
|
|
||||||
common, err := checkNewSync(syncInst, err)
|
|
||||||
return Float64ValueRecorder{syncInstrument: common}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Float64Counter is a metric that accumulates float64 values.
|
|
||||||
type Float64Counter struct {
|
|
||||||
syncInstrument
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int64Counter is a metric that accumulates int64 values.
|
|
||||||
type Int64Counter struct {
|
|
||||||
syncInstrument
|
|
||||||
}
|
|
||||||
|
|
||||||
// BoundFloat64Counter is a bound instrument for Float64Counter.
|
|
||||||
//
|
|
||||||
// It inherits the Unbind function from syncBoundInstrument.
|
|
||||||
type BoundFloat64Counter struct {
|
|
||||||
syncBoundInstrument
|
|
||||||
}
|
|
||||||
|
|
||||||
// BoundInt64Counter is a boundInstrument for Int64Counter.
|
|
||||||
//
|
|
||||||
// It inherits the Unbind function from syncBoundInstrument.
|
|
||||||
type BoundInt64Counter struct {
|
|
||||||
syncBoundInstrument
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bind creates a bound instrument for this counter. The labels are
|
|
||||||
// associated with values recorded via subsequent calls to Record.
|
|
||||||
func (c Float64Counter) Bind(labels ...attribute.KeyValue) (h BoundFloat64Counter) {
|
|
||||||
h.syncBoundInstrument = c.bind(labels)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bind creates a bound instrument for this counter. The labels are
|
|
||||||
// associated with values recorded via subsequent calls to Record.
|
|
||||||
func (c Int64Counter) Bind(labels ...attribute.KeyValue) (h BoundInt64Counter) {
|
|
||||||
h.syncBoundInstrument = c.bind(labels)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Measurement creates a Measurement object to use with batch
|
|
||||||
// recording.
|
|
||||||
func (c Float64Counter) Measurement(value float64) Measurement {
|
|
||||||
return c.float64Measurement(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Measurement creates a Measurement object to use with batch
|
|
||||||
// recording.
|
|
||||||
func (c Int64Counter) Measurement(value int64) Measurement {
|
|
||||||
return c.int64Measurement(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add adds the value to the counter's sum. The labels should contain
|
|
||||||
// the keys and values to be associated with this value.
|
|
||||||
func (c Float64Counter) Add(ctx context.Context, value float64, labels ...attribute.KeyValue) {
|
|
||||||
c.directRecord(ctx, number.NewFloat64Number(value), labels)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add adds the value to the counter's sum. The labels should contain
|
|
||||||
// the keys and values to be associated with this value.
|
|
||||||
func (c Int64Counter) Add(ctx context.Context, value int64, labels ...attribute.KeyValue) {
|
|
||||||
c.directRecord(ctx, number.NewInt64Number(value), labels)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add adds the value to the counter's sum using the labels
|
|
||||||
// previously bound to this counter via Bind()
|
|
||||||
func (b BoundFloat64Counter) Add(ctx context.Context, value float64) {
|
|
||||||
b.directRecord(ctx, number.NewFloat64Number(value))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add adds the value to the counter's sum using the labels
|
|
||||||
// previously bound to this counter via Bind()
|
|
||||||
func (b BoundInt64Counter) Add(ctx context.Context, value int64) {
|
|
||||||
b.directRecord(ctx, number.NewInt64Number(value))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Float64UpDownCounter is a metric instrument that sums floating
|
|
||||||
// point values.
|
|
||||||
type Float64UpDownCounter struct {
|
|
||||||
syncInstrument
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int64UpDownCounter is a metric instrument that sums integer values.
|
|
||||||
type Int64UpDownCounter struct {
|
|
||||||
syncInstrument
|
|
||||||
}
|
|
||||||
|
|
||||||
// BoundFloat64UpDownCounter is a bound instrument for Float64UpDownCounter.
|
|
||||||
//
|
|
||||||
// It inherits the Unbind function from syncBoundInstrument.
|
|
||||||
type BoundFloat64UpDownCounter struct {
|
|
||||||
syncBoundInstrument
|
|
||||||
}
|
|
||||||
|
|
||||||
// BoundInt64UpDownCounter is a boundInstrument for Int64UpDownCounter.
|
|
||||||
//
|
|
||||||
// It inherits the Unbind function from syncBoundInstrument.
|
|
||||||
type BoundInt64UpDownCounter struct {
|
|
||||||
syncBoundInstrument
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bind creates a bound instrument for this counter. The labels are
|
|
||||||
// associated with values recorded via subsequent calls to Record.
|
|
||||||
func (c Float64UpDownCounter) Bind(labels ...attribute.KeyValue) (h BoundFloat64UpDownCounter) {
|
|
||||||
h.syncBoundInstrument = c.bind(labels)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bind creates a bound instrument for this counter. The labels are
|
|
||||||
// associated with values recorded via subsequent calls to Record.
|
|
||||||
func (c Int64UpDownCounter) Bind(labels ...attribute.KeyValue) (h BoundInt64UpDownCounter) {
|
|
||||||
h.syncBoundInstrument = c.bind(labels)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Measurement creates a Measurement object to use with batch
|
|
||||||
// recording.
|
|
||||||
func (c Float64UpDownCounter) Measurement(value float64) Measurement {
|
|
||||||
return c.float64Measurement(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Measurement creates a Measurement object to use with batch
|
|
||||||
// recording.
|
|
||||||
func (c Int64UpDownCounter) Measurement(value int64) Measurement {
|
|
||||||
return c.int64Measurement(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add adds the value to the counter's sum. The labels should contain
|
|
||||||
// the keys and values to be associated with this value.
|
|
||||||
func (c Float64UpDownCounter) Add(ctx context.Context, value float64, labels ...attribute.KeyValue) {
|
|
||||||
c.directRecord(ctx, number.NewFloat64Number(value), labels)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add adds the value to the counter's sum. The labels should contain
|
|
||||||
// the keys and values to be associated with this value.
|
|
||||||
func (c Int64UpDownCounter) Add(ctx context.Context, value int64, labels ...attribute.KeyValue) {
|
|
||||||
c.directRecord(ctx, number.NewInt64Number(value), labels)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add adds the value to the counter's sum using the labels
|
|
||||||
// previously bound to this counter via Bind()
|
|
||||||
func (b BoundFloat64UpDownCounter) Add(ctx context.Context, value float64) {
|
|
||||||
b.directRecord(ctx, number.NewFloat64Number(value))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add adds the value to the counter's sum using the labels
|
|
||||||
// previously bound to this counter via Bind()
|
|
||||||
func (b BoundInt64UpDownCounter) Add(ctx context.Context, value int64) {
|
|
||||||
b.directRecord(ctx, number.NewInt64Number(value))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Float64ValueRecorder is a metric that records float64 values.
|
|
||||||
type Float64ValueRecorder struct {
|
|
||||||
syncInstrument
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int64ValueRecorder is a metric that records int64 values.
|
|
||||||
type Int64ValueRecorder struct {
|
|
||||||
syncInstrument
|
|
||||||
}
|
|
||||||
|
|
||||||
// BoundFloat64ValueRecorder is a bound instrument for Float64ValueRecorder.
|
|
||||||
//
|
|
||||||
// It inherits the Unbind function from syncBoundInstrument.
|
|
||||||
type BoundFloat64ValueRecorder struct {
|
|
||||||
syncBoundInstrument
|
|
||||||
}
|
|
||||||
|
|
||||||
// BoundInt64ValueRecorder is a bound instrument for Int64ValueRecorder.
|
|
||||||
//
|
|
||||||
// It inherits the Unbind function from syncBoundInstrument.
|
|
||||||
type BoundInt64ValueRecorder struct {
|
|
||||||
syncBoundInstrument
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bind creates a bound instrument for this ValueRecorder. The labels are
|
|
||||||
// associated with values recorded via subsequent calls to Record.
|
|
||||||
func (c Float64ValueRecorder) Bind(labels ...attribute.KeyValue) (h BoundFloat64ValueRecorder) {
|
|
||||||
h.syncBoundInstrument = c.bind(labels)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bind creates a bound instrument for this ValueRecorder. The labels are
|
|
||||||
// associated with values recorded via subsequent calls to Record.
|
|
||||||
func (c Int64ValueRecorder) Bind(labels ...attribute.KeyValue) (h BoundInt64ValueRecorder) {
|
|
||||||
h.syncBoundInstrument = c.bind(labels)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Measurement creates a Measurement object to use with batch
|
|
||||||
// recording.
|
|
||||||
func (c Float64ValueRecorder) Measurement(value float64) Measurement {
|
|
||||||
return c.float64Measurement(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Measurement creates a Measurement object to use with batch
|
|
||||||
// recording.
|
|
||||||
func (c Int64ValueRecorder) Measurement(value int64) Measurement {
|
|
||||||
return c.int64Measurement(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Record adds a new value to the list of ValueRecorder's records. The
|
|
||||||
// labels should contain the keys and values to be associated with
|
|
||||||
// this value.
|
|
||||||
func (c Float64ValueRecorder) Record(ctx context.Context, value float64, labels ...attribute.KeyValue) {
|
|
||||||
c.directRecord(ctx, number.NewFloat64Number(value), labels)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Record adds a new value to the ValueRecorder's distribution. The
|
|
||||||
// labels should contain the keys and values to be associated with
|
|
||||||
// this value.
|
|
||||||
func (c Int64ValueRecorder) Record(ctx context.Context, value int64, labels ...attribute.KeyValue) {
|
|
||||||
c.directRecord(ctx, number.NewInt64Number(value), labels)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Record adds a new value to the ValueRecorder's distribution using the labels
|
|
||||||
// previously bound to the ValueRecorder via Bind().
|
|
||||||
func (b BoundFloat64ValueRecorder) Record(ctx context.Context, value float64) {
|
|
||||||
b.directRecord(ctx, number.NewFloat64Number(value))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Record adds a new value to the ValueRecorder's distribution using the labels
|
|
||||||
// previously bound to the ValueRecorder via Bind().
|
|
||||||
func (b BoundInt64ValueRecorder) Record(ctx context.Context, value int64) {
|
|
||||||
b.directRecord(ctx, number.NewInt64Number(value))
|
|
||||||
}
|
|
59
src/vendor/go.opentelemetry.io/otel/metric/metric_noop.go
generated
vendored
59
src/vendor/go.opentelemetry.io/otel/metric/metric_noop.go
generated
vendored
@ -1,59 +0,0 @@
|
|||||||
// 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/attribute"
|
|
||||||
"go.opentelemetry.io/otel/metric/number"
|
|
||||||
)
|
|
||||||
|
|
||||||
type NoopMeterProvider struct{}
|
|
||||||
|
|
||||||
type noopInstrument struct{}
|
|
||||||
type noopBoundInstrument struct{}
|
|
||||||
type NoopSync struct{ noopInstrument }
|
|
||||||
type NoopAsync struct{ noopInstrument }
|
|
||||||
|
|
||||||
var _ MeterProvider = NoopMeterProvider{}
|
|
||||||
var _ SyncImpl = NoopSync{}
|
|
||||||
var _ BoundSyncImpl = noopBoundInstrument{}
|
|
||||||
var _ AsyncImpl = NoopAsync{}
|
|
||||||
|
|
||||||
func (NoopMeterProvider) Meter(_ string, _ ...MeterOption) Meter {
|
|
||||||
return Meter{}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (noopInstrument) Implementation() interface{} {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (noopInstrument) Descriptor() Descriptor {
|
|
||||||
return Descriptor{}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (noopBoundInstrument) RecordOne(context.Context, number.Number) {
|
|
||||||
}
|
|
||||||
|
|
||||||
func (noopBoundInstrument) Unbind() {
|
|
||||||
}
|
|
||||||
|
|
||||||
func (NoopSync) Bind([]attribute.KeyValue) BoundSyncImpl {
|
|
||||||
return noopBoundInstrument{}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (NoopSync) RecordOne(context.Context, number.Number, []attribute.KeyValue) {
|
|
||||||
}
|
|
95
src/vendor/go.opentelemetry.io/otel/metric/metric_sdkapi.go
generated
vendored
95
src/vendor/go.opentelemetry.io/otel/metric/metric_sdkapi.go
generated
vendored
@ -1,95 +0,0 @@
|
|||||||
// 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/attribute"
|
|
||||||
"go.opentelemetry.io/otel/metric/number"
|
|
||||||
)
|
|
||||||
|
|
||||||
// MeterImpl is the interface an SDK must implement to supply a Meter
|
|
||||||
// implementation.
|
|
||||||
type MeterImpl interface {
|
|
||||||
// RecordBatch atomically records a batch of measurements.
|
|
||||||
RecordBatch(ctx context.Context, labels []attribute.KeyValue, measurement ...Measurement)
|
|
||||||
|
|
||||||
// NewSyncInstrument returns a newly constructed
|
|
||||||
// synchronous instrument implementation or an error, should
|
|
||||||
// one occur.
|
|
||||||
NewSyncInstrument(descriptor Descriptor) (SyncImpl, error)
|
|
||||||
|
|
||||||
// NewAsyncInstrument returns a newly constructed
|
|
||||||
// asynchronous instrument implementation or an error, should
|
|
||||||
// one occur.
|
|
||||||
NewAsyncInstrument(
|
|
||||||
descriptor Descriptor,
|
|
||||||
runner AsyncRunner,
|
|
||||||
) (AsyncImpl, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
// InstrumentImpl is a common interface for synchronous and
|
|
||||||
// asynchronous instruments.
|
|
||||||
type InstrumentImpl interface {
|
|
||||||
// Implementation returns the underlying implementation of the
|
|
||||||
// instrument, which allows the implementation to gain access
|
|
||||||
// to its own representation especially from a `Measurement`.
|
|
||||||
Implementation() interface{}
|
|
||||||
|
|
||||||
// Descriptor returns a copy of the instrument's Descriptor.
|
|
||||||
Descriptor() Descriptor
|
|
||||||
}
|
|
||||||
|
|
||||||
// SyncImpl is the implementation-level interface to a generic
|
|
||||||
// synchronous instrument (e.g., ValueRecorder and Counter instruments).
|
|
||||||
type SyncImpl interface {
|
|
||||||
InstrumentImpl
|
|
||||||
|
|
||||||
// Bind creates an implementation-level bound instrument,
|
|
||||||
// binding a label set with this instrument implementation.
|
|
||||||
Bind(labels []attribute.KeyValue) BoundSyncImpl
|
|
||||||
|
|
||||||
// RecordOne captures a single synchronous metric event.
|
|
||||||
RecordOne(ctx context.Context, number number.Number, labels []attribute.KeyValue)
|
|
||||||
}
|
|
||||||
|
|
||||||
// BoundSyncImpl is the implementation-level interface to a
|
|
||||||
// generic bound synchronous instrument
|
|
||||||
type BoundSyncImpl interface {
|
|
||||||
|
|
||||||
// RecordOne captures a single synchronous metric event.
|
|
||||||
RecordOne(ctx context.Context, number number.Number)
|
|
||||||
|
|
||||||
// Unbind frees the resources associated with this bound instrument. It
|
|
||||||
// does not affect the metric this bound instrument was created through.
|
|
||||||
Unbind()
|
|
||||||
}
|
|
||||||
|
|
||||||
// AsyncImpl is an implementation-level interface to an
|
|
||||||
// asynchronous instrument (e.g., Observer instruments).
|
|
||||||
type AsyncImpl interface {
|
|
||||||
InstrumentImpl
|
|
||||||
}
|
|
||||||
|
|
||||||
// WrapMeterImpl constructs a `Meter` implementation from a
|
|
||||||
// `MeterImpl` implementation.
|
|
||||||
func WrapMeterImpl(impl MeterImpl, instrumentationName string, opts ...MeterOption) Meter {
|
|
||||||
return Meter{
|
|
||||||
impl: impl,
|
|
||||||
name: instrumentationName,
|
|
||||||
version: NewMeterConfig(opts...).InstrumentationVersion(),
|
|
||||||
}
|
|
||||||
}
|
|
24
src/vendor/go.opentelemetry.io/otel/metric/number/kind_string.go
generated
vendored
24
src/vendor/go.opentelemetry.io/otel/metric/number/kind_string.go
generated
vendored
@ -1,24 +0,0 @@
|
|||||||
// Code generated by "stringer -type=Kind"; DO NOT EDIT.
|
|
||||||
|
|
||||||
package number
|
|
||||||
|
|
||||||
import "strconv"
|
|
||||||
|
|
||||||
func _() {
|
|
||||||
// An "invalid array index" compiler error signifies that the constant values have changed.
|
|
||||||
// Re-run the stringer command to generate them again.
|
|
||||||
var x [1]struct{}
|
|
||||||
_ = x[Int64Kind-0]
|
|
||||||
_ = x[Float64Kind-1]
|
|
||||||
}
|
|
||||||
|
|
||||||
const _Kind_name = "Int64KindFloat64Kind"
|
|
||||||
|
|
||||||
var _Kind_index = [...]uint8{0, 9, 20}
|
|
||||||
|
|
||||||
func (i Kind) String() string {
|
|
||||||
if i < 0 || i >= Kind(len(_Kind_index)-1) {
|
|
||||||
return "Kind(" + strconv.FormatInt(int64(i), 10) + ")"
|
|
||||||
}
|
|
||||||
return _Kind_name[_Kind_index[i]:_Kind_index[i+1]]
|
|
||||||
}
|
|
538
src/vendor/go.opentelemetry.io/otel/metric/number/number.go
generated
vendored
538
src/vendor/go.opentelemetry.io/otel/metric/number/number.go
generated
vendored
@ -1,538 +0,0 @@
|
|||||||
// 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 number // import "go.opentelemetry.io/otel/metric/number"
|
|
||||||
|
|
||||||
//go:generate stringer -type=Kind
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"math"
|
|
||||||
"sync/atomic"
|
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/internal"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Kind describes the data type of the Number.
|
|
||||||
type Kind int8
|
|
||||||
|
|
||||||
const (
|
|
||||||
// Int64Kind means that the Number stores int64.
|
|
||||||
Int64Kind Kind = iota
|
|
||||||
// Float64Kind means that the Number stores float64.
|
|
||||||
Float64Kind
|
|
||||||
)
|
|
||||||
|
|
||||||
// Zero returns a zero value for a given Kind
|
|
||||||
func (k Kind) Zero() Number {
|
|
||||||
switch k {
|
|
||||||
case Int64Kind:
|
|
||||||
return NewInt64Number(0)
|
|
||||||
case Float64Kind:
|
|
||||||
return NewFloat64Number(0.)
|
|
||||||
default:
|
|
||||||
return Number(0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Minimum returns the minimum representable value
|
|
||||||
// for a given Kind
|
|
||||||
func (k Kind) Minimum() Number {
|
|
||||||
switch k {
|
|
||||||
case Int64Kind:
|
|
||||||
return NewInt64Number(math.MinInt64)
|
|
||||||
case Float64Kind:
|
|
||||||
return NewFloat64Number(-1. * math.MaxFloat64)
|
|
||||||
default:
|
|
||||||
return Number(0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Maximum returns the maximum representable value
|
|
||||||
// for a given Kind
|
|
||||||
func (k Kind) Maximum() Number {
|
|
||||||
switch k {
|
|
||||||
case Int64Kind:
|
|
||||||
return NewInt64Number(math.MaxInt64)
|
|
||||||
case Float64Kind:
|
|
||||||
return NewFloat64Number(math.MaxFloat64)
|
|
||||||
default:
|
|
||||||
return Number(0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Number represents either an integral or a floating point value. It
|
|
||||||
// needs to be accompanied with a source of Kind that describes
|
|
||||||
// the actual type of the value stored within Number.
|
|
||||||
type Number uint64
|
|
||||||
|
|
||||||
// - constructors
|
|
||||||
|
|
||||||
// NewNumberFromRaw creates a new Number from a raw value.
|
|
||||||
func NewNumberFromRaw(r uint64) Number {
|
|
||||||
return Number(r)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewInt64Number creates an integral Number.
|
|
||||||
func NewInt64Number(i int64) Number {
|
|
||||||
return NewNumberFromRaw(internal.Int64ToRaw(i))
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewFloat64Number creates a floating point Number.
|
|
||||||
func NewFloat64Number(f float64) Number {
|
|
||||||
return NewNumberFromRaw(internal.Float64ToRaw(f))
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewNumberSignChange returns a number with the same magnitude and
|
|
||||||
// the opposite sign. `kind` must describe the kind of number in `nn`.
|
|
||||||
func NewNumberSignChange(kind Kind, nn Number) Number {
|
|
||||||
switch kind {
|
|
||||||
case Int64Kind:
|
|
||||||
return NewInt64Number(-nn.AsInt64())
|
|
||||||
case Float64Kind:
|
|
||||||
return NewFloat64Number(-nn.AsFloat64())
|
|
||||||
}
|
|
||||||
return nn
|
|
||||||
}
|
|
||||||
|
|
||||||
// - as x
|
|
||||||
|
|
||||||
// AsNumber gets the Number.
|
|
||||||
func (n *Number) AsNumber() Number {
|
|
||||||
return *n
|
|
||||||
}
|
|
||||||
|
|
||||||
// AsRaw gets the uninterpreted raw value. Might be useful for some
|
|
||||||
// atomic operations.
|
|
||||||
func (n *Number) AsRaw() uint64 {
|
|
||||||
return uint64(*n)
|
|
||||||
}
|
|
||||||
|
|
||||||
// AsInt64 assumes that the value contains an int64 and returns it as
|
|
||||||
// such.
|
|
||||||
func (n *Number) AsInt64() int64 {
|
|
||||||
return internal.RawToInt64(n.AsRaw())
|
|
||||||
}
|
|
||||||
|
|
||||||
// AsFloat64 assumes that the measurement value contains a float64 and
|
|
||||||
// returns it as such.
|
|
||||||
func (n *Number) AsFloat64() float64 {
|
|
||||||
return internal.RawToFloat64(n.AsRaw())
|
|
||||||
}
|
|
||||||
|
|
||||||
// - as x atomic
|
|
||||||
|
|
||||||
// AsNumberAtomic gets the Number atomically.
|
|
||||||
func (n *Number) AsNumberAtomic() Number {
|
|
||||||
return NewNumberFromRaw(n.AsRawAtomic())
|
|
||||||
}
|
|
||||||
|
|
||||||
// AsRawAtomic gets the uninterpreted raw value atomically. Might be
|
|
||||||
// useful for some atomic operations.
|
|
||||||
func (n *Number) AsRawAtomic() uint64 {
|
|
||||||
return atomic.LoadUint64(n.AsRawPtr())
|
|
||||||
}
|
|
||||||
|
|
||||||
// AsInt64Atomic assumes that the number contains an int64 and returns
|
|
||||||
// it as such atomically.
|
|
||||||
func (n *Number) AsInt64Atomic() int64 {
|
|
||||||
return atomic.LoadInt64(n.AsInt64Ptr())
|
|
||||||
}
|
|
||||||
|
|
||||||
// AsFloat64Atomic assumes that the measurement value contains a
|
|
||||||
// float64 and returns it as such atomically.
|
|
||||||
func (n *Number) AsFloat64Atomic() float64 {
|
|
||||||
return internal.RawToFloat64(n.AsRawAtomic())
|
|
||||||
}
|
|
||||||
|
|
||||||
// - as x ptr
|
|
||||||
|
|
||||||
// AsRawPtr gets the pointer to the raw, uninterpreted raw
|
|
||||||
// value. Might be useful for some atomic operations.
|
|
||||||
func (n *Number) AsRawPtr() *uint64 {
|
|
||||||
return (*uint64)(n)
|
|
||||||
}
|
|
||||||
|
|
||||||
// AsInt64Ptr assumes that the number contains an int64 and returns a
|
|
||||||
// pointer to it.
|
|
||||||
func (n *Number) AsInt64Ptr() *int64 {
|
|
||||||
return internal.RawPtrToInt64Ptr(n.AsRawPtr())
|
|
||||||
}
|
|
||||||
|
|
||||||
// AsFloat64Ptr assumes that the number contains a float64 and returns a
|
|
||||||
// pointer to it.
|
|
||||||
func (n *Number) AsFloat64Ptr() *float64 {
|
|
||||||
return internal.RawPtrToFloat64Ptr(n.AsRawPtr())
|
|
||||||
}
|
|
||||||
|
|
||||||
// - coerce
|
|
||||||
|
|
||||||
// CoerceToInt64 casts the number to int64. May result in
|
|
||||||
// data/precision loss.
|
|
||||||
func (n *Number) CoerceToInt64(kind Kind) int64 {
|
|
||||||
switch kind {
|
|
||||||
case Int64Kind:
|
|
||||||
return n.AsInt64()
|
|
||||||
case Float64Kind:
|
|
||||||
return int64(n.AsFloat64())
|
|
||||||
default:
|
|
||||||
// you get what you deserve
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// CoerceToFloat64 casts the number to float64. May result in
|
|
||||||
// data/precision loss.
|
|
||||||
func (n *Number) CoerceToFloat64(kind Kind) float64 {
|
|
||||||
switch kind {
|
|
||||||
case Int64Kind:
|
|
||||||
return float64(n.AsInt64())
|
|
||||||
case Float64Kind:
|
|
||||||
return n.AsFloat64()
|
|
||||||
default:
|
|
||||||
// you get what you deserve
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// - set
|
|
||||||
|
|
||||||
// SetNumber sets the number to the passed number. Both should be of
|
|
||||||
// the same kind.
|
|
||||||
func (n *Number) SetNumber(nn Number) {
|
|
||||||
*n.AsRawPtr() = nn.AsRaw()
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetRaw sets the number to the passed raw value. Both number and the
|
|
||||||
// raw number should represent the same kind.
|
|
||||||
func (n *Number) SetRaw(r uint64) {
|
|
||||||
*n.AsRawPtr() = r
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetInt64 assumes that the number contains an int64 and sets it to
|
|
||||||
// the passed value.
|
|
||||||
func (n *Number) SetInt64(i int64) {
|
|
||||||
*n.AsInt64Ptr() = i
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetFloat64 assumes that the number contains a float64 and sets it
|
|
||||||
// to the passed value.
|
|
||||||
func (n *Number) SetFloat64(f float64) {
|
|
||||||
*n.AsFloat64Ptr() = f
|
|
||||||
}
|
|
||||||
|
|
||||||
// - set atomic
|
|
||||||
|
|
||||||
// SetNumberAtomic sets the number to the passed number
|
|
||||||
// atomically. Both should be of the same kind.
|
|
||||||
func (n *Number) SetNumberAtomic(nn Number) {
|
|
||||||
atomic.StoreUint64(n.AsRawPtr(), nn.AsRaw())
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetRawAtomic sets the number to the passed raw value
|
|
||||||
// atomically. Both number and the raw number should represent the
|
|
||||||
// same kind.
|
|
||||||
func (n *Number) SetRawAtomic(r uint64) {
|
|
||||||
atomic.StoreUint64(n.AsRawPtr(), r)
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetInt64Atomic assumes that the number contains an int64 and sets
|
|
||||||
// it to the passed value atomically.
|
|
||||||
func (n *Number) SetInt64Atomic(i int64) {
|
|
||||||
atomic.StoreInt64(n.AsInt64Ptr(), i)
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetFloat64Atomic assumes that the number contains a float64 and
|
|
||||||
// sets it to the passed value atomically.
|
|
||||||
func (n *Number) SetFloat64Atomic(f float64) {
|
|
||||||
atomic.StoreUint64(n.AsRawPtr(), internal.Float64ToRaw(f))
|
|
||||||
}
|
|
||||||
|
|
||||||
// - swap
|
|
||||||
|
|
||||||
// SwapNumber sets the number to the passed number and returns the old
|
|
||||||
// number. Both this number and the passed number should be of the
|
|
||||||
// same kind.
|
|
||||||
func (n *Number) SwapNumber(nn Number) Number {
|
|
||||||
old := *n
|
|
||||||
n.SetNumber(nn)
|
|
||||||
return old
|
|
||||||
}
|
|
||||||
|
|
||||||
// SwapRaw sets the number to the passed raw value and returns the old
|
|
||||||
// raw value. Both number and the raw number should represent the same
|
|
||||||
// kind.
|
|
||||||
func (n *Number) SwapRaw(r uint64) uint64 {
|
|
||||||
old := n.AsRaw()
|
|
||||||
n.SetRaw(r)
|
|
||||||
return old
|
|
||||||
}
|
|
||||||
|
|
||||||
// SwapInt64 assumes that the number contains an int64, sets it to the
|
|
||||||
// passed value and returns the old int64 value.
|
|
||||||
func (n *Number) SwapInt64(i int64) int64 {
|
|
||||||
old := n.AsInt64()
|
|
||||||
n.SetInt64(i)
|
|
||||||
return old
|
|
||||||
}
|
|
||||||
|
|
||||||
// SwapFloat64 assumes that the number contains an float64, sets it to
|
|
||||||
// the passed value and returns the old float64 value.
|
|
||||||
func (n *Number) SwapFloat64(f float64) float64 {
|
|
||||||
old := n.AsFloat64()
|
|
||||||
n.SetFloat64(f)
|
|
||||||
return old
|
|
||||||
}
|
|
||||||
|
|
||||||
// - swap atomic
|
|
||||||
|
|
||||||
// SwapNumberAtomic sets the number to the passed number and returns
|
|
||||||
// the old number atomically. Both this number and the passed number
|
|
||||||
// should be of the same kind.
|
|
||||||
func (n *Number) SwapNumberAtomic(nn Number) Number {
|
|
||||||
return NewNumberFromRaw(atomic.SwapUint64(n.AsRawPtr(), nn.AsRaw()))
|
|
||||||
}
|
|
||||||
|
|
||||||
// SwapRawAtomic sets the number to the passed raw value and returns
|
|
||||||
// the old raw value atomically. Both number and the raw number should
|
|
||||||
// represent the same kind.
|
|
||||||
func (n *Number) SwapRawAtomic(r uint64) uint64 {
|
|
||||||
return atomic.SwapUint64(n.AsRawPtr(), r)
|
|
||||||
}
|
|
||||||
|
|
||||||
// SwapInt64Atomic assumes that the number contains an int64, sets it
|
|
||||||
// to the passed value and returns the old int64 value atomically.
|
|
||||||
func (n *Number) SwapInt64Atomic(i int64) int64 {
|
|
||||||
return atomic.SwapInt64(n.AsInt64Ptr(), i)
|
|
||||||
}
|
|
||||||
|
|
||||||
// SwapFloat64Atomic assumes that the number contains an float64, sets
|
|
||||||
// it to the passed value and returns the old float64 value
|
|
||||||
// atomically.
|
|
||||||
func (n *Number) SwapFloat64Atomic(f float64) float64 {
|
|
||||||
return internal.RawToFloat64(atomic.SwapUint64(n.AsRawPtr(), internal.Float64ToRaw(f)))
|
|
||||||
}
|
|
||||||
|
|
||||||
// - add
|
|
||||||
|
|
||||||
// AddNumber assumes that this and the passed number are of the passed
|
|
||||||
// kind and adds the passed number to this number.
|
|
||||||
func (n *Number) AddNumber(kind Kind, nn Number) {
|
|
||||||
switch kind {
|
|
||||||
case Int64Kind:
|
|
||||||
n.AddInt64(nn.AsInt64())
|
|
||||||
case Float64Kind:
|
|
||||||
n.AddFloat64(nn.AsFloat64())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddRaw assumes that this number and the passed raw value are of the
|
|
||||||
// passed kind and adds the passed raw value to this number.
|
|
||||||
func (n *Number) AddRaw(kind Kind, r uint64) {
|
|
||||||
n.AddNumber(kind, NewNumberFromRaw(r))
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddInt64 assumes that the number contains an int64 and adds the
|
|
||||||
// passed int64 to it.
|
|
||||||
func (n *Number) AddInt64(i int64) {
|
|
||||||
*n.AsInt64Ptr() += i
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddFloat64 assumes that the number contains a float64 and adds the
|
|
||||||
// passed float64 to it.
|
|
||||||
func (n *Number) AddFloat64(f float64) {
|
|
||||||
*n.AsFloat64Ptr() += f
|
|
||||||
}
|
|
||||||
|
|
||||||
// - add atomic
|
|
||||||
|
|
||||||
// AddNumberAtomic assumes that this and the passed number are of the
|
|
||||||
// passed kind and adds the passed number to this number atomically.
|
|
||||||
func (n *Number) AddNumberAtomic(kind Kind, nn Number) {
|
|
||||||
switch kind {
|
|
||||||
case Int64Kind:
|
|
||||||
n.AddInt64Atomic(nn.AsInt64())
|
|
||||||
case Float64Kind:
|
|
||||||
n.AddFloat64Atomic(nn.AsFloat64())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddRawAtomic assumes that this number and the passed raw value are
|
|
||||||
// of the passed kind and adds the passed raw value to this number
|
|
||||||
// atomically.
|
|
||||||
func (n *Number) AddRawAtomic(kind Kind, r uint64) {
|
|
||||||
n.AddNumberAtomic(kind, NewNumberFromRaw(r))
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddInt64Atomic assumes that the number contains an int64 and adds
|
|
||||||
// the passed int64 to it atomically.
|
|
||||||
func (n *Number) AddInt64Atomic(i int64) {
|
|
||||||
atomic.AddInt64(n.AsInt64Ptr(), i)
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddFloat64Atomic assumes that the number contains a float64 and
|
|
||||||
// adds the passed float64 to it atomically.
|
|
||||||
func (n *Number) AddFloat64Atomic(f float64) {
|
|
||||||
for {
|
|
||||||
o := n.AsFloat64Atomic()
|
|
||||||
if n.CompareAndSwapFloat64(o, o+f) {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// - compare and swap (atomic only)
|
|
||||||
|
|
||||||
// CompareAndSwapNumber does the atomic CAS operation on this
|
|
||||||
// number. This number and passed old and new numbers should be of the
|
|
||||||
// same kind.
|
|
||||||
func (n *Number) CompareAndSwapNumber(on, nn Number) bool {
|
|
||||||
return atomic.CompareAndSwapUint64(n.AsRawPtr(), on.AsRaw(), nn.AsRaw())
|
|
||||||
}
|
|
||||||
|
|
||||||
// CompareAndSwapRaw does the atomic CAS operation on this
|
|
||||||
// number. This number and passed old and new raw values should be of
|
|
||||||
// the same kind.
|
|
||||||
func (n *Number) CompareAndSwapRaw(or, nr uint64) bool {
|
|
||||||
return atomic.CompareAndSwapUint64(n.AsRawPtr(), or, nr)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CompareAndSwapInt64 assumes that this number contains an int64 and
|
|
||||||
// does the atomic CAS operation on it.
|
|
||||||
func (n *Number) CompareAndSwapInt64(oi, ni int64) bool {
|
|
||||||
return atomic.CompareAndSwapInt64(n.AsInt64Ptr(), oi, ni)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CompareAndSwapFloat64 assumes that this number contains a float64 and
|
|
||||||
// does the atomic CAS operation on it.
|
|
||||||
func (n *Number) CompareAndSwapFloat64(of, nf float64) bool {
|
|
||||||
return atomic.CompareAndSwapUint64(n.AsRawPtr(), internal.Float64ToRaw(of), internal.Float64ToRaw(nf))
|
|
||||||
}
|
|
||||||
|
|
||||||
// - compare
|
|
||||||
|
|
||||||
// CompareNumber compares two Numbers given their kind. Both numbers
|
|
||||||
// should have the same kind. This returns:
|
|
||||||
// 0 if the numbers are equal
|
|
||||||
// -1 if the subject `n` is less than the argument `nn`
|
|
||||||
// +1 if the subject `n` is greater than the argument `nn`
|
|
||||||
func (n *Number) CompareNumber(kind Kind, nn Number) int {
|
|
||||||
switch kind {
|
|
||||||
case Int64Kind:
|
|
||||||
return n.CompareInt64(nn.AsInt64())
|
|
||||||
case Float64Kind:
|
|
||||||
return n.CompareFloat64(nn.AsFloat64())
|
|
||||||
default:
|
|
||||||
// you get what you deserve
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// CompareRaw compares two numbers, where one is input as a raw
|
|
||||||
// uint64, interpreting both values as a `kind` of number.
|
|
||||||
func (n *Number) CompareRaw(kind Kind, r uint64) int {
|
|
||||||
return n.CompareNumber(kind, NewNumberFromRaw(r))
|
|
||||||
}
|
|
||||||
|
|
||||||
// CompareInt64 assumes that the Number contains an int64 and performs
|
|
||||||
// a comparison between the value and the other value. It returns the
|
|
||||||
// typical result of the compare function: -1 if the value is less
|
|
||||||
// than the other, 0 if both are equal, 1 if the value is greater than
|
|
||||||
// the other.
|
|
||||||
func (n *Number) CompareInt64(i int64) int {
|
|
||||||
this := n.AsInt64()
|
|
||||||
if this < i {
|
|
||||||
return -1
|
|
||||||
} else if this > i {
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// CompareFloat64 assumes that the Number contains a float64 and
|
|
||||||
// performs a comparison between the value and the other value. It
|
|
||||||
// returns the typical result of the compare function: -1 if the value
|
|
||||||
// is less than the other, 0 if both are equal, 1 if the value is
|
|
||||||
// greater than the other.
|
|
||||||
//
|
|
||||||
// Do not compare NaN values.
|
|
||||||
func (n *Number) CompareFloat64(f float64) int {
|
|
||||||
this := n.AsFloat64()
|
|
||||||
if this < f {
|
|
||||||
return -1
|
|
||||||
} else if this > f {
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// - relations to zero
|
|
||||||
|
|
||||||
// IsPositive returns true if the actual value is greater than zero.
|
|
||||||
func (n *Number) IsPositive(kind Kind) bool {
|
|
||||||
return n.compareWithZero(kind) > 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsNegative returns true if the actual value is less than zero.
|
|
||||||
func (n *Number) IsNegative(kind Kind) bool {
|
|
||||||
return n.compareWithZero(kind) < 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsZero returns true if the actual value is equal to zero.
|
|
||||||
func (n *Number) IsZero(kind Kind) bool {
|
|
||||||
return n.compareWithZero(kind) == 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// - misc
|
|
||||||
|
|
||||||
// Emit returns a string representation of the raw value of the
|
|
||||||
// Number. A %d is used for integral values, %f for floating point
|
|
||||||
// values.
|
|
||||||
func (n *Number) Emit(kind Kind) string {
|
|
||||||
switch kind {
|
|
||||||
case Int64Kind:
|
|
||||||
return fmt.Sprintf("%d", n.AsInt64())
|
|
||||||
case Float64Kind:
|
|
||||||
return fmt.Sprintf("%f", n.AsFloat64())
|
|
||||||
default:
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// AsInterface returns the number as an interface{}, typically used
|
|
||||||
// for Kind-correct JSON conversion.
|
|
||||||
func (n *Number) AsInterface(kind Kind) interface{} {
|
|
||||||
switch kind {
|
|
||||||
case Int64Kind:
|
|
||||||
return n.AsInt64()
|
|
||||||
case Float64Kind:
|
|
||||||
return n.AsFloat64()
|
|
||||||
default:
|
|
||||||
return math.NaN()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// - private stuff
|
|
||||||
|
|
||||||
func (n *Number) compareWithZero(kind Kind) int {
|
|
||||||
switch kind {
|
|
||||||
case Int64Kind:
|
|
||||||
return n.CompareInt64(0)
|
|
||||||
case Float64Kind:
|
|
||||||
return n.CompareFloat64(0.)
|
|
||||||
default:
|
|
||||||
// you get what you deserve
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
}
|
|
170
src/vendor/go.opentelemetry.io/otel/metric/registry/registry.go
generated
vendored
170
src/vendor/go.opentelemetry.io/otel/metric/registry/registry.go
generated
vendored
@ -1,170 +0,0 @@
|
|||||||
// 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 registry // import "go.opentelemetry.io/otel/metric/registry"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"sync"
|
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/attribute"
|
|
||||||
"go.opentelemetry.io/otel/metric"
|
|
||||||
)
|
|
||||||
|
|
||||||
// MeterProvider is a standard MeterProvider for wrapping `MeterImpl`
|
|
||||||
type MeterProvider struct {
|
|
||||||
impl metric.MeterImpl
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ metric.MeterProvider = (*MeterProvider)(nil)
|
|
||||||
|
|
||||||
// uniqueInstrumentMeterImpl implements the metric.MeterImpl interface, adding
|
|
||||||
// uniqueness checking for instrument descriptors. Use NewUniqueInstrumentMeter
|
|
||||||
// to wrap an implementation with uniqueness checking.
|
|
||||||
type uniqueInstrumentMeterImpl struct {
|
|
||||||
lock sync.Mutex
|
|
||||||
impl metric.MeterImpl
|
|
||||||
state map[key]metric.InstrumentImpl
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ metric.MeterImpl = (*uniqueInstrumentMeterImpl)(nil)
|
|
||||||
|
|
||||||
type key struct {
|
|
||||||
instrumentName string
|
|
||||||
instrumentationName string
|
|
||||||
InstrumentationVersion string
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewMeterProvider returns a new provider that implements instrument
|
|
||||||
// name-uniqueness checking.
|
|
||||||
func NewMeterProvider(impl metric.MeterImpl) *MeterProvider {
|
|
||||||
return &MeterProvider{
|
|
||||||
impl: NewUniqueInstrumentMeterImpl(impl),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Meter implements MeterProvider.
|
|
||||||
func (p *MeterProvider) Meter(instrumentationName string, opts ...metric.MeterOption) metric.Meter {
|
|
||||||
return metric.WrapMeterImpl(p.impl, instrumentationName, opts...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ErrMetricKindMismatch is the standard error for mismatched metric
|
|
||||||
// instrument definitions.
|
|
||||||
var ErrMetricKindMismatch = fmt.Errorf(
|
|
||||||
"a metric was already registered by this name with another kind or number type")
|
|
||||||
|
|
||||||
// NewUniqueInstrumentMeterImpl returns a wrapped metric.MeterImpl with
|
|
||||||
// the addition of uniqueness checking.
|
|
||||||
func NewUniqueInstrumentMeterImpl(impl metric.MeterImpl) metric.MeterImpl {
|
|
||||||
return &uniqueInstrumentMeterImpl{
|
|
||||||
impl: impl,
|
|
||||||
state: map[key]metric.InstrumentImpl{},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// RecordBatch implements metric.MeterImpl.
|
|
||||||
func (u *uniqueInstrumentMeterImpl) RecordBatch(ctx context.Context, labels []attribute.KeyValue, ms ...metric.Measurement) {
|
|
||||||
u.impl.RecordBatch(ctx, labels, ms...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func keyOf(descriptor metric.Descriptor) key {
|
|
||||||
return key{
|
|
||||||
descriptor.Name(),
|
|
||||||
descriptor.InstrumentationName(),
|
|
||||||
descriptor.InstrumentationVersion(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewMetricKindMismatchError formats an error that describes a
|
|
||||||
// mismatched metric instrument definition.
|
|
||||||
func NewMetricKindMismatchError(desc metric.Descriptor) error {
|
|
||||||
return fmt.Errorf("metric was %s (%s %s)registered as a %s %s: %w",
|
|
||||||
desc.Name(),
|
|
||||||
desc.InstrumentationName(),
|
|
||||||
desc.InstrumentationVersion(),
|
|
||||||
desc.NumberKind(),
|
|
||||||
desc.InstrumentKind(),
|
|
||||||
ErrMetricKindMismatch)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compatible determines whether two metric.Descriptors are considered
|
|
||||||
// the same for the purpose of uniqueness checking.
|
|
||||||
func Compatible(candidate, existing metric.Descriptor) bool {
|
|
||||||
return candidate.InstrumentKind() == existing.InstrumentKind() &&
|
|
||||||
candidate.NumberKind() == existing.NumberKind()
|
|
||||||
}
|
|
||||||
|
|
||||||
// checkUniqueness returns an ErrMetricKindMismatch error if there is
|
|
||||||
// a conflict between a descriptor that was already registered and the
|
|
||||||
// `descriptor` argument. If there is an existing compatible
|
|
||||||
// registration, this returns the already-registered instrument. If
|
|
||||||
// there is no conflict and no prior registration, returns (nil, nil).
|
|
||||||
func (u *uniqueInstrumentMeterImpl) checkUniqueness(descriptor metric.Descriptor) (metric.InstrumentImpl, error) {
|
|
||||||
impl, ok := u.state[keyOf(descriptor)]
|
|
||||||
if !ok {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if !Compatible(descriptor, impl.Descriptor()) {
|
|
||||||
return nil, NewMetricKindMismatchError(impl.Descriptor())
|
|
||||||
}
|
|
||||||
|
|
||||||
return impl, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewSyncInstrument implements metric.MeterImpl.
|
|
||||||
func (u *uniqueInstrumentMeterImpl) NewSyncInstrument(descriptor metric.Descriptor) (metric.SyncImpl, error) {
|
|
||||||
u.lock.Lock()
|
|
||||||
defer u.lock.Unlock()
|
|
||||||
|
|
||||||
impl, err := u.checkUniqueness(descriptor)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
} else if impl != nil {
|
|
||||||
return impl.(metric.SyncImpl), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
syncInst, err := u.impl.NewSyncInstrument(descriptor)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
u.state[keyOf(descriptor)] = syncInst
|
|
||||||
return syncInst, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewAsyncInstrument implements metric.MeterImpl.
|
|
||||||
func (u *uniqueInstrumentMeterImpl) NewAsyncInstrument(
|
|
||||||
descriptor metric.Descriptor,
|
|
||||||
runner metric.AsyncRunner,
|
|
||||||
) (metric.AsyncImpl, error) {
|
|
||||||
u.lock.Lock()
|
|
||||||
defer u.lock.Unlock()
|
|
||||||
|
|
||||||
impl, err := u.checkUniqueness(descriptor)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
} else if impl != nil {
|
|
||||||
return impl.(metric.AsyncImpl), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
asyncInst, err := u.impl.NewAsyncInstrument(descriptor, runner)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
u.state[keyOf(descriptor)] = asyncInst
|
|
||||||
return asyncInst, nil
|
|
||||||
}
|
|
179
src/vendor/go.opentelemetry.io/otel/metric/syncfloat64.go
generated
vendored
Normal file
179
src/vendor/go.opentelemetry.io/otel/metric/syncfloat64.go
generated
vendored
Normal file
@ -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
src/vendor/go.opentelemetry.io/otel/metric/syncint64.go
generated
vendored
Normal file
179
src/vendor/go.opentelemetry.io/otel/metric/syncint64.go
generated
vendored
Normal file
@ -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
src/vendor/go.opentelemetry.io/otel/requirements.txt
generated
vendored
Normal file
1
src/vendor/go.opentelemetry.io/otel/requirements.txt
generated
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
codespell==2.2.5
|
8
src/vendor/go.opentelemetry.io/otel/semconv/internal/http.go
generated
vendored
8
src/vendor/go.opentelemetry.io/otel/semconv/internal/http.go
generated
vendored
@ -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)...)
|
||||||
|
@ -12,12 +12,9 @@
|
|||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
/*
|
// Package semconv implements OpenTelemetry semantic conventions.
|
||||||
Package number provides a number abstraction for instruments that
|
//
|
||||||
either support int64 or float64 input values.
|
// OpenTelemetry semantic conventions are agreed standardized naming
|
||||||
|
// patterns for OpenTelemetry things. This package represents the conventions
|
||||||
This package is currently in a pre-GA phase. Backwards incompatible changes
|
// as of the v1.17.0 version of the OpenTelemetry specification.
|
||||||
may be introduced in subsequent minor version releases as we work to track the
|
package semconv // import "go.opentelemetry.io/otel/semconv/v1.17.0"
|
||||||
evolving OpenTelemetry specification and user feedback.
|
|
||||||
*/
|
|
||||||
package number // import "go.opentelemetry.io/otel/metric/number"
|
|
199
src/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/event.go
generated
vendored
Normal file
199
src/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/event.go
generated
vendored
Normal file
@ -0,0 +1,199 @@
|
|||||||
|
// 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.
|
||||||
|
|
||||||
|
// Code generated from semantic convention specification. DO NOT EDIT.
|
||||||
|
|
||||||
|
package semconv // import "go.opentelemetry.io/otel/semconv/v1.17.0"
|
||||||
|
|
||||||
|
import "go.opentelemetry.io/otel/attribute"
|
||||||
|
|
||||||
|
// This semantic convention defines the attributes used to represent a feature
|
||||||
|
// flag evaluation as an event.
|
||||||
|
const (
|
||||||
|
// FeatureFlagKeyKey is the attribute Key conforming to the
|
||||||
|
// "feature_flag.key" semantic conventions. It represents the unique
|
||||||
|
// identifier of the feature flag.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// RequirementLevel: Required
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'logo-color'
|
||||||
|
FeatureFlagKeyKey = attribute.Key("feature_flag.key")
|
||||||
|
|
||||||
|
// FeatureFlagProviderNameKey is the attribute Key conforming to the
|
||||||
|
// "feature_flag.provider_name" semantic conventions. It represents the
|
||||||
|
// name of the service provider that performs the flag evaluation.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// RequirementLevel: Recommended
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'Flag Manager'
|
||||||
|
FeatureFlagProviderNameKey = attribute.Key("feature_flag.provider_name")
|
||||||
|
|
||||||
|
// FeatureFlagVariantKey is the attribute Key conforming to the
|
||||||
|
// "feature_flag.variant" semantic conventions. It represents the sHOULD be
|
||||||
|
// a semantic identifier for a value. If one is unavailable, a stringified
|
||||||
|
// version of the value can be used.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// RequirementLevel: Recommended
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'red', 'true', 'on'
|
||||||
|
// Note: A semantic identifier, commonly referred to as a variant, provides
|
||||||
|
// a means
|
||||||
|
// for referring to a value without including the value itself. This can
|
||||||
|
// provide additional context for understanding the meaning behind a value.
|
||||||
|
// For example, the variant `red` maybe be used for the value `#c05543`.
|
||||||
|
//
|
||||||
|
// A stringified version of the value can be used in situations where a
|
||||||
|
// semantic identifier is unavailable. String representation of the value
|
||||||
|
// should be determined by the implementer.
|
||||||
|
FeatureFlagVariantKey = attribute.Key("feature_flag.variant")
|
||||||
|
)
|
||||||
|
|
||||||
|
// FeatureFlagKey returns an attribute KeyValue conforming to the
|
||||||
|
// "feature_flag.key" semantic conventions. It represents the unique identifier
|
||||||
|
// of the feature flag.
|
||||||
|
func FeatureFlagKey(val string) attribute.KeyValue {
|
||||||
|
return FeatureFlagKeyKey.String(val)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FeatureFlagProviderName returns an attribute KeyValue conforming to the
|
||||||
|
// "feature_flag.provider_name" semantic conventions. It represents the name of
|
||||||
|
// the service provider that performs the flag evaluation.
|
||||||
|
func FeatureFlagProviderName(val string) attribute.KeyValue {
|
||||||
|
return FeatureFlagProviderNameKey.String(val)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FeatureFlagVariant returns an attribute KeyValue conforming to the
|
||||||
|
// "feature_flag.variant" semantic conventions. It represents the sHOULD be a
|
||||||
|
// semantic identifier for a value. If one is unavailable, a stringified
|
||||||
|
// version of the value can be used.
|
||||||
|
func FeatureFlagVariant(val string) attribute.KeyValue {
|
||||||
|
return FeatureFlagVariantKey.String(val)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RPC received/sent message.
|
||||||
|
const (
|
||||||
|
// MessageTypeKey is the attribute Key conforming to the "message.type"
|
||||||
|
// semantic conventions. It represents the whether this is a received or
|
||||||
|
// sent message.
|
||||||
|
//
|
||||||
|
// Type: Enum
|
||||||
|
// RequirementLevel: Optional
|
||||||
|
// Stability: stable
|
||||||
|
MessageTypeKey = attribute.Key("message.type")
|
||||||
|
|
||||||
|
// MessageIDKey is the attribute Key conforming to the "message.id"
|
||||||
|
// semantic conventions. It represents the mUST be calculated as two
|
||||||
|
// different counters starting from `1` one for sent messages and one for
|
||||||
|
// received message.
|
||||||
|
//
|
||||||
|
// Type: int
|
||||||
|
// RequirementLevel: Optional
|
||||||
|
// Stability: stable
|
||||||
|
// Note: This way we guarantee that the values will be consistent between
|
||||||
|
// different implementations.
|
||||||
|
MessageIDKey = attribute.Key("message.id")
|
||||||
|
|
||||||
|
// MessageCompressedSizeKey is the attribute Key conforming to the
|
||||||
|
// "message.compressed_size" semantic conventions. It represents the
|
||||||
|
// compressed size of the message in bytes.
|
||||||
|
//
|
||||||
|
// Type: int
|
||||||
|
// RequirementLevel: Optional
|
||||||
|
// Stability: stable
|
||||||
|
MessageCompressedSizeKey = attribute.Key("message.compressed_size")
|
||||||
|
|
||||||
|
// MessageUncompressedSizeKey is the attribute Key conforming to the
|
||||||
|
// "message.uncompressed_size" semantic conventions. It represents the
|
||||||
|
// uncompressed size of the message in bytes.
|
||||||
|
//
|
||||||
|
// Type: int
|
||||||
|
// RequirementLevel: Optional
|
||||||
|
// Stability: stable
|
||||||
|
MessageUncompressedSizeKey = attribute.Key("message.uncompressed_size")
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// sent
|
||||||
|
MessageTypeSent = MessageTypeKey.String("SENT")
|
||||||
|
// received
|
||||||
|
MessageTypeReceived = MessageTypeKey.String("RECEIVED")
|
||||||
|
)
|
||||||
|
|
||||||
|
// MessageID returns an attribute KeyValue conforming to the "message.id"
|
||||||
|
// semantic conventions. It represents the mUST be calculated as two different
|
||||||
|
// counters starting from `1` one for sent messages and one for received
|
||||||
|
// message.
|
||||||
|
func MessageID(val int) attribute.KeyValue {
|
||||||
|
return MessageIDKey.Int(val)
|
||||||
|
}
|
||||||
|
|
||||||
|
// MessageCompressedSize returns an attribute KeyValue conforming to the
|
||||||
|
// "message.compressed_size" semantic conventions. It represents the compressed
|
||||||
|
// size of the message in bytes.
|
||||||
|
func MessageCompressedSize(val int) attribute.KeyValue {
|
||||||
|
return MessageCompressedSizeKey.Int(val)
|
||||||
|
}
|
||||||
|
|
||||||
|
// MessageUncompressedSize returns an attribute KeyValue conforming to the
|
||||||
|
// "message.uncompressed_size" semantic conventions. It represents the
|
||||||
|
// uncompressed size of the message in bytes.
|
||||||
|
func MessageUncompressedSize(val int) attribute.KeyValue {
|
||||||
|
return MessageUncompressedSizeKey.Int(val)
|
||||||
|
}
|
||||||
|
|
||||||
|
// The attributes used to report a single exception associated with a span.
|
||||||
|
const (
|
||||||
|
// ExceptionEscapedKey is the attribute Key conforming to the
|
||||||
|
// "exception.escaped" semantic conventions. It represents the sHOULD be
|
||||||
|
// set to true if the exception event is recorded at a point where it is
|
||||||
|
// known that the exception is escaping the scope of the span.
|
||||||
|
//
|
||||||
|
// Type: boolean
|
||||||
|
// RequirementLevel: Optional
|
||||||
|
// Stability: stable
|
||||||
|
// Note: An exception is considered to have escaped (or left) the scope of
|
||||||
|
// a span,
|
||||||
|
// if that span is ended while the exception is still logically "in
|
||||||
|
// flight".
|
||||||
|
// This may be actually "in flight" in some languages (e.g. if the
|
||||||
|
// exception
|
||||||
|
// is passed to a Context manager's `__exit__` method in Python) but will
|
||||||
|
// usually be caught at the point of recording the exception in most
|
||||||
|
// languages.
|
||||||
|
//
|
||||||
|
// It is usually not possible to determine at the point where an exception
|
||||||
|
// is thrown
|
||||||
|
// whether it will escape the scope of a span.
|
||||||
|
// However, it is trivial to know that an exception
|
||||||
|
// will escape, if one checks for an active exception just before ending
|
||||||
|
// the span,
|
||||||
|
// as done in the [example above](#recording-an-exception).
|
||||||
|
//
|
||||||
|
// It follows that an exception may still escape the scope of the span
|
||||||
|
// even if the `exception.escaped` attribute was not set or set to false,
|
||||||
|
// since the event might have been recorded at a time where it was not
|
||||||
|
// clear whether the exception will escape.
|
||||||
|
ExceptionEscapedKey = attribute.Key("exception.escaped")
|
||||||
|
)
|
||||||
|
|
||||||
|
// ExceptionEscaped returns an attribute KeyValue conforming to the
|
||||||
|
// "exception.escaped" semantic conventions. It represents the sHOULD be set to
|
||||||
|
// true if the exception event is recorded at a point where it is known that
|
||||||
|
// the exception is escaping the scope of the span.
|
||||||
|
func ExceptionEscaped(val bool) attribute.KeyValue {
|
||||||
|
return ExceptionEscapedKey.Bool(val)
|
||||||
|
}
|
@ -12,13 +12,9 @@
|
|||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
package unit // import "go.opentelemetry.io/otel/metric/unit"
|
package semconv // import "go.opentelemetry.io/otel/semconv/v1.17.0"
|
||||||
|
|
||||||
type Unit string
|
|
||||||
|
|
||||||
// Units defined by OpenTelemetry.
|
|
||||||
const (
|
const (
|
||||||
Dimensionless Unit = "1"
|
// ExceptionEventName is the name of the Span event representing an exception.
|
||||||
Bytes Unit = "By"
|
ExceptionEventName = "exception"
|
||||||
Milliseconds Unit = "ms"
|
|
||||||
)
|
)
|
@ -12,9 +12,10 @@
|
|||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
// Package unit provides units.
|
package semconv // import "go.opentelemetry.io/otel/semconv/v1.17.0"
|
||||||
//
|
|
||||||
// This package is currently in a pre-GA phase. Backwards incompatible changes
|
// HTTP scheme attributes.
|
||||||
// may be introduced in subsequent minor version releases as we work to track
|
var (
|
||||||
// the evolving OpenTelemetry specification and user feedback.
|
HTTPSchemeHTTP = HTTPSchemeKey.String("http")
|
||||||
package unit // import "go.opentelemetry.io/otel/metric/unit"
|
HTTPSchemeHTTPS = HTTPSchemeKey.String("https")
|
||||||
|
)
|
2010
src/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/resource.go
generated
vendored
Normal file
2010
src/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/resource.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
20
src/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/schema.go
generated
vendored
Normal file
20
src/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/schema.go
generated
vendored
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
// 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 semconv // import "go.opentelemetry.io/otel/semconv/v1.17.0"
|
||||||
|
|
||||||
|
// SchemaURL is the schema URL that matches the version of the semantic conventions
|
||||||
|
// that this package defines. Semconv packages starting from v1.4.0 must declare
|
||||||
|
// non-empty schema URL in the form https://opentelemetry.io/schemas/<version>
|
||||||
|
const SchemaURL = "https://opentelemetry.io/schemas/1.17.0"
|
3375
src/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/trace.go
generated
vendored
Normal file
3375
src/vendor/go.opentelemetry.io/otel/semconv/v1.17.0/trace.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
4
src/vendor/go.opentelemetry.io/otel/trace/noop.go
generated
vendored
4
src/vendor/go.opentelemetry.io/otel/trace/noop.go
generated
vendored
@ -37,7 +37,7 @@ func (p noopTracerProvider) Tracer(string, ...TracerOption) Tracer {
|
|||||||
return noopTracer{}
|
return noopTracer{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// noopTracer is an implementation of Tracer that preforms no operations.
|
// noopTracer is an implementation of Tracer that performs no operations.
|
||||||
type noopTracer struct{}
|
type noopTracer struct{}
|
||||||
|
|
||||||
var _ Tracer = noopTracer{}
|
var _ Tracer = noopTracer{}
|
||||||
@ -53,7 +53,7 @@ func (t noopTracer) Start(ctx context.Context, name string, _ ...SpanStartOption
|
|||||||
return ContextWithSpan(ctx, span), span
|
return ContextWithSpan(ctx, span), span
|
||||||
}
|
}
|
||||||
|
|
||||||
// noopSpan is an implementation of Span that preforms no operations.
|
// noopSpan is an implementation of Span that performs no operations.
|
||||||
type noopSpan struct{}
|
type noopSpan struct{}
|
||||||
|
|
||||||
var _ Span = noopSpan{}
|
var _ Span = noopSpan{}
|
||||||
|
2
src/vendor/go.opentelemetry.io/otel/version.go
generated
vendored
2
src/vendor/go.opentelemetry.io/otel/version.go
generated
vendored
@ -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.14.0"
|
return "1.19.0"
|
||||||
}
|
}
|
||||||
|
24
src/vendor/go.opentelemetry.io/otel/versions.yaml
generated
vendored
24
src/vendor/go.opentelemetry.io/otel/versions.yaml
generated
vendored
@ -14,43 +14,41 @@
|
|||||||
|
|
||||||
module-sets:
|
module-sets:
|
||||||
stable-v1:
|
stable-v1:
|
||||||
version: v1.14.0
|
version: v1.19.0
|
||||||
modules:
|
modules:
|
||||||
- go.opentelemetry.io/otel
|
- go.opentelemetry.io/otel
|
||||||
- go.opentelemetry.io/otel/bridge/opentracing
|
- go.opentelemetry.io/otel/bridge/opentracing
|
||||||
- go.opentelemetry.io/otel/bridge/opentracing/test
|
- go.opentelemetry.io/otel/bridge/opentracing/test
|
||||||
|
- go.opentelemetry.io/otel/example/dice
|
||||||
- go.opentelemetry.io/otel/example/fib
|
- go.opentelemetry.io/otel/example/fib
|
||||||
- go.opentelemetry.io/otel/example/jaeger
|
|
||||||
- go.opentelemetry.io/otel/example/namedtracer
|
- go.opentelemetry.io/otel/example/namedtracer
|
||||||
- go.opentelemetry.io/otel/example/otel-collector
|
- go.opentelemetry.io/otel/example/otel-collector
|
||||||
- go.opentelemetry.io/otel/example/passthrough
|
- go.opentelemetry.io/otel/example/passthrough
|
||||||
- go.opentelemetry.io/otel/example/zipkin
|
- go.opentelemetry.io/otel/example/zipkin
|
||||||
- go.opentelemetry.io/otel/exporters/jaeger
|
|
||||||
- go.opentelemetry.io/otel/exporters/zipkin
|
|
||||||
- go.opentelemetry.io/otel/exporters/otlp/otlptrace
|
- go.opentelemetry.io/otel/exporters/otlp/otlptrace
|
||||||
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc
|
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc
|
||||||
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp
|
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp
|
||||||
- go.opentelemetry.io/otel/exporters/otlp/internal/retry
|
|
||||||
- go.opentelemetry.io/otel/exporters/stdout/stdouttrace
|
- go.opentelemetry.io/otel/exporters/stdout/stdouttrace
|
||||||
- go.opentelemetry.io/otel/trace
|
- 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/sdk/metric
|
||||||
|
- go.opentelemetry.io/otel/trace
|
||||||
experimental-metrics:
|
experimental-metrics:
|
||||||
version: v0.37.0
|
version: v0.42.0
|
||||||
modules:
|
modules:
|
||||||
|
- go.opentelemetry.io/otel/bridge/opencensus
|
||||||
|
- go.opentelemetry.io/otel/bridge/opencensus/test
|
||||||
- go.opentelemetry.io/otel/example/opencensus
|
- go.opentelemetry.io/otel/example/opencensus
|
||||||
- go.opentelemetry.io/otel/example/prometheus
|
- go.opentelemetry.io/otel/example/prometheus
|
||||||
|
- go.opentelemetry.io/otel/example/view
|
||||||
- go.opentelemetry.io/otel/exporters/otlp/otlpmetric
|
- go.opentelemetry.io/otel/exporters/otlp/otlpmetric
|
||||||
- go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc
|
- go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc
|
||||||
- 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/bridge/opencensus
|
|
||||||
- go.opentelemetry.io/otel/bridge/opencensus/test
|
|
||||||
- go.opentelemetry.io/otel/example/view
|
|
||||||
experimental-schema:
|
experimental-schema:
|
||||||
version: v0.0.4
|
version: v0.0.7
|
||||||
modules:
|
modules:
|
||||||
- go.opentelemetry.io/otel/schema
|
- go.opentelemetry.io/otel/schema
|
||||||
excluded-modules:
|
excluded-modules:
|
||||||
|
51
src/vendor/golang.org/x/net/http2/Dockerfile
generated
vendored
51
src/vendor/golang.org/x/net/http2/Dockerfile
generated
vendored
@ -1,51 +0,0 @@
|
|||||||
#
|
|
||||||
# This Dockerfile builds a recent curl with HTTP/2 client support, using
|
|
||||||
# a recent nghttp2 build.
|
|
||||||
#
|
|
||||||
# See the Makefile for how to tag it. If Docker and that image is found, the
|
|
||||||
# Go tests use this curl binary for integration tests.
|
|
||||||
#
|
|
||||||
|
|
||||||
FROM ubuntu:trusty
|
|
||||||
|
|
||||||
RUN apt-get update && \
|
|
||||||
apt-get upgrade -y && \
|
|
||||||
apt-get install -y git-core build-essential wget
|
|
||||||
|
|
||||||
RUN apt-get install -y --no-install-recommends \
|
|
||||||
autotools-dev libtool pkg-config zlib1g-dev \
|
|
||||||
libcunit1-dev libssl-dev libxml2-dev libevent-dev \
|
|
||||||
automake autoconf
|
|
||||||
|
|
||||||
# The list of packages nghttp2 recommends for h2load:
|
|
||||||
RUN apt-get install -y --no-install-recommends make binutils \
|
|
||||||
autoconf automake autotools-dev \
|
|
||||||
libtool pkg-config zlib1g-dev libcunit1-dev libssl-dev libxml2-dev \
|
|
||||||
libev-dev libevent-dev libjansson-dev libjemalloc-dev \
|
|
||||||
cython python3.4-dev python-setuptools
|
|
||||||
|
|
||||||
# Note: setting NGHTTP2_VER before the git clone, so an old git clone isn't cached:
|
|
||||||
ENV NGHTTP2_VER 895da9a
|
|
||||||
RUN cd /root && git clone https://github.com/tatsuhiro-t/nghttp2.git
|
|
||||||
|
|
||||||
WORKDIR /root/nghttp2
|
|
||||||
RUN git reset --hard $NGHTTP2_VER
|
|
||||||
RUN autoreconf -i
|
|
||||||
RUN automake
|
|
||||||
RUN autoconf
|
|
||||||
RUN ./configure
|
|
||||||
RUN make
|
|
||||||
RUN make install
|
|
||||||
|
|
||||||
WORKDIR /root
|
|
||||||
RUN wget https://curl.se/download/curl-7.45.0.tar.gz
|
|
||||||
RUN tar -zxvf curl-7.45.0.tar.gz
|
|
||||||
WORKDIR /root/curl-7.45.0
|
|
||||||
RUN ./configure --with-ssl --with-nghttp2=/usr/local
|
|
||||||
RUN make
|
|
||||||
RUN make install
|
|
||||||
RUN ldconfig
|
|
||||||
|
|
||||||
CMD ["-h"]
|
|
||||||
ENTRYPOINT ["/usr/local/bin/curl"]
|
|
||||||
|
|
3
src/vendor/golang.org/x/net/http2/Makefile
generated
vendored
3
src/vendor/golang.org/x/net/http2/Makefile
generated
vendored
@ -1,3 +0,0 @@
|
|||||||
curlimage:
|
|
||||||
docker build -t gohttp2/curl .
|
|
||||||
|
|
95
src/vendor/golang.org/x/net/http2/server.go
generated
vendored
95
src/vendor/golang.org/x/net/http2/server.go
generated
vendored
@ -441,7 +441,7 @@ func (s *Server) ServeConn(c net.Conn, opts *ServeConnOpts) {
|
|||||||
if s.NewWriteScheduler != nil {
|
if s.NewWriteScheduler != nil {
|
||||||
sc.writeSched = s.NewWriteScheduler()
|
sc.writeSched = s.NewWriteScheduler()
|
||||||
} else {
|
} else {
|
||||||
sc.writeSched = NewPriorityWriteScheduler(nil)
|
sc.writeSched = newRoundRobinWriteScheduler()
|
||||||
}
|
}
|
||||||
|
|
||||||
// These start at the RFC-specified defaults. If there is a higher
|
// These start at the RFC-specified defaults. If there is a higher
|
||||||
@ -581,9 +581,11 @@ type serverConn struct {
|
|||||||
advMaxStreams uint32 // our SETTINGS_MAX_CONCURRENT_STREAMS advertised the client
|
advMaxStreams uint32 // our SETTINGS_MAX_CONCURRENT_STREAMS advertised the client
|
||||||
curClientStreams uint32 // number of open streams initiated by the client
|
curClientStreams uint32 // number of open streams initiated by the client
|
||||||
curPushedStreams uint32 // number of open streams initiated by server push
|
curPushedStreams uint32 // number of open streams initiated by server push
|
||||||
|
curHandlers uint32 // number of running handler goroutines
|
||||||
maxClientStreamID uint32 // max ever seen from client (odd), or 0 if there have been no client requests
|
maxClientStreamID uint32 // max ever seen from client (odd), or 0 if there have been no client requests
|
||||||
maxPushPromiseID uint32 // ID of the last push promise (even), or 0 if there have been no pushes
|
maxPushPromiseID uint32 // ID of the last push promise (even), or 0 if there have been no pushes
|
||||||
streams map[uint32]*stream
|
streams map[uint32]*stream
|
||||||
|
unstartedHandlers []unstartedHandler
|
||||||
initialStreamSendWindowSize int32
|
initialStreamSendWindowSize int32
|
||||||
maxFrameSize int32
|
maxFrameSize int32
|
||||||
peerMaxHeaderListSize uint32 // zero means unknown (default)
|
peerMaxHeaderListSize uint32 // zero means unknown (default)
|
||||||
@ -981,6 +983,8 @@ func (sc *serverConn) serve() {
|
|||||||
return
|
return
|
||||||
case gracefulShutdownMsg:
|
case gracefulShutdownMsg:
|
||||||
sc.startGracefulShutdownInternal()
|
sc.startGracefulShutdownInternal()
|
||||||
|
case handlerDoneMsg:
|
||||||
|
sc.handlerDone()
|
||||||
default:
|
default:
|
||||||
panic("unknown timer")
|
panic("unknown timer")
|
||||||
}
|
}
|
||||||
@ -1012,14 +1016,6 @@ func (sc *serverConn) serve() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sc *serverConn) awaitGracefulShutdown(sharedCh <-chan struct{}, privateCh chan struct{}) {
|
|
||||||
select {
|
|
||||||
case <-sc.doneServing:
|
|
||||||
case <-sharedCh:
|
|
||||||
close(privateCh)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type serverMessage int
|
type serverMessage int
|
||||||
|
|
||||||
// Message values sent to serveMsgCh.
|
// Message values sent to serveMsgCh.
|
||||||
@ -1028,6 +1024,7 @@ var (
|
|||||||
idleTimerMsg = new(serverMessage)
|
idleTimerMsg = new(serverMessage)
|
||||||
shutdownTimerMsg = new(serverMessage)
|
shutdownTimerMsg = new(serverMessage)
|
||||||
gracefulShutdownMsg = new(serverMessage)
|
gracefulShutdownMsg = new(serverMessage)
|
||||||
|
handlerDoneMsg = new(serverMessage)
|
||||||
)
|
)
|
||||||
|
|
||||||
func (sc *serverConn) onSettingsTimer() { sc.sendServeMsg(settingsTimerMsg) }
|
func (sc *serverConn) onSettingsTimer() { sc.sendServeMsg(settingsTimerMsg) }
|
||||||
@ -1900,9 +1897,11 @@ func (st *stream) copyTrailersToHandlerRequest() {
|
|||||||
// onReadTimeout is run on its own goroutine (from time.AfterFunc)
|
// onReadTimeout is run on its own goroutine (from time.AfterFunc)
|
||||||
// when the stream's ReadTimeout has fired.
|
// when the stream's ReadTimeout has fired.
|
||||||
func (st *stream) onReadTimeout() {
|
func (st *stream) onReadTimeout() {
|
||||||
// Wrap the ErrDeadlineExceeded to avoid callers depending on us
|
if st.body != nil {
|
||||||
// returning the bare error.
|
// Wrap the ErrDeadlineExceeded to avoid callers depending on us
|
||||||
st.body.CloseWithError(fmt.Errorf("%w", os.ErrDeadlineExceeded))
|
// returning the bare error.
|
||||||
|
st.body.CloseWithError(fmt.Errorf("%w", os.ErrDeadlineExceeded))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// onWriteTimeout is run on its own goroutine (from time.AfterFunc)
|
// onWriteTimeout is run on its own goroutine (from time.AfterFunc)
|
||||||
@ -2020,13 +2019,10 @@ func (sc *serverConn) processHeaders(f *MetaHeadersFrame) error {
|
|||||||
// (in Go 1.8), though. That's a more sane option anyway.
|
// (in Go 1.8), though. That's a more sane option anyway.
|
||||||
if sc.hs.ReadTimeout != 0 {
|
if sc.hs.ReadTimeout != 0 {
|
||||||
sc.conn.SetReadDeadline(time.Time{})
|
sc.conn.SetReadDeadline(time.Time{})
|
||||||
if st.body != nil {
|
st.readDeadline = time.AfterFunc(sc.hs.ReadTimeout, st.onReadTimeout)
|
||||||
st.readDeadline = time.AfterFunc(sc.hs.ReadTimeout, st.onReadTimeout)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
go sc.runHandler(rw, req, handler)
|
return sc.scheduleHandler(id, rw, req, handler)
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sc *serverConn) upgradeRequest(req *http.Request) {
|
func (sc *serverConn) upgradeRequest(req *http.Request) {
|
||||||
@ -2046,6 +2042,10 @@ func (sc *serverConn) upgradeRequest(req *http.Request) {
|
|||||||
sc.conn.SetReadDeadline(time.Time{})
|
sc.conn.SetReadDeadline(time.Time{})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This is the first request on the connection,
|
||||||
|
// so start the handler directly rather than going
|
||||||
|
// through scheduleHandler.
|
||||||
|
sc.curHandlers++
|
||||||
go sc.runHandler(rw, req, sc.handler.ServeHTTP)
|
go sc.runHandler(rw, req, sc.handler.ServeHTTP)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2286,8 +2286,62 @@ func (sc *serverConn) newResponseWriter(st *stream, req *http.Request) *response
|
|||||||
return &responseWriter{rws: rws}
|
return &responseWriter{rws: rws}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type unstartedHandler struct {
|
||||||
|
streamID uint32
|
||||||
|
rw *responseWriter
|
||||||
|
req *http.Request
|
||||||
|
handler func(http.ResponseWriter, *http.Request)
|
||||||
|
}
|
||||||
|
|
||||||
|
// scheduleHandler starts a handler goroutine,
|
||||||
|
// or schedules one to start as soon as an existing handler finishes.
|
||||||
|
func (sc *serverConn) scheduleHandler(streamID uint32, rw *responseWriter, req *http.Request, handler func(http.ResponseWriter, *http.Request)) error {
|
||||||
|
sc.serveG.check()
|
||||||
|
maxHandlers := sc.advMaxStreams
|
||||||
|
if sc.curHandlers < maxHandlers {
|
||||||
|
sc.curHandlers++
|
||||||
|
go sc.runHandler(rw, req, handler)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if len(sc.unstartedHandlers) > int(4*sc.advMaxStreams) {
|
||||||
|
return sc.countError("too_many_early_resets", ConnectionError(ErrCodeEnhanceYourCalm))
|
||||||
|
}
|
||||||
|
sc.unstartedHandlers = append(sc.unstartedHandlers, unstartedHandler{
|
||||||
|
streamID: streamID,
|
||||||
|
rw: rw,
|
||||||
|
req: req,
|
||||||
|
handler: handler,
|
||||||
|
})
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sc *serverConn) handlerDone() {
|
||||||
|
sc.serveG.check()
|
||||||
|
sc.curHandlers--
|
||||||
|
i := 0
|
||||||
|
maxHandlers := sc.advMaxStreams
|
||||||
|
for ; i < len(sc.unstartedHandlers); i++ {
|
||||||
|
u := sc.unstartedHandlers[i]
|
||||||
|
if sc.streams[u.streamID] == nil {
|
||||||
|
// This stream was reset before its goroutine had a chance to start.
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if sc.curHandlers >= maxHandlers {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
sc.curHandlers++
|
||||||
|
go sc.runHandler(u.rw, u.req, u.handler)
|
||||||
|
sc.unstartedHandlers[i] = unstartedHandler{} // don't retain references
|
||||||
|
}
|
||||||
|
sc.unstartedHandlers = sc.unstartedHandlers[i:]
|
||||||
|
if len(sc.unstartedHandlers) == 0 {
|
||||||
|
sc.unstartedHandlers = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Run on its own goroutine.
|
// Run on its own goroutine.
|
||||||
func (sc *serverConn) runHandler(rw *responseWriter, req *http.Request, handler func(http.ResponseWriter, *http.Request)) {
|
func (sc *serverConn) runHandler(rw *responseWriter, req *http.Request, handler func(http.ResponseWriter, *http.Request)) {
|
||||||
|
defer sc.sendServeMsg(handlerDoneMsg)
|
||||||
didPanic := true
|
didPanic := true
|
||||||
defer func() {
|
defer func() {
|
||||||
rw.rws.stream.cancelCtx()
|
rw.rws.stream.cancelCtx()
|
||||||
@ -2429,7 +2483,7 @@ type requestBody struct {
|
|||||||
conn *serverConn
|
conn *serverConn
|
||||||
closeOnce sync.Once // for use by Close only
|
closeOnce sync.Once // for use by Close only
|
||||||
sawEOF bool // for use by Read only
|
sawEOF bool // for use by Read only
|
||||||
pipe *pipe // non-nil if we have a HTTP entity message body
|
pipe *pipe // non-nil if we have an HTTP entity message body
|
||||||
needsContinue bool // need to send a 100-continue
|
needsContinue bool // need to send a 100-continue
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2569,7 +2623,8 @@ func (rws *responseWriterState) writeChunk(p []byte) (n int, err error) {
|
|||||||
clen = ""
|
clen = ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if clen == "" && rws.handlerDone && bodyAllowedForStatus(rws.status) && (len(p) > 0 || !isHeadResp) {
|
_, hasContentLength := rws.snapHeader["Content-Length"]
|
||||||
|
if !hasContentLength && clen == "" && rws.handlerDone && bodyAllowedForStatus(rws.status) && (len(p) > 0 || !isHeadResp) {
|
||||||
clen = strconv.Itoa(len(p))
|
clen = strconv.Itoa(len(p))
|
||||||
}
|
}
|
||||||
_, hasContentType := rws.snapHeader["Content-Type"]
|
_, hasContentType := rws.snapHeader["Content-Type"]
|
||||||
@ -2774,7 +2829,7 @@ func (w *responseWriter) FlushError() error {
|
|||||||
err = rws.bw.Flush()
|
err = rws.bw.Flush()
|
||||||
} else {
|
} else {
|
||||||
// The bufio.Writer won't call chunkWriter.Write
|
// The bufio.Writer won't call chunkWriter.Write
|
||||||
// (writeChunk with zero bytes, so we have to do it
|
// (writeChunk with zero bytes), so we have to do it
|
||||||
// ourselves to force the HTTP response header and/or
|
// ourselves to force the HTTP response header and/or
|
||||||
// final DATA frame (with END_STREAM) to be sent.
|
// final DATA frame (with END_STREAM) to be sent.
|
||||||
_, err = chunkWriter{rws}.Write(nil)
|
_, err = chunkWriter{rws}.Write(nil)
|
||||||
|
82
src/vendor/golang.org/x/net/http2/transport.go
generated
vendored
82
src/vendor/golang.org/x/net/http2/transport.go
generated
vendored
@ -19,6 +19,7 @@ import (
|
|||||||
"io/fs"
|
"io/fs"
|
||||||
"log"
|
"log"
|
||||||
"math"
|
"math"
|
||||||
|
"math/bits"
|
||||||
mathrand "math/rand"
|
mathrand "math/rand"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
@ -290,8 +291,7 @@ func (t *Transport) initConnPool() {
|
|||||||
// HTTP/2 server.
|
// HTTP/2 server.
|
||||||
type ClientConn struct {
|
type ClientConn struct {
|
||||||
t *Transport
|
t *Transport
|
||||||
tconn net.Conn // usually *tls.Conn, except specialized impls
|
tconn net.Conn // usually *tls.Conn, except specialized impls
|
||||||
tconnClosed bool
|
|
||||||
tlsState *tls.ConnectionState // nil only for specialized impls
|
tlsState *tls.ConnectionState // nil only for specialized impls
|
||||||
reused uint32 // whether conn is being reused; atomic
|
reused uint32 // whether conn is being reused; atomic
|
||||||
singleUse bool // whether being used for a single http.Request
|
singleUse bool // whether being used for a single http.Request
|
||||||
@ -518,11 +518,14 @@ func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) {
|
|||||||
func authorityAddr(scheme string, authority string) (addr string) {
|
func authorityAddr(scheme string, authority string) (addr string) {
|
||||||
host, port, err := net.SplitHostPort(authority)
|
host, port, err := net.SplitHostPort(authority)
|
||||||
if err != nil { // authority didn't have a port
|
if err != nil { // authority didn't have a port
|
||||||
|
host = authority
|
||||||
|
port = ""
|
||||||
|
}
|
||||||
|
if port == "" { // authority's port was empty
|
||||||
port = "443"
|
port = "443"
|
||||||
if scheme == "http" {
|
if scheme == "http" {
|
||||||
port = "80"
|
port = "80"
|
||||||
}
|
}
|
||||||
host = authority
|
|
||||||
}
|
}
|
||||||
if a, err := idna.ToASCII(host); err == nil {
|
if a, err := idna.ToASCII(host); err == nil {
|
||||||
host = a
|
host = a
|
||||||
@ -1268,21 +1271,23 @@ func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) {
|
|||||||
|
|
||||||
cancelRequest := func(cs *clientStream, err error) error {
|
cancelRequest := func(cs *clientStream, err error) error {
|
||||||
cs.cc.mu.Lock()
|
cs.cc.mu.Lock()
|
||||||
defer cs.cc.mu.Unlock()
|
bodyClosed := cs.reqBodyClosed
|
||||||
cs.abortStreamLocked(err)
|
cs.cc.mu.Unlock()
|
||||||
if cs.ID != 0 {
|
// Wait for the request body to be closed.
|
||||||
// This request may have failed because of a problem with the connection,
|
//
|
||||||
// or for some unrelated reason. (For example, the user might have canceled
|
// If nothing closed the body before now, abortStreamLocked
|
||||||
// the request without waiting for a response.) Mark the connection as
|
// will have started a goroutine to close it.
|
||||||
// not reusable, since trying to reuse a dead connection is worse than
|
//
|
||||||
// unnecessarily creating a new one.
|
// Closing the body before returning avoids a race condition
|
||||||
//
|
// with net/http checking its readTrackingBody to see if the
|
||||||
// If cs.ID is 0, then the request was never allocated a stream ID and
|
// body was read from or closed. See golang/go#60041.
|
||||||
// whatever went wrong was unrelated to the connection. We might have
|
//
|
||||||
// timed out waiting for a stream slot when StrictMaxConcurrentStreams
|
// The body is closed in a separate goroutine without the
|
||||||
// is set, for example, in which case retrying on a different connection
|
// connection mutex held, but dropping the mutex before waiting
|
||||||
// will not help.
|
// will keep us from holding it indefinitely if the body
|
||||||
cs.cc.doNotReuse = true
|
// close is slow for some reason.
|
||||||
|
if bodyClosed != nil {
|
||||||
|
<-bodyClosed
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -1301,11 +1306,14 @@ func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) {
|
|||||||
return handleResponseHeaders()
|
return handleResponseHeaders()
|
||||||
default:
|
default:
|
||||||
waitDone()
|
waitDone()
|
||||||
return nil, cancelRequest(cs, cs.abortErr)
|
return nil, cs.abortErr
|
||||||
}
|
}
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
return nil, cancelRequest(cs, ctx.Err())
|
err := ctx.Err()
|
||||||
|
cs.abortStream(err)
|
||||||
|
return nil, cancelRequest(cs, err)
|
||||||
case <-cs.reqCancel:
|
case <-cs.reqCancel:
|
||||||
|
cs.abortStream(errRequestCanceled)
|
||||||
return nil, cancelRequest(cs, errRequestCanceled)
|
return nil, cancelRequest(cs, errRequestCanceled)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1672,7 +1680,27 @@ func (cs *clientStream) frameScratchBufferLen(maxFrameSize int) int {
|
|||||||
return int(n) // doesn't truncate; max is 512K
|
return int(n) // doesn't truncate; max is 512K
|
||||||
}
|
}
|
||||||
|
|
||||||
var bufPool sync.Pool // of *[]byte
|
// Seven bufPools manage different frame sizes. This helps to avoid scenarios where long-running
|
||||||
|
// streaming requests using small frame sizes occupy large buffers initially allocated for prior
|
||||||
|
// requests needing big buffers. The size ranges are as follows:
|
||||||
|
// {0 KB, 16 KB], {16 KB, 32 KB], {32 KB, 64 KB], {64 KB, 128 KB], {128 KB, 256 KB],
|
||||||
|
// {256 KB, 512 KB], {512 KB, infinity}
|
||||||
|
// In practice, the maximum scratch buffer size should not exceed 512 KB due to
|
||||||
|
// frameScratchBufferLen(maxFrameSize), thus the "infinity pool" should never be used.
|
||||||
|
// It exists mainly as a safety measure, for potential future increases in max buffer size.
|
||||||
|
var bufPools [7]sync.Pool // of *[]byte
|
||||||
|
func bufPoolIndex(size int) int {
|
||||||
|
if size <= 16384 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
size -= 1
|
||||||
|
bits := bits.Len(uint(size))
|
||||||
|
index := bits - 14
|
||||||
|
if index >= len(bufPools) {
|
||||||
|
return len(bufPools) - 1
|
||||||
|
}
|
||||||
|
return index
|
||||||
|
}
|
||||||
|
|
||||||
func (cs *clientStream) writeRequestBody(req *http.Request) (err error) {
|
func (cs *clientStream) writeRequestBody(req *http.Request) (err error) {
|
||||||
cc := cs.cc
|
cc := cs.cc
|
||||||
@ -1690,12 +1718,13 @@ func (cs *clientStream) writeRequestBody(req *http.Request) (err error) {
|
|||||||
// Scratch buffer for reading into & writing from.
|
// Scratch buffer for reading into & writing from.
|
||||||
scratchLen := cs.frameScratchBufferLen(maxFrameSize)
|
scratchLen := cs.frameScratchBufferLen(maxFrameSize)
|
||||||
var buf []byte
|
var buf []byte
|
||||||
if bp, ok := bufPool.Get().(*[]byte); ok && len(*bp) >= scratchLen {
|
index := bufPoolIndex(scratchLen)
|
||||||
defer bufPool.Put(bp)
|
if bp, ok := bufPools[index].Get().(*[]byte); ok && len(*bp) >= scratchLen {
|
||||||
|
defer bufPools[index].Put(bp)
|
||||||
buf = *bp
|
buf = *bp
|
||||||
} else {
|
} else {
|
||||||
buf = make([]byte, scratchLen)
|
buf = make([]byte, scratchLen)
|
||||||
defer bufPool.Put(&buf)
|
defer bufPools[index].Put(&buf)
|
||||||
}
|
}
|
||||||
|
|
||||||
var sawEOF bool
|
var sawEOF bool
|
||||||
@ -1863,6 +1892,9 @@ func (cc *ClientConn) encodeHeaders(req *http.Request, addGzipHeader bool, trail
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
if !httpguts.ValidHostHeader(host) {
|
||||||
|
return nil, errors.New("http2: invalid Host header")
|
||||||
|
}
|
||||||
|
|
||||||
var path string
|
var path string
|
||||||
if req.Method != "CONNECT" {
|
if req.Method != "CONNECT" {
|
||||||
@ -1899,7 +1931,7 @@ func (cc *ClientConn) encodeHeaders(req *http.Request, addGzipHeader bool, trail
|
|||||||
// 8.1.2.3 Request Pseudo-Header Fields
|
// 8.1.2.3 Request Pseudo-Header Fields
|
||||||
// The :path pseudo-header field includes the path and query parts of the
|
// The :path pseudo-header field includes the path and query parts of the
|
||||||
// target URI (the path-absolute production and optionally a '?' character
|
// target URI (the path-absolute production and optionally a '?' character
|
||||||
// followed by the query production (see Sections 3.3 and 3.4 of
|
// followed by the query production, see Sections 3.3 and 3.4 of
|
||||||
// [RFC3986]).
|
// [RFC3986]).
|
||||||
f(":authority", host)
|
f(":authority", host)
|
||||||
m := req.Method
|
m := req.Method
|
||||||
|
3
src/vendor/golang.org/x/net/http2/writesched.go
generated
vendored
3
src/vendor/golang.org/x/net/http2/writesched.go
generated
vendored
@ -184,7 +184,8 @@ func (wr *FrameWriteRequest) replyToWriter(err error) {
|
|||||||
|
|
||||||
// writeQueue is used by implementations of WriteScheduler.
|
// writeQueue is used by implementations of WriteScheduler.
|
||||||
type writeQueue struct {
|
type writeQueue struct {
|
||||||
s []FrameWriteRequest
|
s []FrameWriteRequest
|
||||||
|
prev, next *writeQueue
|
||||||
}
|
}
|
||||||
|
|
||||||
func (q *writeQueue) empty() bool { return len(q.s) == 0 }
|
func (q *writeQueue) empty() bool { return len(q.s) == 0 }
|
||||||
|
119
src/vendor/golang.org/x/net/http2/writesched_roundrobin.go
generated
vendored
Normal file
119
src/vendor/golang.org/x/net/http2/writesched_roundrobin.go
generated
vendored
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
// Copyright 2023 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package http2
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"math"
|
||||||
|
)
|
||||||
|
|
||||||
|
type roundRobinWriteScheduler struct {
|
||||||
|
// control contains control frames (SETTINGS, PING, etc.).
|
||||||
|
control writeQueue
|
||||||
|
|
||||||
|
// streams maps stream ID to a queue.
|
||||||
|
streams map[uint32]*writeQueue
|
||||||
|
|
||||||
|
// stream queues are stored in a circular linked list.
|
||||||
|
// head is the next stream to write, or nil if there are no streams open.
|
||||||
|
head *writeQueue
|
||||||
|
|
||||||
|
// pool of empty queues for reuse.
|
||||||
|
queuePool writeQueuePool
|
||||||
|
}
|
||||||
|
|
||||||
|
// newRoundRobinWriteScheduler constructs a new write scheduler.
|
||||||
|
// The round robin scheduler priorizes control frames
|
||||||
|
// like SETTINGS and PING over DATA frames.
|
||||||
|
// When there are no control frames to send, it performs a round-robin
|
||||||
|
// selection from the ready streams.
|
||||||
|
func newRoundRobinWriteScheduler() WriteScheduler {
|
||||||
|
ws := &roundRobinWriteScheduler{
|
||||||
|
streams: make(map[uint32]*writeQueue),
|
||||||
|
}
|
||||||
|
return ws
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ws *roundRobinWriteScheduler) OpenStream(streamID uint32, options OpenStreamOptions) {
|
||||||
|
if ws.streams[streamID] != nil {
|
||||||
|
panic(fmt.Errorf("stream %d already opened", streamID))
|
||||||
|
}
|
||||||
|
q := ws.queuePool.get()
|
||||||
|
ws.streams[streamID] = q
|
||||||
|
if ws.head == nil {
|
||||||
|
ws.head = q
|
||||||
|
q.next = q
|
||||||
|
q.prev = q
|
||||||
|
} else {
|
||||||
|
// Queues are stored in a ring.
|
||||||
|
// Insert the new stream before ws.head, putting it at the end of the list.
|
||||||
|
q.prev = ws.head.prev
|
||||||
|
q.next = ws.head
|
||||||
|
q.prev.next = q
|
||||||
|
q.next.prev = q
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ws *roundRobinWriteScheduler) CloseStream(streamID uint32) {
|
||||||
|
q := ws.streams[streamID]
|
||||||
|
if q == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if q.next == q {
|
||||||
|
// This was the only open stream.
|
||||||
|
ws.head = nil
|
||||||
|
} else {
|
||||||
|
q.prev.next = q.next
|
||||||
|
q.next.prev = q.prev
|
||||||
|
if ws.head == q {
|
||||||
|
ws.head = q.next
|
||||||
|
}
|
||||||
|
}
|
||||||
|
delete(ws.streams, streamID)
|
||||||
|
ws.queuePool.put(q)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ws *roundRobinWriteScheduler) AdjustStream(streamID uint32, priority PriorityParam) {}
|
||||||
|
|
||||||
|
func (ws *roundRobinWriteScheduler) Push(wr FrameWriteRequest) {
|
||||||
|
if wr.isControl() {
|
||||||
|
ws.control.push(wr)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
q := ws.streams[wr.StreamID()]
|
||||||
|
if q == nil {
|
||||||
|
// This is a closed stream.
|
||||||
|
// wr should not be a HEADERS or DATA frame.
|
||||||
|
// We push the request onto the control queue.
|
||||||
|
if wr.DataSize() > 0 {
|
||||||
|
panic("add DATA on non-open stream")
|
||||||
|
}
|
||||||
|
ws.control.push(wr)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
q.push(wr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ws *roundRobinWriteScheduler) Pop() (FrameWriteRequest, bool) {
|
||||||
|
// Control and RST_STREAM frames first.
|
||||||
|
if !ws.control.empty() {
|
||||||
|
return ws.control.shift(), true
|
||||||
|
}
|
||||||
|
if ws.head == nil {
|
||||||
|
return FrameWriteRequest{}, false
|
||||||
|
}
|
||||||
|
q := ws.head
|
||||||
|
for {
|
||||||
|
if wr, ok := q.consume(math.MaxInt32); ok {
|
||||||
|
ws.head = q.next
|
||||||
|
return wr, true
|
||||||
|
}
|
||||||
|
q = q.next
|
||||||
|
if q == ws.head {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return FrameWriteRequest{}, false
|
||||||
|
}
|
2
src/vendor/golang.org/x/net/idna/idna9.0.0.go
generated
vendored
2
src/vendor/golang.org/x/net/idna/idna9.0.0.go
generated
vendored
@ -121,7 +121,7 @@ func CheckJoiners(enable bool) Option {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// StrictDomainName limits the set of permissable ASCII characters to those
|
// StrictDomainName limits the set of permissible ASCII characters to those
|
||||||
// allowed in domain names as defined in RFC 1034 (A-Z, a-z, 0-9 and the
|
// allowed in domain names as defined in RFC 1034 (A-Z, a-z, 0-9 and the
|
||||||
// hyphen). This is set by default for MapForLookup and ValidateForRegistration,
|
// hyphen). This is set by default for MapForLookup and ValidateForRegistration,
|
||||||
// but is only useful if ValidateLabels is set.
|
// but is only useful if ValidateLabels is set.
|
||||||
|
2988
src/vendor/golang.org/x/net/idna/tables13.0.0.go
generated
vendored
2988
src/vendor/golang.org/x/net/idna/tables13.0.0.go
generated
vendored
File diff suppressed because it is too large
Load Diff
5145
src/vendor/golang.org/x/net/idna/tables15.0.0.go
generated
vendored
Normal file
5145
src/vendor/golang.org/x/net/idna/tables15.0.0.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
21
src/vendor/golang.org/x/net/idna/trie.go
generated
vendored
21
src/vendor/golang.org/x/net/idna/trie.go
generated
vendored
@ -6,27 +6,6 @@
|
|||||||
|
|
||||||
package idna
|
package idna
|
||||||
|
|
||||||
// appendMapping appends the mapping for the respective rune. isMapped must be
|
|
||||||
// true. A mapping is a categorization of a rune as defined in UTS #46.
|
|
||||||
func (c info) appendMapping(b []byte, s string) []byte {
|
|
||||||
index := int(c >> indexShift)
|
|
||||||
if c&xorBit == 0 {
|
|
||||||
s := mappings[index:]
|
|
||||||
return append(b, s[1:s[0]+1]...)
|
|
||||||
}
|
|
||||||
b = append(b, s...)
|
|
||||||
if c&inlineXOR == inlineXOR {
|
|
||||||
// TODO: support and handle two-byte inline masks
|
|
||||||
b[len(b)-1] ^= byte(index)
|
|
||||||
} else {
|
|
||||||
for p := len(b) - int(xorData[index]); p < len(b); p++ {
|
|
||||||
index++
|
|
||||||
b[p] ^= xorData[index]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return b
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sparse block handling code.
|
// Sparse block handling code.
|
||||||
|
|
||||||
type valueRange struct {
|
type valueRange struct {
|
||||||
|
31
src/vendor/golang.org/x/net/idna/trie12.0.0.go
generated
vendored
Normal file
31
src/vendor/golang.org/x/net/idna/trie12.0.0.go
generated
vendored
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
||||||
|
|
||||||
|
// Copyright 2016 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
//go:build !go1.16
|
||||||
|
// +build !go1.16
|
||||||
|
|
||||||
|
package idna
|
||||||
|
|
||||||
|
// appendMapping appends the mapping for the respective rune. isMapped must be
|
||||||
|
// true. A mapping is a categorization of a rune as defined in UTS #46.
|
||||||
|
func (c info) appendMapping(b []byte, s string) []byte {
|
||||||
|
index := int(c >> indexShift)
|
||||||
|
if c&xorBit == 0 {
|
||||||
|
s := mappings[index:]
|
||||||
|
return append(b, s[1:s[0]+1]...)
|
||||||
|
}
|
||||||
|
b = append(b, s...)
|
||||||
|
if c&inlineXOR == inlineXOR {
|
||||||
|
// TODO: support and handle two-byte inline masks
|
||||||
|
b[len(b)-1] ^= byte(index)
|
||||||
|
} else {
|
||||||
|
for p := len(b) - int(xorData[index]); p < len(b); p++ {
|
||||||
|
index++
|
||||||
|
b[p] ^= xorData[index]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return b
|
||||||
|
}
|
31
src/vendor/golang.org/x/net/idna/trie13.0.0.go
generated
vendored
Normal file
31
src/vendor/golang.org/x/net/idna/trie13.0.0.go
generated
vendored
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
||||||
|
|
||||||
|
// Copyright 2016 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
//go:build go1.16
|
||||||
|
// +build go1.16
|
||||||
|
|
||||||
|
package idna
|
||||||
|
|
||||||
|
// appendMapping appends the mapping for the respective rune. isMapped must be
|
||||||
|
// true. A mapping is a categorization of a rune as defined in UTS #46.
|
||||||
|
func (c info) appendMapping(b []byte, s string) []byte {
|
||||||
|
index := int(c >> indexShift)
|
||||||
|
if c&xorBit == 0 {
|
||||||
|
p := index
|
||||||
|
return append(b, mappings[mappingIndex[p]:mappingIndex[p+1]]...)
|
||||||
|
}
|
||||||
|
b = append(b, s...)
|
||||||
|
if c&inlineXOR == inlineXOR {
|
||||||
|
// TODO: support and handle two-byte inline masks
|
||||||
|
b[len(b)-1] ^= byte(index)
|
||||||
|
} else {
|
||||||
|
for p := len(b) - int(xorData[index]); p < len(b); p++ {
|
||||||
|
index++
|
||||||
|
b[p] ^= xorData[index]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return b
|
||||||
|
}
|
30
src/vendor/golang.org/x/sys/internal/unsafeheader/unsafeheader.go
generated
vendored
30
src/vendor/golang.org/x/sys/internal/unsafeheader/unsafeheader.go
generated
vendored
@ -1,30 +0,0 @@
|
|||||||
// Copyright 2020 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// Package unsafeheader contains header declarations for the Go runtime's
|
|
||||||
// slice and string implementations.
|
|
||||||
//
|
|
||||||
// This package allows x/sys to use types equivalent to
|
|
||||||
// reflect.SliceHeader and reflect.StringHeader without introducing
|
|
||||||
// a dependency on the (relatively heavy) "reflect" package.
|
|
||||||
package unsafeheader
|
|
||||||
|
|
||||||
import (
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Slice is the runtime representation of a slice.
|
|
||||||
// It cannot be used safely or portably and its representation may change in a later release.
|
|
||||||
type Slice struct {
|
|
||||||
Data unsafe.Pointer
|
|
||||||
Len int
|
|
||||||
Cap int
|
|
||||||
}
|
|
||||||
|
|
||||||
// String is the runtime representation of a string.
|
|
||||||
// It cannot be used safely or portably and its representation may change in a later release.
|
|
||||||
type String struct {
|
|
||||||
Data unsafe.Pointer
|
|
||||||
Len int
|
|
||||||
}
|
|
2
src/vendor/golang.org/x/sys/unix/mkall.sh
generated
vendored
2
src/vendor/golang.org/x/sys/unix/mkall.sh
generated
vendored
@ -50,7 +50,7 @@ if [[ "$GOOS" = "linux" ]]; then
|
|||||||
# Use the Docker-based build system
|
# Use the Docker-based build system
|
||||||
# Files generated through docker (use $cmd so you can Ctl-C the build or run)
|
# Files generated through docker (use $cmd so you can Ctl-C the build or run)
|
||||||
$cmd docker build --tag generate:$GOOS $GOOS
|
$cmd docker build --tag generate:$GOOS $GOOS
|
||||||
$cmd docker run --interactive --tty --volume $(cd -- "$(dirname -- "$0")/.." && /bin/pwd):/build generate:$GOOS
|
$cmd docker run --interactive --tty --volume $(cd -- "$(dirname -- "$0")/.." && pwd):/build generate:$GOOS
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
11
src/vendor/golang.org/x/sys/unix/mkerrors.sh
generated
vendored
11
src/vendor/golang.org/x/sys/unix/mkerrors.sh
generated
vendored
@ -519,7 +519,7 @@ ccflags="$@"
|
|||||||
$2 ~ /^LOCK_(SH|EX|NB|UN)$/ ||
|
$2 ~ /^LOCK_(SH|EX|NB|UN)$/ ||
|
||||||
$2 ~ /^LO_(KEY|NAME)_SIZE$/ ||
|
$2 ~ /^LO_(KEY|NAME)_SIZE$/ ||
|
||||||
$2 ~ /^LOOP_(CLR|CTL|GET|SET)_/ ||
|
$2 ~ /^LOOP_(CLR|CTL|GET|SET)_/ ||
|
||||||
$2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|TCP|MCAST|EVFILT|NOTE|SHUT|PROT|MAP|MFD|T?PACKET|MSG|SCM|MCL|DT|MADV|PR|LOCAL|TCPOPT|UDP)_/ ||
|
$2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|TCP|MCAST|EVFILT|NOTE|SHUT|PROT|MAP|MREMAP|MFD|T?PACKET|MSG|SCM|MCL|DT|MADV|PR|LOCAL|TCPOPT|UDP)_/ ||
|
||||||
$2 ~ /^NFC_(GENL|PROTO|COMM|RF|SE|DIRECTION|LLCP|SOCKPROTO)_/ ||
|
$2 ~ /^NFC_(GENL|PROTO|COMM|RF|SE|DIRECTION|LLCP|SOCKPROTO)_/ ||
|
||||||
$2 ~ /^NFC_.*_(MAX)?SIZE$/ ||
|
$2 ~ /^NFC_.*_(MAX)?SIZE$/ ||
|
||||||
$2 ~ /^RAW_PAYLOAD_/ ||
|
$2 ~ /^RAW_PAYLOAD_/ ||
|
||||||
@ -583,6 +583,7 @@ ccflags="$@"
|
|||||||
$2 ~ /^PERF_/ ||
|
$2 ~ /^PERF_/ ||
|
||||||
$2 ~ /^SECCOMP_MODE_/ ||
|
$2 ~ /^SECCOMP_MODE_/ ||
|
||||||
$2 ~ /^SEEK_/ ||
|
$2 ~ /^SEEK_/ ||
|
||||||
|
$2 ~ /^SCHED_/ ||
|
||||||
$2 ~ /^SPLICE_/ ||
|
$2 ~ /^SPLICE_/ ||
|
||||||
$2 ~ /^SYNC_FILE_RANGE_/ ||
|
$2 ~ /^SYNC_FILE_RANGE_/ ||
|
||||||
$2 !~ /IOC_MAGIC/ &&
|
$2 !~ /IOC_MAGIC/ &&
|
||||||
@ -624,7 +625,7 @@ ccflags="$@"
|
|||||||
$2 ~ /^MEM/ ||
|
$2 ~ /^MEM/ ||
|
||||||
$2 ~ /^WG/ ||
|
$2 ~ /^WG/ ||
|
||||||
$2 ~ /^FIB_RULE_/ ||
|
$2 ~ /^FIB_RULE_/ ||
|
||||||
$2 ~ /^BLK[A-Z]*(GET$|SET$|BUF$|PART$|SIZE)/ {printf("\t%s = C.%s\n", $2, $2)}
|
$2 ~ /^BLK[A-Z]*(GET$|SET$|BUF$|PART$|SIZE|IOMIN$|IOOPT$|ALIGNOFF$|DISCARD|ROTATIONAL$|ZEROOUT$|GETDISKSEQ$)/ {printf("\t%s = C.%s\n", $2, $2)}
|
||||||
$2 ~ /^__WCOREFLAG$/ {next}
|
$2 ~ /^__WCOREFLAG$/ {next}
|
||||||
$2 ~ /^__W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", substr($2,3), $2)}
|
$2 ~ /^__W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", substr($2,3), $2)}
|
||||||
|
|
||||||
@ -741,7 +742,8 @@ main(void)
|
|||||||
e = errors[i].num;
|
e = errors[i].num;
|
||||||
if(i > 0 && errors[i-1].num == e)
|
if(i > 0 && errors[i-1].num == e)
|
||||||
continue;
|
continue;
|
||||||
strcpy(buf, strerror(e));
|
strncpy(buf, strerror(e), sizeof(buf) - 1);
|
||||||
|
buf[sizeof(buf) - 1] = '\0';
|
||||||
// lowercase first letter: Bad -> bad, but STREAM -> STREAM.
|
// lowercase first letter: Bad -> bad, but STREAM -> STREAM.
|
||||||
if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z)
|
if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z)
|
||||||
buf[0] += a - A;
|
buf[0] += a - A;
|
||||||
@ -760,7 +762,8 @@ main(void)
|
|||||||
e = signals[i].num;
|
e = signals[i].num;
|
||||||
if(i > 0 && signals[i-1].num == e)
|
if(i > 0 && signals[i-1].num == e)
|
||||||
continue;
|
continue;
|
||||||
strcpy(buf, strsignal(e));
|
strncpy(buf, strsignal(e), sizeof(buf) - 1);
|
||||||
|
buf[sizeof(buf) - 1] = '\0';
|
||||||
// lowercase first letter: Bad -> bad, but STREAM -> STREAM.
|
// lowercase first letter: Bad -> bad, but STREAM -> STREAM.
|
||||||
if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z)
|
if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z)
|
||||||
buf[0] += a - A;
|
buf[0] += a - A;
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user