[chore] update otel -> v1.20.0 (#2358)
This commit is contained in:
parent
deaea100c3
commit
7753f42132
24
go.mod
24
go.mod
|
@ -55,11 +55,11 @@ require (
|
||||||
github.com/uptrace/bun/extra/bunotel v1.1.16
|
github.com/uptrace/bun/extra/bunotel v1.1.16
|
||||||
github.com/wagslane/go-password-validator v0.3.0
|
github.com/wagslane/go-password-validator v0.3.0
|
||||||
github.com/yuin/goldmark v1.6.0
|
github.com/yuin/goldmark v1.6.0
|
||||||
go.opentelemetry.io/otel v1.19.0
|
go.opentelemetry.io/otel v1.20.0
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.20.0
|
||||||
go.opentelemetry.io/otel/sdk v1.19.0
|
go.opentelemetry.io/otel/sdk v1.20.0
|
||||||
go.opentelemetry.io/otel/trace v1.19.0
|
go.opentelemetry.io/otel/trace v1.20.0
|
||||||
go.uber.org/automaxprocs v1.5.3
|
go.uber.org/automaxprocs v1.5.3
|
||||||
golang.org/x/crypto v0.14.0
|
golang.org/x/crypto v0.14.0
|
||||||
golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1
|
golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1
|
||||||
|
@ -102,7 +102,7 @@ require (
|
||||||
github.com/gin-contrib/sse v0.1.0 // indirect
|
github.com/gin-contrib/sse v0.1.0 // indirect
|
||||||
github.com/go-errors/errors v1.4.1 // indirect
|
github.com/go-errors/errors v1.4.1 // indirect
|
||||||
github.com/go-jose/go-jose/v3 v3.0.0 // indirect
|
github.com/go-jose/go-jose/v3 v3.0.0 // indirect
|
||||||
github.com/go-logr/logr v1.2.4 // indirect
|
github.com/go-logr/logr v1.3.0 // indirect
|
||||||
github.com/go-logr/stdr v1.2.2 // indirect
|
github.com/go-logr/stdr v1.2.2 // indirect
|
||||||
github.com/go-playground/locales v0.14.1 // indirect
|
github.com/go-playground/locales v0.14.1 // indirect
|
||||||
github.com/go-playground/universal-translator v0.18.1 // indirect
|
github.com/go-playground/universal-translator v0.18.1 // indirect
|
||||||
|
@ -156,18 +156,18 @@ require (
|
||||||
github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.2 // indirect
|
github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.2 // indirect
|
||||||
github.com/vmihailenco/msgpack/v5 v5.3.5 // indirect
|
github.com/vmihailenco/msgpack/v5 v5.3.5 // indirect
|
||||||
github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
|
github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 // indirect
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0 // indirect
|
||||||
go.opentelemetry.io/otel/metric v1.19.0 // indirect
|
go.opentelemetry.io/otel/metric v1.20.0 // indirect
|
||||||
go.opentelemetry.io/proto/otlp v1.0.0 // indirect
|
go.opentelemetry.io/proto/otlp v1.0.0 // indirect
|
||||||
golang.org/x/arch v0.3.0 // indirect
|
golang.org/x/arch v0.3.0 // indirect
|
||||||
golang.org/x/mod v0.12.0 // indirect
|
golang.org/x/mod v0.12.0 // indirect
|
||||||
golang.org/x/sync v0.3.0 // indirect
|
golang.org/x/sync v0.3.0 // indirect
|
||||||
golang.org/x/sys v0.13.0 // indirect
|
golang.org/x/sys v0.14.0 // indirect
|
||||||
golang.org/x/tools v0.13.0 // indirect
|
golang.org/x/tools v0.13.0 // indirect
|
||||||
google.golang.org/appengine v1.6.8 // indirect
|
google.golang.org/appengine v1.6.8 // indirect
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 // indirect
|
google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d // indirect
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 // indirect
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect
|
||||||
google.golang.org/grpc v1.58.3 // indirect
|
google.golang.org/grpc v1.59.0 // indirect
|
||||||
google.golang.org/protobuf v1.31.0 // indirect
|
google.golang.org/protobuf v1.31.0 // indirect
|
||||||
gopkg.in/ini.v1 v1.67.0 // indirect
|
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
|
|
64
go.sum
64
go.sum
|
@ -196,8 +196,8 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2
|
||||||
github.com/go-jose/go-jose/v3 v3.0.0 h1:s6rrhirfEP/CGIoc6p+PZAeogN2SxKav6Wp7+dyMWVo=
|
github.com/go-jose/go-jose/v3 v3.0.0 h1:s6rrhirfEP/CGIoc6p+PZAeogN2SxKav6Wp7+dyMWVo=
|
||||||
github.com/go-jose/go-jose/v3 v3.0.0/go.mod h1:RNkWWRld676jZEYoV3+XK8L2ZnNSvIsxFMht0mSX+u8=
|
github.com/go-jose/go-jose/v3 v3.0.0/go.mod h1:RNkWWRld676jZEYoV3+XK8L2ZnNSvIsxFMht0mSX+u8=
|
||||||
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.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
|
github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=
|
||||||
github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
|
||||||
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=
|
||||||
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
|
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
|
||||||
|
@ -232,8 +232,8 @@ github.com/golang/geo v0.0.0-20200319012246-673a6f80352d/go.mod h1:QZ0nwyI2jOfgR
|
||||||
github.com/golang/geo v0.0.0-20210211234256-740aa86cb551 h1:gtexQ/VGyN+VVFRXSFiguSNcXmS6rkKT+X7FdIrTtfo=
|
github.com/golang/geo v0.0.0-20210211234256-740aa86cb551 h1:gtexQ/VGyN+VVFRXSFiguSNcXmS6rkKT+X7FdIrTtfo=
|
||||||
github.com/golang/geo v0.0.0-20210211234256-740aa86cb551/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
|
github.com/golang/geo v0.0.0-20210211234256-740aa86cb551/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
|
||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||||
github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE=
|
github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo=
|
||||||
github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ=
|
github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ=
|
||||||
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
|
@ -278,8 +278,8 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
|
||||||
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||||
github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk=
|
github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk=
|
||||||
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
|
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
|
||||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
|
@ -579,26 +579,26 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
|
go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
|
||||||
go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=
|
go.opentelemetry.io/otel v1.20.0 h1:vsb/ggIY+hUjD/zCAQHpzTmndPqv/ml2ArbsbfBYTAc=
|
||||||
go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=
|
go.opentelemetry.io/otel v1.20.0/go.mod h1:oUIGj3D77RwJdM6PPZImDpSZGDvkD9fhesHny69JFrs=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0 h1:DeFD0VgTZ+Cj6hxravYYZE2W4GlneVH81iAOPjZkzk8=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0/go.mod h1:GijYcYmNpX1KazD5JmWGsi4P7dDTTTnfv1UbGn84MnU=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0 h1:3d+S281UTjM+AbF31XSOYn1qXn3BgIdWl8HNEpx08Jk=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0 h1:gvmNvqrPYovvyRmCSygkUDyL8lC5Tl845MLEwqpxhEU=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0/go.mod h1:0+KuTDyKL4gjKCF75pHOX4wuzYDUZYfAQdSu43o+Z2I=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0/go.mod h1:vNUq47TGFioo+ffTSnKNdob241vePmtNZnAODKapKd0=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 h1:IeMeyr1aBvBiPVYihXIaeIZba6b8E1bYp7lbdxK8CQg=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.20.0 h1:CsBiKCiQPdSjS+MlRiqeTI9JDDpSuk0Hb6QTRfwer8k=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0/go.mod h1:oVdCUtjq9MK9BlS7TtucsQwUcXcymNiEDjgDD2jMtZU=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.20.0/go.mod h1:CMJYNAfooOwSZSAmAeMUV1M+TXld3BiK++z9fqIm2xk=
|
||||||
go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=
|
go.opentelemetry.io/otel/metric v1.20.0 h1:ZlrO8Hu9+GAhnepmRGhSU7/VkpjrNowxRN9GyKR4wzA=
|
||||||
go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=
|
go.opentelemetry.io/otel/metric v1.20.0/go.mod h1:90DRw3nfK4D7Sm/75yQ00gTJxtkBxX+wu6YaNymbpVM=
|
||||||
go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=
|
go.opentelemetry.io/otel/sdk v1.20.0 h1:5Jf6imeFZlZtKv9Qbo6qt2ZkmWtdWx/wzcCbNUlAWGM=
|
||||||
go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=
|
go.opentelemetry.io/otel/sdk v1.20.0/go.mod h1:rmkSx1cZCm/tn16iWDn1GQbLtsW/LvsdEEFzCSRM6V0=
|
||||||
go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=
|
go.opentelemetry.io/otel/trace v1.20.0 h1:+yxVAPZPbQhbC3OfAkeIVTky6iTFpcr4SiY9om7mXSQ=
|
||||||
go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=
|
go.opentelemetry.io/otel/trace v1.20.0/go.mod h1:HJSK7F/hA5RlzpZ0zKDCHCDHm556LCDtKaAo6JmBFUU=
|
||||||
go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=
|
go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=
|
||||||
go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=
|
go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=
|
||||||
go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8=
|
go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8=
|
||||||
go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0=
|
go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0=
|
||||||
go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A=
|
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
||||||
go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4=
|
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
||||||
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
|
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
|
||||||
golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k=
|
golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k=
|
||||||
golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
|
golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
|
||||||
|
@ -766,8 +766,8 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc
|
||||||
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.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
|
golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q=
|
||||||
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
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.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek=
|
golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek=
|
||||||
|
@ -905,12 +905,12 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D
|
||||||
google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 h1:Z0hjGZePRE0ZBWotvtrwxFNrNE9CUAGtplaDK5NNI/g=
|
google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d h1:VBu5YqKPv6XiJ199exd8Br+Aetz+o08F+PLMnwJQHAY=
|
||||||
google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98/go.mod h1:S7mY02OqCJTD0E1OiQy1F72PWFB4bZJ87cAtLPYgDR0=
|
google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4=
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 h1:FmF5cCW94Ij59cfpoLiwTgodWmm60eEV0CjlsVg2fuw=
|
google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q=
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ=
|
google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk=
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 h1:bVf09lpb+OJbByTj913DRJioFFAjf/ZGxEz7MajTp2U=
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4=
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM=
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M=
|
||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||||
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
||||||
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
||||||
|
@ -927,8 +927,8 @@ google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM
|
||||||
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
|
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
|
||||||
google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
|
google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
|
||||||
google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
||||||
google.golang.org/grpc v1.58.3 h1:BjnpXut1btbtgN/6sp+brB2Kbm2LjNXnidYujAVbSoQ=
|
google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=
|
||||||
google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0=
|
google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=
|
||||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||||
|
|
|
@ -34,8 +34,8 @@ import (
|
||||||
"go.opentelemetry.io/otel/propagation"
|
"go.opentelemetry.io/otel/propagation"
|
||||||
"go.opentelemetry.io/otel/sdk/resource"
|
"go.opentelemetry.io/otel/sdk/resource"
|
||||||
"go.opentelemetry.io/otel/sdk/trace"
|
"go.opentelemetry.io/otel/sdk/trace"
|
||||||
semconv "go.opentelemetry.io/otel/semconv/v1.17.0"
|
semconv "go.opentelemetry.io/otel/semconv/v1.20.0"
|
||||||
"go.opentelemetry.io/otel/semconv/v1.17.0/httpconv"
|
httpconv "go.opentelemetry.io/otel/semconv/v1.20.0/httpconv"
|
||||||
oteltrace "go.opentelemetry.io/otel/trace"
|
oteltrace "go.opentelemetry.io/otel/trace"
|
||||||
|
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/config"
|
"github.com/superseriousbusiness/gotosocial/internal/config"
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
# A minimal logging API for Go
|
# A minimal logging API for Go
|
||||||
|
|
||||||
[![Go Reference](https://pkg.go.dev/badge/github.com/go-logr/logr.svg)](https://pkg.go.dev/github.com/go-logr/logr)
|
[![Go Reference](https://pkg.go.dev/badge/github.com/go-logr/logr.svg)](https://pkg.go.dev/github.com/go-logr/logr)
|
||||||
|
[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/go-logr/logr/badge)](https://securityscorecards.dev/viewer/?platform=github.com&org=go-logr&repo=logr)
|
||||||
|
|
||||||
logr offers an(other) opinion on how Go programs and libraries can do logging
|
logr offers an(other) opinion on how Go programs and libraries can do logging
|
||||||
without becoming coupled to a particular logging implementation. This is not
|
without becoming coupled to a particular logging implementation. This is not
|
||||||
|
@ -73,6 +74,29 @@ received:
|
||||||
If the Go standard library had defined an interface for logging, this project
|
If the Go standard library had defined an interface for logging, this project
|
||||||
probably would not be needed. Alas, here we are.
|
probably would not be needed. Alas, here we are.
|
||||||
|
|
||||||
|
When the Go developers started developing such an interface with
|
||||||
|
[slog](https://github.com/golang/go/issues/56345), they adopted some of the
|
||||||
|
logr design but also left out some parts and changed others:
|
||||||
|
|
||||||
|
| Feature | logr | slog |
|
||||||
|
|---------|------|------|
|
||||||
|
| High-level API | `Logger` (passed by value) | `Logger` (passed by [pointer](https://github.com/golang/go/issues/59126)) |
|
||||||
|
| Low-level API | `LogSink` | `Handler` |
|
||||||
|
| Stack unwinding | done by `LogSink` | done by `Logger` |
|
||||||
|
| Skipping helper functions | `WithCallDepth`, `WithCallStackHelper` | [not supported by Logger](https://github.com/golang/go/issues/59145) |
|
||||||
|
| Generating a value for logging on demand | `Marshaler` | `LogValuer` |
|
||||||
|
| Log levels | >= 0, higher meaning "less important" | positive and negative, with 0 for "info" and higher meaning "more important" |
|
||||||
|
| Error log entries | always logged, don't have a verbosity level | normal log entries with level >= `LevelError` |
|
||||||
|
| Passing logger via context | `NewContext`, `FromContext` | no API |
|
||||||
|
| Adding a name to a logger | `WithName` | no API |
|
||||||
|
| Modify verbosity of log entries in a call chain | `V` | no API |
|
||||||
|
| Grouping of key/value pairs | not supported | `WithGroup`, `GroupValue` |
|
||||||
|
|
||||||
|
The high-level slog API is explicitly meant to be one of many different APIs
|
||||||
|
that can be layered on top of a shared `slog.Handler`. logr is one such
|
||||||
|
alternative API, with [interoperability](#slog-interoperability) provided by the [`slogr`](slogr)
|
||||||
|
package.
|
||||||
|
|
||||||
### Inspiration
|
### Inspiration
|
||||||
|
|
||||||
Before you consider this package, please read [this blog post by the
|
Before you consider this package, please read [this blog post by the
|
||||||
|
@ -118,6 +142,91 @@ There are implementations for the following logging libraries:
|
||||||
- **github.com/go-kit/log**: [gokitlogr](https://github.com/tonglil/gokitlogr) (also compatible with github.com/go-kit/kit/log since v0.12.0)
|
- **github.com/go-kit/log**: [gokitlogr](https://github.com/tonglil/gokitlogr) (also compatible with github.com/go-kit/kit/log since v0.12.0)
|
||||||
- **bytes.Buffer** (writing to a buffer): [bufrlogr](https://github.com/tonglil/buflogr) (useful for ensuring values were logged, like during testing)
|
- **bytes.Buffer** (writing to a buffer): [bufrlogr](https://github.com/tonglil/buflogr) (useful for ensuring values were logged, like during testing)
|
||||||
|
|
||||||
|
## slog interoperability
|
||||||
|
|
||||||
|
Interoperability goes both ways, using the `logr.Logger` API with a `slog.Handler`
|
||||||
|
and using the `slog.Logger` API with a `logr.LogSink`. [slogr](./slogr) provides `NewLogr` and
|
||||||
|
`NewSlogHandler` API calls to convert between a `logr.Logger` and a `slog.Handler`.
|
||||||
|
As usual, `slog.New` can be used to wrap such a `slog.Handler` in the high-level
|
||||||
|
slog API. `slogr` itself leaves that to the caller.
|
||||||
|
|
||||||
|
## Using a `logr.Sink` as backend for slog
|
||||||
|
|
||||||
|
Ideally, a logr sink implementation should support both logr and slog by
|
||||||
|
implementing both the normal logr interface(s) and `slogr.SlogSink`. Because
|
||||||
|
of a conflict in the parameters of the common `Enabled` method, it is [not
|
||||||
|
possible to implement both slog.Handler and logr.Sink in the same
|
||||||
|
type](https://github.com/golang/go/issues/59110).
|
||||||
|
|
||||||
|
If both are supported, log calls can go from the high-level APIs to the backend
|
||||||
|
without the need to convert parameters. `NewLogr` and `NewSlogHandler` can
|
||||||
|
convert back and forth without adding additional wrappers, with one exception:
|
||||||
|
when `Logger.V` was used to adjust the verbosity for a `slog.Handler`, then
|
||||||
|
`NewSlogHandler` has to use a wrapper which adjusts the verbosity for future
|
||||||
|
log calls.
|
||||||
|
|
||||||
|
Such an implementation should also support values that implement specific
|
||||||
|
interfaces from both packages for logging (`logr.Marshaler`, `slog.LogValuer`,
|
||||||
|
`slog.GroupValue`). logr does not convert those.
|
||||||
|
|
||||||
|
Not supporting slog has several drawbacks:
|
||||||
|
- Recording source code locations works correctly if the handler gets called
|
||||||
|
through `slog.Logger`, but may be wrong in other cases. That's because a
|
||||||
|
`logr.Sink` does its own stack unwinding instead of using the program counter
|
||||||
|
provided by the high-level API.
|
||||||
|
- slog levels <= 0 can be mapped to logr levels by negating the level without a
|
||||||
|
loss of information. But all slog levels > 0 (e.g. `slog.LevelWarning` as
|
||||||
|
used by `slog.Logger.Warn`) must be mapped to 0 before calling the sink
|
||||||
|
because logr does not support "more important than info" levels.
|
||||||
|
- The slog group concept is supported by prefixing each key in a key/value
|
||||||
|
pair with the group names, separated by a dot. For structured output like
|
||||||
|
JSON it would be better to group the key/value pairs inside an object.
|
||||||
|
- Special slog values and interfaces don't work as expected.
|
||||||
|
- The overhead is likely to be higher.
|
||||||
|
|
||||||
|
These drawbacks are severe enough that applications using a mixture of slog and
|
||||||
|
logr should switch to a different backend.
|
||||||
|
|
||||||
|
## Using a `slog.Handler` as backend for logr
|
||||||
|
|
||||||
|
Using a plain `slog.Handler` without support for logr works better than the
|
||||||
|
other direction:
|
||||||
|
- All logr verbosity levels can be mapped 1:1 to their corresponding slog level
|
||||||
|
by negating them.
|
||||||
|
- Stack unwinding is done by the `slogr.SlogSink` and the resulting program
|
||||||
|
counter is passed to the `slog.Handler`.
|
||||||
|
- Names added via `Logger.WithName` are gathered and recorded in an additional
|
||||||
|
attribute with `logger` as key and the names separated by slash as value.
|
||||||
|
- `Logger.Error` is turned into a log record with `slog.LevelError` as level
|
||||||
|
and an additional attribute with `err` as key, if an error was provided.
|
||||||
|
|
||||||
|
The main drawback is that `logr.Marshaler` will not be supported. Types should
|
||||||
|
ideally support both `logr.Marshaler` and `slog.Valuer`. If compatibility
|
||||||
|
with logr implementations without slog support is not important, then
|
||||||
|
`slog.Valuer` is sufficient.
|
||||||
|
|
||||||
|
## Context support for slog
|
||||||
|
|
||||||
|
Storing a logger in a `context.Context` is not supported by
|
||||||
|
slog. `logr.NewContext` and `logr.FromContext` can be used with slog like this
|
||||||
|
to fill this gap:
|
||||||
|
|
||||||
|
func HandlerFromContext(ctx context.Context) slog.Handler {
|
||||||
|
logger, err := logr.FromContext(ctx)
|
||||||
|
if err == nil {
|
||||||
|
return slogr.NewSlogHandler(logger)
|
||||||
|
}
|
||||||
|
return slog.Default().Handler()
|
||||||
|
}
|
||||||
|
|
||||||
|
func ContextWithHandler(ctx context.Context, handler slog.Handler) context.Context {
|
||||||
|
return logr.NewContext(ctx, slogr.NewLogr(handler))
|
||||||
|
}
|
||||||
|
|
||||||
|
The downside is that storing and retrieving a `slog.Handler` needs more
|
||||||
|
allocations compared to using a `logr.Logger`. Therefore the recommendation is
|
||||||
|
to use the `logr.Logger` API in code which uses contextual logging.
|
||||||
|
|
||||||
## FAQ
|
## FAQ
|
||||||
|
|
||||||
### Conceptual
|
### Conceptual
|
||||||
|
@ -241,7 +350,9 @@ Otherwise, you can start out with `0` as "you always want to see this",
|
||||||
|
|
||||||
Then gradually choose levels in between as you need them, working your way
|
Then gradually choose levels in between as you need them, working your way
|
||||||
down from 10 (for debug and trace style logs) and up from 1 (for chattier
|
down from 10 (for debug and trace style logs) and up from 1 (for chattier
|
||||||
info-type logs.)
|
info-type logs). For reference, slog pre-defines -4 for debug logs
|
||||||
|
(corresponds to 4 in logr), which matches what is
|
||||||
|
[recommended for Kubernetes](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-instrumentation/logging.md#what-method-to-use).
|
||||||
|
|
||||||
#### How do I choose my keys?
|
#### How do I choose my keys?
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
# Security Policy
|
||||||
|
|
||||||
|
If you have discovered a security vulnerability in this project, please report it
|
||||||
|
privately. **Do not disclose it as a public issue.** This gives us time to work with you
|
||||||
|
to fix the issue before public exposure, reducing the chance that the exploit will be
|
||||||
|
used before a patch is released.
|
||||||
|
|
||||||
|
You may submit the report in the following ways:
|
||||||
|
|
||||||
|
- send an email to go-logr-security@googlegroups.com
|
||||||
|
- send us a [private vulnerability report](https://github.com/go-logr/logr/security/advisories/new)
|
||||||
|
|
||||||
|
Please provide the following information in your report:
|
||||||
|
|
||||||
|
- A description of the vulnerability and its impact
|
||||||
|
- How to reproduce the issue
|
||||||
|
|
||||||
|
We ask that you give us 90 days to work on a fix before public exposure.
|
|
@ -116,17 +116,17 @@ type Options struct {
|
||||||
// Equivalent hooks are offered for key-value pairs saved via
|
// Equivalent hooks are offered for key-value pairs saved via
|
||||||
// logr.Logger.WithValues or Formatter.AddValues (see RenderValuesHook) and
|
// logr.Logger.WithValues or Formatter.AddValues (see RenderValuesHook) and
|
||||||
// for user-provided pairs (see RenderArgsHook).
|
// for user-provided pairs (see RenderArgsHook).
|
||||||
RenderBuiltinsHook func(kvList []interface{}) []interface{}
|
RenderBuiltinsHook func(kvList []any) []any
|
||||||
|
|
||||||
// RenderValuesHook is the same as RenderBuiltinsHook, except that it is
|
// RenderValuesHook is the same as RenderBuiltinsHook, except that it is
|
||||||
// only called for key-value pairs saved via logr.Logger.WithValues. See
|
// only called for key-value pairs saved via logr.Logger.WithValues. See
|
||||||
// RenderBuiltinsHook for more details.
|
// RenderBuiltinsHook for more details.
|
||||||
RenderValuesHook func(kvList []interface{}) []interface{}
|
RenderValuesHook func(kvList []any) []any
|
||||||
|
|
||||||
// RenderArgsHook is the same as RenderBuiltinsHook, except that it is only
|
// RenderArgsHook is the same as RenderBuiltinsHook, except that it is only
|
||||||
// called for key-value pairs passed directly to Info and Error. See
|
// called for key-value pairs passed directly to Info and Error. See
|
||||||
// RenderBuiltinsHook for more details.
|
// RenderBuiltinsHook for more details.
|
||||||
RenderArgsHook func(kvList []interface{}) []interface{}
|
RenderArgsHook func(kvList []any) []any
|
||||||
|
|
||||||
// MaxLogDepth tells funcr how many levels of nested fields (e.g. a struct
|
// MaxLogDepth tells funcr how many levels of nested fields (e.g. a struct
|
||||||
// that contains a struct, etc.) it may log. Every time it finds a struct,
|
// that contains a struct, etc.) it may log. Every time it finds a struct,
|
||||||
|
@ -163,7 +163,7 @@ func (l fnlogger) WithName(name string) logr.LogSink {
|
||||||
return &l
|
return &l
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l fnlogger) WithValues(kvList ...interface{}) logr.LogSink {
|
func (l fnlogger) WithValues(kvList ...any) logr.LogSink {
|
||||||
l.Formatter.AddValues(kvList)
|
l.Formatter.AddValues(kvList)
|
||||||
return &l
|
return &l
|
||||||
}
|
}
|
||||||
|
@ -173,12 +173,12 @@ func (l fnlogger) WithCallDepth(depth int) logr.LogSink {
|
||||||
return &l
|
return &l
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l fnlogger) Info(level int, msg string, kvList ...interface{}) {
|
func (l fnlogger) Info(level int, msg string, kvList ...any) {
|
||||||
prefix, args := l.FormatInfo(level, msg, kvList)
|
prefix, args := l.FormatInfo(level, msg, kvList)
|
||||||
l.write(prefix, args)
|
l.write(prefix, args)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l fnlogger) Error(err error, msg string, kvList ...interface{}) {
|
func (l fnlogger) Error(err error, msg string, kvList ...any) {
|
||||||
prefix, args := l.FormatError(err, msg, kvList)
|
prefix, args := l.FormatError(err, msg, kvList)
|
||||||
l.write(prefix, args)
|
l.write(prefix, args)
|
||||||
}
|
}
|
||||||
|
@ -229,7 +229,7 @@ func newFormatter(opts Options, outfmt outputFormat) Formatter {
|
||||||
type Formatter struct {
|
type Formatter struct {
|
||||||
outputFormat outputFormat
|
outputFormat outputFormat
|
||||||
prefix string
|
prefix string
|
||||||
values []interface{}
|
values []any
|
||||||
valuesStr string
|
valuesStr string
|
||||||
depth int
|
depth int
|
||||||
opts *Options
|
opts *Options
|
||||||
|
@ -246,10 +246,10 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
// PseudoStruct is a list of key-value pairs that gets logged as a struct.
|
// PseudoStruct is a list of key-value pairs that gets logged as a struct.
|
||||||
type PseudoStruct []interface{}
|
type PseudoStruct []any
|
||||||
|
|
||||||
// render produces a log line, ready to use.
|
// render produces a log line, ready to use.
|
||||||
func (f Formatter) render(builtins, args []interface{}) string {
|
func (f Formatter) render(builtins, args []any) string {
|
||||||
// Empirically bytes.Buffer is faster than strings.Builder for this.
|
// Empirically bytes.Buffer is faster than strings.Builder for this.
|
||||||
buf := bytes.NewBuffer(make([]byte, 0, 1024))
|
buf := bytes.NewBuffer(make([]byte, 0, 1024))
|
||||||
if f.outputFormat == outputJSON {
|
if f.outputFormat == outputJSON {
|
||||||
|
@ -292,7 +292,7 @@ func (f Formatter) render(builtins, args []interface{}) string {
|
||||||
// This function returns a potentially modified version of kvList, which
|
// This function returns a potentially modified version of kvList, which
|
||||||
// ensures that there is a value for every key (adding a value if needed) and
|
// ensures that there is a value for every key (adding a value if needed) and
|
||||||
// that each key is a string (substituting a key if needed).
|
// that each key is a string (substituting a key if needed).
|
||||||
func (f Formatter) flatten(buf *bytes.Buffer, kvList []interface{}, continuing bool, escapeKeys bool) []interface{} {
|
func (f Formatter) flatten(buf *bytes.Buffer, kvList []any, continuing bool, escapeKeys bool) []any {
|
||||||
// This logic overlaps with sanitize() but saves one type-cast per key,
|
// This logic overlaps with sanitize() but saves one type-cast per key,
|
||||||
// which can be measurable.
|
// which can be measurable.
|
||||||
if len(kvList)%2 != 0 {
|
if len(kvList)%2 != 0 {
|
||||||
|
@ -334,7 +334,7 @@ func (f Formatter) flatten(buf *bytes.Buffer, kvList []interface{}, continuing b
|
||||||
return kvList
|
return kvList
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f Formatter) pretty(value interface{}) string {
|
func (f Formatter) pretty(value any) string {
|
||||||
return f.prettyWithFlags(value, 0, 0)
|
return f.prettyWithFlags(value, 0, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -343,7 +343,7 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
// TODO: This is not fast. Most of the overhead goes here.
|
// TODO: This is not fast. Most of the overhead goes here.
|
||||||
func (f Formatter) prettyWithFlags(value interface{}, flags uint32, depth int) string {
|
func (f Formatter) prettyWithFlags(value any, flags uint32, depth int) string {
|
||||||
if depth > f.opts.MaxLogDepth {
|
if depth > f.opts.MaxLogDepth {
|
||||||
return `"<max-log-depth-exceeded>"`
|
return `"<max-log-depth-exceeded>"`
|
||||||
}
|
}
|
||||||
|
@ -614,7 +614,7 @@ func isEmpty(v reflect.Value) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func invokeMarshaler(m logr.Marshaler) (ret interface{}) {
|
func invokeMarshaler(m logr.Marshaler) (ret any) {
|
||||||
defer func() {
|
defer func() {
|
||||||
if r := recover(); r != nil {
|
if r := recover(); r != nil {
|
||||||
ret = fmt.Sprintf("<panic: %s>", r)
|
ret = fmt.Sprintf("<panic: %s>", r)
|
||||||
|
@ -675,12 +675,12 @@ func (f Formatter) caller() Caller {
|
||||||
|
|
||||||
const noValue = "<no-value>"
|
const noValue = "<no-value>"
|
||||||
|
|
||||||
func (f Formatter) nonStringKey(v interface{}) string {
|
func (f Formatter) nonStringKey(v any) string {
|
||||||
return fmt.Sprintf("<non-string-key: %s>", f.snippet(v))
|
return fmt.Sprintf("<non-string-key: %s>", f.snippet(v))
|
||||||
}
|
}
|
||||||
|
|
||||||
// snippet produces a short snippet string of an arbitrary value.
|
// snippet produces a short snippet string of an arbitrary value.
|
||||||
func (f Formatter) snippet(v interface{}) string {
|
func (f Formatter) snippet(v any) string {
|
||||||
const snipLen = 16
|
const snipLen = 16
|
||||||
|
|
||||||
snip := f.pretty(v)
|
snip := f.pretty(v)
|
||||||
|
@ -693,7 +693,7 @@ func (f Formatter) snippet(v interface{}) string {
|
||||||
// sanitize ensures that a list of key-value pairs has a value for every key
|
// sanitize ensures that a list of key-value pairs has a value for every key
|
||||||
// (adding a value if needed) and that each key is a string (substituting a key
|
// (adding a value if needed) and that each key is a string (substituting a key
|
||||||
// if needed).
|
// if needed).
|
||||||
func (f Formatter) sanitize(kvList []interface{}) []interface{} {
|
func (f Formatter) sanitize(kvList []any) []any {
|
||||||
if len(kvList)%2 != 0 {
|
if len(kvList)%2 != 0 {
|
||||||
kvList = append(kvList, noValue)
|
kvList = append(kvList, noValue)
|
||||||
}
|
}
|
||||||
|
@ -727,8 +727,8 @@ func (f Formatter) GetDepth() int {
|
||||||
// FormatInfo renders an Info log message into strings. The prefix will be
|
// FormatInfo renders an Info log message into strings. The prefix will be
|
||||||
// empty when no names were set (via AddNames), or when the output is
|
// empty when no names were set (via AddNames), or when the output is
|
||||||
// configured for JSON.
|
// configured for JSON.
|
||||||
func (f Formatter) FormatInfo(level int, msg string, kvList []interface{}) (prefix, argsStr string) {
|
func (f Formatter) FormatInfo(level int, msg string, kvList []any) (prefix, argsStr string) {
|
||||||
args := make([]interface{}, 0, 64) // using a constant here impacts perf
|
args := make([]any, 0, 64) // using a constant here impacts perf
|
||||||
prefix = f.prefix
|
prefix = f.prefix
|
||||||
if f.outputFormat == outputJSON {
|
if f.outputFormat == outputJSON {
|
||||||
args = append(args, "logger", prefix)
|
args = append(args, "logger", prefix)
|
||||||
|
@ -747,8 +747,8 @@ func (f Formatter) FormatInfo(level int, msg string, kvList []interface{}) (pref
|
||||||
// FormatError renders an Error log message into strings. The prefix will be
|
// FormatError renders an Error log message into strings. The prefix will be
|
||||||
// empty when no names were set (via AddNames), or when the output is
|
// empty when no names were set (via AddNames), or when the output is
|
||||||
// configured for JSON.
|
// configured for JSON.
|
||||||
func (f Formatter) FormatError(err error, msg string, kvList []interface{}) (prefix, argsStr string) {
|
func (f Formatter) FormatError(err error, msg string, kvList []any) (prefix, argsStr string) {
|
||||||
args := make([]interface{}, 0, 64) // using a constant here impacts perf
|
args := make([]any, 0, 64) // using a constant here impacts perf
|
||||||
prefix = f.prefix
|
prefix = f.prefix
|
||||||
if f.outputFormat == outputJSON {
|
if f.outputFormat == outputJSON {
|
||||||
args = append(args, "logger", prefix)
|
args = append(args, "logger", prefix)
|
||||||
|
@ -761,12 +761,12 @@ func (f Formatter) FormatError(err error, msg string, kvList []interface{}) (pre
|
||||||
args = append(args, "caller", f.caller())
|
args = append(args, "caller", f.caller())
|
||||||
}
|
}
|
||||||
args = append(args, "msg", msg)
|
args = append(args, "msg", msg)
|
||||||
var loggableErr interface{}
|
var loggableErr any
|
||||||
if err != nil {
|
if err != nil {
|
||||||
loggableErr = err.Error()
|
loggableErr = err.Error()
|
||||||
}
|
}
|
||||||
args = append(args, "error", loggableErr)
|
args = append(args, "error", loggableErr)
|
||||||
return f.prefix, f.render(args, kvList)
|
return prefix, f.render(args, kvList)
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddName appends the specified name. funcr uses '/' characters to separate
|
// AddName appends the specified name. funcr uses '/' characters to separate
|
||||||
|
@ -781,7 +781,7 @@ func (f *Formatter) AddName(name string) {
|
||||||
|
|
||||||
// AddValues adds key-value pairs to the set of saved values to be logged with
|
// AddValues adds key-value pairs to the set of saved values to be logged with
|
||||||
// each log line.
|
// each log line.
|
||||||
func (f *Formatter) AddValues(kvList []interface{}) {
|
func (f *Formatter) AddValues(kvList []any) {
|
||||||
// Three slice args forces a copy.
|
// Three slice args forces a copy.
|
||||||
n := len(f.values)
|
n := len(f.values)
|
||||||
f.values = append(f.values[:n:n], kvList...)
|
f.values = append(f.values[:n:n], kvList...)
|
||||||
|
|
|
@ -127,9 +127,9 @@ limitations under the License.
|
||||||
// such a value can call its methods without having to check whether the
|
// such a value can call its methods without having to check whether the
|
||||||
// instance is ready for use.
|
// instance is ready for use.
|
||||||
//
|
//
|
||||||
// Calling methods with the null logger (Logger{}) as instance will crash
|
// The zero logger (= Logger{}) is identical to Discard() and discards all log
|
||||||
// because it has no LogSink. Therefore this null logger should never be passed
|
// entries. Code that receives a Logger by value can simply call it, the methods
|
||||||
// around. For cases where passing a logger is optional, a pointer to Logger
|
// will never crash. For cases where passing a logger is optional, a pointer to Logger
|
||||||
// should be used.
|
// should be used.
|
||||||
//
|
//
|
||||||
// # Key Naming Conventions
|
// # Key Naming Conventions
|
||||||
|
@ -258,6 +258,12 @@ 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 {
|
||||||
|
// Some implementations of LogSink look at the caller in Enabled (e.g.
|
||||||
|
// different verbosity levels per package or file), but we only pass one
|
||||||
|
// CallDepth in (via Init). This means that all calls from Logger to the
|
||||||
|
// LogSink's Enabled, Info, and Error methods must have the same number of
|
||||||
|
// frames. In other words, Logger methods can't call other Logger methods
|
||||||
|
// which call these LogSink methods unless we do it the same in all paths.
|
||||||
return l.sink != nil && l.sink.Enabled(l.level)
|
return l.sink != nil && l.sink.Enabled(l.level)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -267,11 +273,11 @@ func (l Logger) Enabled() bool {
|
||||||
// line. The key/value pairs can then be used to add additional variable
|
// line. The key/value pairs can then be used to add additional variable
|
||||||
// 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 ...any) {
|
||||||
if l.sink == nil {
|
if l.sink == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if l.Enabled() {
|
if l.sink.Enabled(l.level) { // see comment in Enabled
|
||||||
if withHelper, ok := l.sink.(CallStackHelperLogSink); ok {
|
if withHelper, ok := l.sink.(CallStackHelperLogSink); ok {
|
||||||
withHelper.GetCallStackHelper()()
|
withHelper.GetCallStackHelper()()
|
||||||
}
|
}
|
||||||
|
@ -289,7 +295,7 @@ func (l Logger) Info(msg string, keysAndValues ...interface{}) {
|
||||||
// while the err argument should be used to attach the actual error that
|
// while the err argument should be used to attach the actual error that
|
||||||
// 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 ...any) {
|
||||||
if l.sink == nil {
|
if l.sink == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -314,9 +320,16 @@ func (l Logger) V(level int) Logger {
|
||||||
return l
|
return l
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetV returns the verbosity level of the logger. If the logger's LogSink is
|
||||||
|
// nil as in the Discard logger, this will always return 0.
|
||||||
|
func (l Logger) GetV() int {
|
||||||
|
// 0 if l.sink nil because of the if check in V above.
|
||||||
|
return l.level
|
||||||
|
}
|
||||||
|
|
||||||
// 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 ...any) Logger {
|
||||||
if l.sink == nil {
|
if l.sink == nil {
|
||||||
return l
|
return l
|
||||||
}
|
}
|
||||||
|
@ -467,15 +480,15 @@ type LogSink interface {
|
||||||
// The level argument is provided for optional logging. This method will
|
// The level argument is provided for optional logging. This method will
|
||||||
// only be called when Enabled(level) is true. See Logger.Info for more
|
// only be called when Enabled(level) is true. See Logger.Info for more
|
||||||
// details.
|
// details.
|
||||||
Info(level int, msg string, keysAndValues ...interface{})
|
Info(level int, msg string, keysAndValues ...any)
|
||||||
|
|
||||||
// Error logs an error, with the given message and key/value pairs as
|
// Error logs an error, with the given message and key/value pairs as
|
||||||
// context. See Logger.Error for more details.
|
// context. See Logger.Error for more details.
|
||||||
Error(err error, msg string, keysAndValues ...interface{})
|
Error(err error, msg string, keysAndValues ...any)
|
||||||
|
|
||||||
// WithValues returns a new LogSink with additional key/value pairs. See
|
// WithValues returns a new LogSink with additional key/value pairs. See
|
||||||
// Logger.WithValues for more details.
|
// Logger.WithValues for more details.
|
||||||
WithValues(keysAndValues ...interface{}) LogSink
|
WithValues(keysAndValues ...any) LogSink
|
||||||
|
|
||||||
// WithName returns a new LogSink with the specified name appended. See
|
// WithName returns a new LogSink with the specified name appended. See
|
||||||
// Logger.WithName for more details.
|
// Logger.WithName for more details.
|
||||||
|
@ -546,5 +559,5 @@ type Marshaler interface {
|
||||||
// with exported fields
|
// with exported fields
|
||||||
//
|
//
|
||||||
// It may return any value of any type.
|
// It may return any value of any type.
|
||||||
MarshalLog() interface{}
|
MarshalLog() any
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,8 +18,9 @@ gen/
|
||||||
/example/fib/traces.txt
|
/example/fib/traces.txt
|
||||||
/example/jaeger/jaeger
|
/example/jaeger/jaeger
|
||||||
/example/namedtracer/namedtracer
|
/example/namedtracer/namedtracer
|
||||||
|
/example/otel-collector/otel-collector
|
||||||
/example/opencensus/opencensus
|
/example/opencensus/opencensus
|
||||||
/example/passthrough/passthrough
|
/example/passthrough/passthrough
|
||||||
/example/prometheus/prometheus
|
/example/prometheus/prometheus
|
||||||
|
/example/view/view
|
||||||
/example/zipkin/zipkin
|
/example/zipkin/zipkin
|
||||||
/example/otel-collector/otel-collector
|
|
||||||
|
|
|
@ -12,8 +12,9 @@ linters:
|
||||||
- depguard
|
- depguard
|
||||||
- errcheck
|
- errcheck
|
||||||
- godot
|
- godot
|
||||||
- gofmt
|
- gofumpt
|
||||||
- goimports
|
- goimports
|
||||||
|
- gosec
|
||||||
- gosimple
|
- gosimple
|
||||||
- govet
|
- govet
|
||||||
- ineffassign
|
- ineffassign
|
||||||
|
@ -53,6 +54,20 @@ issues:
|
||||||
text: "calls to (.+) only in main[(][)] or init[(][)] functions"
|
text: "calls to (.+) only in main[(][)] or init[(][)] functions"
|
||||||
linters:
|
linters:
|
||||||
- revive
|
- revive
|
||||||
|
# It's okay to not run gosec in a test.
|
||||||
|
- path: _test\.go
|
||||||
|
linters:
|
||||||
|
- gosec
|
||||||
|
# Igonoring gosec G404: Use of weak random number generator (math/rand instead of crypto/rand)
|
||||||
|
# as we commonly use it in tests and examples.
|
||||||
|
- text: "G404:"
|
||||||
|
linters:
|
||||||
|
- gosec
|
||||||
|
# Igonoring gosec G402: TLS MinVersion too low
|
||||||
|
# as the https://pkg.go.dev/crypto/tls#Config handles MinVersion default well.
|
||||||
|
- text: "G402: TLS MinVersion too low."
|
||||||
|
linters:
|
||||||
|
- gosec
|
||||||
include:
|
include:
|
||||||
# revive exported should have comment or be unexported.
|
# revive exported should have comment or be unexported.
|
||||||
- EXC0012
|
- EXC0012
|
||||||
|
|
|
@ -8,6 +8,71 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [1.20.0/0.43.0] 2023-11-10
|
||||||
|
|
||||||
|
This release brings a breaking change for custom trace API implementations. Some interfaces (`TracerProvider`, `Tracer`, `Span`) now embed the `go.opentelemetry.io/otel/trace/embedded` types. Implementors need to update their implementations based on what they want the default behavior to be. See the "API Implementations" section of the [trace API] package documentation for more information about how to accomplish this.
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add `go.opentelemetry.io/otel/bridge/opencensus.InstallTraceBridge`, which installs the OpenCensus trace bridge, and replaces `opencensus.NewTracer`. (#4567)
|
||||||
|
- Add scope version to trace and metric bridges in `go.opentelemetry.io/otel/bridge/opencensus`. (#4584)
|
||||||
|
- Add the `go.opentelemetry.io/otel/trace/embedded` package to be embedded in the exported trace API interfaces. (#4620)
|
||||||
|
- Add the `go.opentelemetry.io/otel/trace/noop` package as a default no-op implementation of the trace API. (#4620)
|
||||||
|
- Add context propagation in `go.opentelemetry.io/otel/example/dice`. (#4644)
|
||||||
|
- Add view configuration to `go.opentelemetry.io/otel/example/prometheus`. (#4649)
|
||||||
|
- Add `go.opentelemetry.io/otel/metric.WithExplicitBucketBoundaries`, which allows defining default explicit bucket boundaries when creating histogram instruments. (#4603)
|
||||||
|
- Add `Version` function in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc`. (#4660)
|
||||||
|
- Add `Version` function in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp`. (#4660)
|
||||||
|
- Add Summary, SummaryDataPoint, and QuantileValue to `go.opentelemetry.io/sdk/metric/metricdata`. (#4622)
|
||||||
|
- `go.opentelemetry.io/otel/bridge/opencensus.NewMetricProducer` now supports exemplars from OpenCensus. (#4585)
|
||||||
|
- Add support for `WithExplicitBucketBoundaries` in `go.opentelemetry.io/otel/sdk/metric`. (#4605)
|
||||||
|
- Add support for Summary metrics in `go.opentelemetry.io/otel/bridge/opencensus`. (#4668)
|
||||||
|
|
||||||
|
### Deprecated
|
||||||
|
|
||||||
|
- Deprecate `go.opentelemetry.io/otel/bridge/opencensus.NewTracer` in favor of `opencensus.InstallTraceBridge`. (#4567)
|
||||||
|
- Deprecate `go.opentelemetry.io/otel/example/fib` package is in favor of `go.opentelemetry.io/otel/example/dice`. (#4618)
|
||||||
|
- Deprecate `go.opentelemetry.io/otel/trace.NewNoopTracerProvider`.
|
||||||
|
Use the added `NewTracerProvider` function in `go.opentelemetry.io/otel/trace/noop` instead. (#4620)
|
||||||
|
- Deprecate `go.opentelemetry.io/otel/example/view` package in favor of `go.opentelemetry.io/otel/example/prometheus`. (#4649)
|
||||||
|
- Deprecate `go.opentelemetry.io/otel/exporters/otlp/otlpmetric`. (#4693)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- `go.opentelemetry.io/otel/bridge/opencensus.NewMetricProducer` returns a `*MetricProducer` struct instead of the metric.Producer interface. (#4583)
|
||||||
|
- The `TracerProvider` in `go.opentelemetry.io/otel/trace` now embeds the `go.opentelemetry.io/otel/trace/embedded.TracerProvider` type.
|
||||||
|
This extends the `TracerProvider` interface and is is a breaking change for any existing implementation.
|
||||||
|
Implementors need to update their implementations based on what they want the default behavior of the interface to be.
|
||||||
|
See the "API Implementations" section of the `go.opentelemetry.io/otel/trace` package documentation for more information about how to accomplish this. (#4620)
|
||||||
|
- The `Tracer` in `go.opentelemetry.io/otel/trace` now embeds the `go.opentelemetry.io/otel/trace/embedded.Tracer` type.
|
||||||
|
This extends the `Tracer` interface and is is a breaking change for any existing implementation.
|
||||||
|
Implementors need to update their implementations based on what they want the default behavior of the interface to be.
|
||||||
|
See the "API Implementations" section of the `go.opentelemetry.io/otel/trace` package documentation for more information about how to accomplish this. (#4620)
|
||||||
|
- The `Span` in `go.opentelemetry.io/otel/trace` now embeds the `go.opentelemetry.io/otel/trace/embedded.Span` type.
|
||||||
|
This extends the `Span` interface and is is a breaking change for any existing implementation.
|
||||||
|
Implementors need to update their implementations based on what they want the default behavior of the interface to be.
|
||||||
|
See the "API Implementations" section of the `go.opentelemetry.io/otel/trace` package documentation for more information about how to accomplish this. (#4620)
|
||||||
|
- `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc` does no longer depend on `go.opentelemetry.io/otel/exporters/otlp/otlpmetric`. (#4660)
|
||||||
|
- `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp` does no longer depend on `go.opentelemetry.io/otel/exporters/otlp/otlpmetric`. (#4660)
|
||||||
|
- Retry for `502 Bad Gateway` and `504 Gateway Timeout` HTTP statuses in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp`. (#4670)
|
||||||
|
- Retry for `502 Bad Gateway` and `504 Gateway Timeout` HTTP statuses in `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp`. (#4670)
|
||||||
|
- Retry for `RESOURCE_EXHAUSTED` only if RetryInfo is returned in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc`. (#4669)
|
||||||
|
- Retry for `RESOURCE_EXHAUSTED` only if RetryInfo is returned in `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc`. (#4669)
|
||||||
|
- Retry temporary HTTP request failures in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp`. (#4679)
|
||||||
|
- Retry temporary HTTP request failures in `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp`. (#4679)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix improper parsing of characters such us `+`, `/` by `Parse` in `go.opentelemetry.io/otel/baggage` as they were rendered as a whitespace. (#4667)
|
||||||
|
- Fix improper parsing of characters such us `+`, `/` passed via `OTEL_RESOURCE_ATTRIBUTES` in `go.opentelemetry.io/otel/sdk/resource` as they were rendered as a whitespace. (#4699)
|
||||||
|
- Fix improper parsing of characters such us `+`, `/` passed via `OTEL_EXPORTER_OTLP_HEADERS` and `OTEL_EXPORTER_OTLP_METRICS_HEADERS` in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc` as they were rendered as a whitespace. (#4699)
|
||||||
|
- Fix improper parsing of characters such us `+`, `/` passed via `OTEL_EXPORTER_OTLP_HEADERS` and `OTEL_EXPORTER_OTLP_METRICS_HEADERS` in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp` as they were rendered as a whitespace. (#4699)
|
||||||
|
- Fix improper parsing of characters such us `+`, `/` passed via `OTEL_EXPORTER_OTLP_HEADERS` and `OTEL_EXPORTER_OTLP_TRACES_HEADERS` in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlptracegrpc` as they were rendered as a whitespace. (#4699)
|
||||||
|
- Fix improper parsing of characters such us `+`, `/` passed via `OTEL_EXPORTER_OTLP_HEADERS` and `OTEL_EXPORTER_OTLP_TRACES_HEADERS` in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlptracehttp` as they were rendered as a whitespace. (#4699)
|
||||||
|
- In `go.opentelemetry.op/otel/exporters/prometheus`, the exporter no longer `Collect`s metrics after `Shutdown` is invoked. (#4648)
|
||||||
|
- Fix documentation for `WithCompressor` in `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc`. (#4695)
|
||||||
|
- Fix documentation for `WithCompressor` in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc`. (#4695)
|
||||||
|
|
||||||
## [1.19.0/0.42.0/0.0.7] 2023-09-28
|
## [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].
|
This release contains the first stable release of the OpenTelemetry Go [metric SDK].
|
||||||
|
@ -2656,7 +2721,8 @@ 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.19.0...HEAD
|
[Unreleased]: https://github.com/open-telemetry/opentelemetry-go/compare/v1.20.0...HEAD
|
||||||
|
[1.20.0/0.43.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.20.0
|
||||||
[1.19.0/0.42.0/0.0.7]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.19.0
|
[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.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.18.0/0.41.0/0.0.6]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.18.0
|
||||||
|
@ -2731,7 +2797,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 API]:https://pkg.go.dev/go.opentelemetry.io/otel/metric
|
||||||
[metric SDK]:https://pkg.go.dev/go.opentelemetry.io/otel/sdk/metric
|
[metric SDK]:https://pkg.go.dev/go.opentelemetry.io/otel/sdk/metric
|
||||||
|
[trace API]:https://pkg.go.dev/go.opentelemetry.io/otel/trace
|
||||||
|
|
|
@ -77,6 +77,9 @@ $(GOTMPL): PACKAGE=go.opentelemetry.io/build-tools/gotmpl
|
||||||
GORELEASE = $(TOOLS)/gorelease
|
GORELEASE = $(TOOLS)/gorelease
|
||||||
$(GORELEASE): PACKAGE=golang.org/x/exp/cmd/gorelease
|
$(GORELEASE): PACKAGE=golang.org/x/exp/cmd/gorelease
|
||||||
|
|
||||||
|
GOVULNCHECK = $(TOOLS)/govulncheck
|
||||||
|
$(TOOLS)/govulncheck: PACKAGE=golang.org/x/vuln/cmd/govulncheck
|
||||||
|
|
||||||
.PHONY: tools
|
.PHONY: tools
|
||||||
tools: $(CROSSLINK) $(DBOTCONF) $(GOLANGCI_LINT) $(MISSPELL) $(GOCOVMERGE) $(STRINGER) $(PORTO) $(GOJQ) $(SEMCONVGEN) $(MULTIMOD) $(SEMCONVKIT) $(GOTMPL) $(GORELEASE)
|
tools: $(CROSSLINK) $(DBOTCONF) $(GOLANGCI_LINT) $(MISSPELL) $(GOCOVMERGE) $(STRINGER) $(PORTO) $(GOJQ) $(SEMCONVGEN) $(MULTIMOD) $(SEMCONVKIT) $(GOTMPL) $(GORELEASE)
|
||||||
|
|
||||||
|
@ -189,6 +192,18 @@ test-coverage: | $(GOCOVMERGE)
|
||||||
done; \
|
done; \
|
||||||
$(GOCOVMERGE) $$(find . -name coverage.out) > coverage.txt
|
$(GOCOVMERGE) $$(find . -name coverage.out) > coverage.txt
|
||||||
|
|
||||||
|
# Adding a directory will include all benchmarks in that direcotry if a filter is not specified.
|
||||||
|
BENCHMARK_TARGETS := sdk/trace
|
||||||
|
.PHONY: benchmark
|
||||||
|
benchmark: $(BENCHMARK_TARGETS:%=benchmark/%)
|
||||||
|
BENCHMARK_FILTER = .
|
||||||
|
# You can override the filter for a particular directory by adding a rule here.
|
||||||
|
benchmark/sdk/trace: BENCHMARK_FILTER = SpanWithAttributes_8/AlwaysSample
|
||||||
|
benchmark/%:
|
||||||
|
@echo "$(GO) test -timeout $(TIMEOUT)s -run=xxxxxMatchNothingxxxxx -bench=$(BENCHMARK_FILTER) $*..." \
|
||||||
|
&& cd $* \
|
||||||
|
$(foreach filter, $(BENCHMARK_FILTER), && $(GO) test -timeout $(TIMEOUT)s -run=xxxxxMatchNothingxxxxx -bench=$(filter))
|
||||||
|
|
||||||
.PHONY: golangci-lint golangci-lint-fix
|
.PHONY: golangci-lint golangci-lint-fix
|
||||||
golangci-lint-fix: ARGS=--fix
|
golangci-lint-fix: ARGS=--fix
|
||||||
golangci-lint-fix: golangci-lint
|
golangci-lint-fix: golangci-lint
|
||||||
|
@ -216,7 +231,7 @@ go-mod-tidy/%: | crosslink
|
||||||
lint-modules: go-mod-tidy
|
lint-modules: go-mod-tidy
|
||||||
|
|
||||||
.PHONY: lint
|
.PHONY: lint
|
||||||
lint: misspell lint-modules golangci-lint
|
lint: misspell lint-modules golangci-lint govulncheck
|
||||||
|
|
||||||
.PHONY: vanity-import-check
|
.PHONY: vanity-import-check
|
||||||
vanity-import-check: | $(PORTO)
|
vanity-import-check: | $(PORTO)
|
||||||
|
@ -226,6 +241,14 @@ vanity-import-check: | $(PORTO)
|
||||||
misspell: | $(MISSPELL)
|
misspell: | $(MISSPELL)
|
||||||
@$(MISSPELL) -w $(ALL_DOCS)
|
@$(MISSPELL) -w $(ALL_DOCS)
|
||||||
|
|
||||||
|
.PHONY: govulncheck
|
||||||
|
govulncheck: $(OTEL_GO_MOD_DIRS:%=govulncheck/%)
|
||||||
|
govulncheck/%: DIR=$*
|
||||||
|
govulncheck/%: | $(GOVULNCHECK)
|
||||||
|
@echo "govulncheck ./... in $(DIR)" \
|
||||||
|
&& cd $(DIR) \
|
||||||
|
&& $(GOVULNCHECK) ./...
|
||||||
|
|
||||||
.PHONY: codespell
|
.PHONY: codespell
|
||||||
codespell: | $(CODESPELL)
|
codespell: | $(CODESPELL)
|
||||||
@$(DOCKERPY) $(CODESPELL)
|
@$(DOCKERPY) $(CODESPELL)
|
||||||
|
@ -289,3 +312,7 @@ COMMIT ?= "HEAD"
|
||||||
add-tags: | $(MULTIMOD)
|
add-tags: | $(MULTIMOD)
|
||||||
@[ "${MODSET}" ] || ( echo ">> env var MODSET is not set"; exit 1 )
|
@[ "${MODSET}" ] || ( echo ">> env var MODSET is not set"; exit 1 )
|
||||||
$(MULTIMOD) verify && $(MULTIMOD) tag -m ${MODSET} -c ${COMMIT}
|
$(MULTIMOD) verify && $(MULTIMOD) tag -m ${MODSET} -c ${COMMIT}
|
||||||
|
|
||||||
|
.PHONY: lint-markdown
|
||||||
|
lint-markdown:
|
||||||
|
docker run -v "$(CURDIR):$(WORKDIR)" docker://avtodev/markdown-lint:v1 -c $(WORKDIR)/.markdownlint.yaml $(WORKDIR)/**/*.md
|
||||||
|
|
|
@ -11,16 +11,13 @@ It provides a set of APIs to directly measure performance and behavior of your s
|
||||||
|
|
||||||
## Project Status
|
## Project Status
|
||||||
|
|
||||||
| Signal | Status | Project |
|
| Signal | Status |
|
||||||
|---------|------------|-----------------------|
|
|---------|------------|
|
||||||
| Traces | Stable | N/A |
|
| Traces | Stable |
|
||||||
| Metrics | Mixed [1] | [Go: Metric SDK (GA)] |
|
| Metrics | Stable |
|
||||||
| Logs | Frozen [2] | N/A |
|
| Logs | Design [1] |
|
||||||
|
|
||||||
[Go: Metric SDK (GA)]: https://github.com/orgs/open-telemetry/projects/34
|
- [1]: Currently the logs signal development is in a design phase ([#4696](https://github.com/open-telemetry/opentelemetry-go/issues/4696)).
|
||||||
|
|
||||||
- [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
|
Progress and status specific to this repository is tracked in our
|
||||||
|
|
|
@ -254,7 +254,7 @@ func NewMember(key, value string, props ...Property) (Member, error) {
|
||||||
if err := m.validate(); err != nil {
|
if err := m.validate(); err != nil {
|
||||||
return newInvalidMember(), err
|
return newInvalidMember(), err
|
||||||
}
|
}
|
||||||
decodedValue, err := url.QueryUnescape(value)
|
decodedValue, err := url.PathUnescape(value)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return newInvalidMember(), fmt.Errorf("%w: %q", errInvalidValue, value)
|
return newInvalidMember(), fmt.Errorf("%w: %q", errInvalidValue, value)
|
||||||
}
|
}
|
||||||
|
@ -301,7 +301,7 @@ func parseMember(member string) (Member, error) {
|
||||||
// when converting the header into a data structure."
|
// when converting the header into a data structure."
|
||||||
key = strings.TrimSpace(k)
|
key = strings.TrimSpace(k)
|
||||||
var err error
|
var err error
|
||||||
value, err = url.QueryUnescape(strings.TrimSpace(v))
|
value, err = url.PathUnescape(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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,51 +0,0 @@
|
||||||
# OpenTelemetry-Go OTLP Span Exporter
|
|
||||||
|
|
||||||
[![Go Reference](https://pkg.go.dev/badge/go.opentelemetry.io/otel/exporters/otlp/otlptrace.svg)](https://pkg.go.dev/go.opentelemetry.io/otel/exporters/otlp/otlptrace)
|
|
||||||
|
|
||||||
[OpenTelemetry Protocol Exporter](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.20.0/specification/protocol/exporter.md) implementation.
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
```
|
|
||||||
go get -u go.opentelemetry.io/otel/exporters/otlp/otlptrace
|
|
||||||
```
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
- [HTTP Exporter setup and examples](./otlptracehttp/example_test.go)
|
|
||||||
- [Full example of gRPC Exporter sending telemetry to a local collector](../../../example/otel-collector)
|
|
||||||
|
|
||||||
## [`otlptrace`](https://pkg.go.dev/go.opentelemetry.io/otel/exporters/otlp/otlptrace)
|
|
||||||
|
|
||||||
The `otlptrace` package provides an exporter implementing the OTel span exporter interface.
|
|
||||||
This exporter is configured using a client satisfying the `otlptrace.Client` interface.
|
|
||||||
This client handles the transformation of data into wire format and the transmission of that data to the collector.
|
|
||||||
|
|
||||||
## [`otlptracegrpc`](https://pkg.go.dev/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc)
|
|
||||||
|
|
||||||
The `otlptracegrpc` package implements a client for the span exporter that sends trace telemetry data to the collector using gRPC with protobuf-encoded payloads.
|
|
||||||
|
|
||||||
## [`otlptracehttp`](https://pkg.go.dev/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp)
|
|
||||||
|
|
||||||
The `otlptracehttp` package implements a client for the span exporter that sends trace telemetry data to the collector using HTTP with protobuf-encoded payloads.
|
|
||||||
|
|
||||||
## Configuration
|
|
||||||
|
|
||||||
### Environment Variables
|
|
||||||
|
|
||||||
The following environment variables can be used (instead of options objects) to
|
|
||||||
override the default configuration. For more information about how each of
|
|
||||||
these environment variables is interpreted, see [the OpenTelemetry
|
|
||||||
specification](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.20.0/specification/protocol/exporter.md).
|
|
||||||
|
|
||||||
| Environment variable | Option | Default value |
|
|
||||||
| ------------------------------------------------------------------------ |------------------------------ | -------------------------------------------------------- |
|
|
||||||
| `OTEL_EXPORTER_OTLP_ENDPOINT` `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` | `WithEndpoint` `WithInsecure` | `https://localhost:4317` or `https://localhost:4318`[^1] |
|
|
||||||
| `OTEL_EXPORTER_OTLP_CERTIFICATE` `OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE` | `WithTLSClientConfig` | |
|
|
||||||
| `OTEL_EXPORTER_OTLP_HEADERS` `OTEL_EXPORTER_OTLP_TRACES_HEADERS` | `WithHeaders` | |
|
|
||||||
| `OTEL_EXPORTER_OTLP_COMPRESSION` `OTEL_EXPORTER_OTLP_TRACES_COMPRESSION` | `WithCompression` | |
|
|
||||||
| `OTEL_EXPORTER_OTLP_TIMEOUT` `OTEL_EXPORTER_OTLP_TRACES_TIMEOUT` | `WithTimeout` | `10s` |
|
|
||||||
|
|
||||||
[^1]: The gRPC client defaults to `https://localhost:4317` and the HTTP client `https://localhost:4318`.
|
|
||||||
|
|
||||||
Configuration using options have precedence over the environment variables.
|
|
|
@ -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 semconv // import "go.opentelemetry.io/otel/semconv/v1.17.0"
|
/*
|
||||||
|
Package otlptrace contains abstractions for OTLP span exporters.
|
||||||
const (
|
See the official OTLP span exporter implementations:
|
||||||
// ExceptionEventName is the name of the Span event representing an exception.
|
- [go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc],
|
||||||
ExceptionEventName = "exception"
|
- [go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp].
|
||||||
)
|
*/
|
||||||
|
package otlptrace // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace"
|
|
@ -24,9 +24,7 @@ import (
|
||||||
tracesdk "go.opentelemetry.io/otel/sdk/trace"
|
tracesdk "go.opentelemetry.io/otel/sdk/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var errAlreadyStarted = errors.New("already started")
|
||||||
errAlreadyStarted = errors.New("already started")
|
|
||||||
)
|
|
||||||
|
|
||||||
// Exporter exports trace data in the OTLP wire format.
|
// Exporter exports trace data in the OTLP wire format.
|
||||||
type Exporter struct {
|
type Exporter struct {
|
||||||
|
@ -55,7 +53,7 @@ func (e *Exporter) ExportSpans(ctx context.Context, ss []tracesdk.ReadOnlySpan)
|
||||||
|
|
||||||
// Start establishes a connection to the receiving endpoint.
|
// Start establishes a connection to the receiving endpoint.
|
||||||
func (e *Exporter) Start(ctx context.Context) error {
|
func (e *Exporter) Start(ctx context.Context) error {
|
||||||
var err = errAlreadyStarted
|
err := errAlreadyStarted
|
||||||
e.startOnce.Do(func() {
|
e.startOnce.Do(func() {
|
||||||
e.mu.Lock()
|
e.mu.Lock()
|
||||||
e.started = true
|
e.started = true
|
||||||
|
|
22
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/client.go
generated
vendored
22
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/client.go
generated
vendored
|
@ -260,30 +260,38 @@ func (c *client) exportContext(parent context.Context) (context.Context, context
|
||||||
// duration to wait for if an explicit throttle time is included in err.
|
// duration to wait for if an explicit throttle time is included in err.
|
||||||
func retryable(err error) (bool, time.Duration) {
|
func retryable(err error) (bool, time.Duration) {
|
||||||
s := status.Convert(err)
|
s := status.Convert(err)
|
||||||
|
return retryableGRPCStatus(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
func retryableGRPCStatus(s *status.Status) (bool, time.Duration) {
|
||||||
switch s.Code() {
|
switch s.Code() {
|
||||||
case codes.Canceled,
|
case codes.Canceled,
|
||||||
codes.DeadlineExceeded,
|
codes.DeadlineExceeded,
|
||||||
codes.ResourceExhausted,
|
|
||||||
codes.Aborted,
|
codes.Aborted,
|
||||||
codes.OutOfRange,
|
codes.OutOfRange,
|
||||||
codes.Unavailable,
|
codes.Unavailable,
|
||||||
codes.DataLoss:
|
codes.DataLoss:
|
||||||
return true, throttleDelay(s)
|
// Additionally handle RetryInfo.
|
||||||
|
_, d := throttleDelay(s)
|
||||||
|
return true, d
|
||||||
|
case codes.ResourceExhausted:
|
||||||
|
// Retry only if the server signals that the recovery from resource exhaustion is possible.
|
||||||
|
return throttleDelay(s)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Not a retry-able error.
|
// Not a retry-able error.
|
||||||
return false, 0
|
return false, 0
|
||||||
}
|
}
|
||||||
|
|
||||||
// throttleDelay returns a duration to wait for if an explicit throttle time
|
// throttleDelay returns of the status is RetryInfo
|
||||||
// is included in the response status.
|
// and the its duration to wait for if an explicit throttle time.
|
||||||
func throttleDelay(s *status.Status) time.Duration {
|
func throttleDelay(s *status.Status) (bool, time.Duration) {
|
||||||
for _, detail := range s.Details() {
|
for _, detail := range s.Details() {
|
||||||
if t, ok := detail.(*errdetails.RetryInfo); ok {
|
if t, ok := detail.(*errdetails.RetryInfo); ok {
|
||||||
return t.RetryDelay.AsDuration()
|
return true, t.RetryDelay.AsDuration()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0
|
return false, 0
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalLog is the marshaling function used by the logging system to represent this Client.
|
// MarshalLog is the marshaling function used by the logging system to represent this Client.
|
||||||
|
|
77
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/doc.go
generated
vendored
Normal file
77
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/doc.go
generated
vendored
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
// 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 otlptracegrpc provides an OTLP span exporter using gRPC.
|
||||||
|
By default the telemetry is sent to https://localhost:4317.
|
||||||
|
|
||||||
|
Exporter should be created using [New].
|
||||||
|
|
||||||
|
The environment variables described below can be used for configuration.
|
||||||
|
|
||||||
|
OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_EXPORTER_OTLP_TRACES_ENDPOINT (default: "https://localhost:4317") -
|
||||||
|
target to which the exporter sends telemetry.
|
||||||
|
The target syntax is defined in https://github.com/grpc/grpc/blob/master/doc/naming.md.
|
||||||
|
The value must contain a host.
|
||||||
|
The value may additionally a port, a scheme, and a path.
|
||||||
|
The value accepts "http" and "https" scheme.
|
||||||
|
The value should not contain a query string or fragment.
|
||||||
|
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT takes precedence over OTEL_EXPORTER_OTLP_ENDPOINT.
|
||||||
|
The configuration can be overridden by [WithEndpoint], [WithInsecure], [WithGRPCConn] options.
|
||||||
|
|
||||||
|
OTEL_EXPORTER_OTLP_INSECURE, OTEL_EXPORTER_OTLP_TRACES_INSECURE (default: "false") -
|
||||||
|
setting "true" disables client transport security for the exporter's gRPC connection.
|
||||||
|
You can use this only when an endpoint is provided without the http or https scheme.
|
||||||
|
OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_EXPORTER_OTLP_TRACES_ENDPOINT setting overrides
|
||||||
|
the scheme defined via OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_EXPORTER_OTLP_TRACES_ENDPOINT.
|
||||||
|
OTEL_EXPORTER_OTLP_TRACES_INSECURE takes precedence over OTEL_EXPORTER_OTLP_INSECURE.
|
||||||
|
The configuration can be overridden by [WithInsecure], [WithGRPCConn] options.
|
||||||
|
|
||||||
|
OTEL_EXPORTER_OTLP_HEADERS, OTEL_EXPORTER_OTLP_TRACES_HEADERS (default: none) -
|
||||||
|
key-value pairs used as gRPC metadata associated with gRPC requests.
|
||||||
|
The value is expected to be represented in a format matching to the [W3C Baggage HTTP Header Content Format],
|
||||||
|
except that additional semi-colon delimited metadata is not supported.
|
||||||
|
Example value: "key1=value1,key2=value2".
|
||||||
|
OTEL_EXPORTER_OTLP_TRACES_HEADERS takes precedence over OTEL_EXPORTER_OTLP_HEADERS.
|
||||||
|
The configuration can be overridden by [WithHeaders] option.
|
||||||
|
|
||||||
|
OTEL_EXPORTER_OTLP_TIMEOUT, OTEL_EXPORTER_OTLP_TRACES_TIMEOUT (default: "10000") -
|
||||||
|
maximum time in milliseconds the OTLP exporter waits for each batch export.
|
||||||
|
OTEL_EXPORTER_OTLP_TRACES_TIMEOUT takes precedence over OTEL_EXPORTER_OTLP_TIMEOUT.
|
||||||
|
The configuration can be overridden by [WithTimeout] option.
|
||||||
|
|
||||||
|
OTEL_EXPORTER_OTLP_COMPRESSION, OTEL_EXPORTER_OTLP_TRACES_COMPRESSION (default: none) -
|
||||||
|
the gRPC compressor the exporter uses.
|
||||||
|
Supported value: "gzip".
|
||||||
|
OTEL_EXPORTER_OTLP_TRACES_COMPRESSION takes precedence over OTEL_EXPORTER_OTLP_COMPRESSION.
|
||||||
|
The configuration can be overridden by [WithCompressor], [WithGRPCConn] options.
|
||||||
|
|
||||||
|
OTEL_EXPORTER_OTLP_CERTIFICATE, OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE (default: none) -
|
||||||
|
the filepath to the trusted certificate to use when verifying a server's TLS credentials.
|
||||||
|
OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE takes precedence over OTEL_EXPORTER_OTLP_CERTIFICATE.
|
||||||
|
The configuration can be overridden by [WithTLSCredentials], [WithGRPCConn] options.
|
||||||
|
|
||||||
|
OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE, OTEL_EXPORTER_OTLP_TRACES_CLIENT_CERTIFICATE (default: none) -
|
||||||
|
the filepath to the client certificate/chain trust for clients private key to use in mTLS communication in PEM format.
|
||||||
|
OTEL_EXPORTER_OTLP_TRACES_CLIENT_CERTIFICATE takes precedence over OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE.
|
||||||
|
The configuration can be overridden by [WithTLSCredentials], [WithGRPCConn] options.
|
||||||
|
|
||||||
|
OTEL_EXPORTER_OTLP_CLIENT_KEY, OTEL_EXPORTER_OTLP_TRACES_CLIENT_KEY (default: none) -
|
||||||
|
the filepath to the clients private key to use in mTLS communication in PEM format.
|
||||||
|
OTEL_EXPORTER_OTLP_TRACES_CLIENT_KEY takes precedence over OTEL_EXPORTER_OTLP_CLIENT_KEY.
|
||||||
|
The configuration can be overridden by [WithTLSCredentials], [WithGRPCConn] option.
|
||||||
|
|
||||||
|
[W3C Baggage HTTP Header Content Format]: https://www.w3.org/TR/baggage/#header-content
|
||||||
|
*/
|
||||||
|
package otlptracegrpc // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
|
|
@ -174,13 +174,13 @@ func stringToHeader(value string) map[string]string {
|
||||||
global.Error(errors.New("missing '="), "parse headers", "input", header)
|
global.Error(errors.New("missing '="), "parse headers", "input", header)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
name, err := url.QueryUnescape(n)
|
name, err := url.PathUnescape(n)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
global.Error(err, "escape header key", "key", n)
|
global.Error(err, "escape header key", "key", n)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
trimmedName := strings.TrimSpace(name)
|
trimmedName := strings.TrimSpace(name)
|
||||||
value, err := url.QueryUnescape(v)
|
value, err := url.PathUnescape(v)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
global.Error(err, "escape header value", "value", v)
|
global.Error(err, "escape header value", "value", v)
|
||||||
continue
|
continue
|
||||||
|
|
|
@ -141,9 +141,6 @@ func NewGRPCConfig(opts ...GRPCOption) Config {
|
||||||
if cfg.Traces.Compression == GzipCompression {
|
if cfg.Traces.Compression == GzipCompression {
|
||||||
cfg.DialOptions = append(cfg.DialOptions, grpc.WithDefaultCallOptions(grpc.UseCompressor(gzip.Name)))
|
cfg.DialOptions = append(cfg.DialOptions, grpc.WithDefaultCallOptions(grpc.UseCompressor(gzip.Name)))
|
||||||
}
|
}
|
||||||
if len(cfg.DialOptions) != 0 {
|
|
||||||
cfg.DialOptions = append(cfg.DialOptions, cfg.DialOptions...)
|
|
||||||
}
|
|
||||||
if cfg.ReconnectionPeriod != 0 {
|
if cfg.ReconnectionPeriod != 0 {
|
||||||
p := grpc.ConnectParams{
|
p := grpc.ConnectParams{
|
||||||
Backoff: backoff.DefaultConfig,
|
Backoff: backoff.DefaultConfig,
|
||||||
|
|
8
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/options.go
generated
vendored
8
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/options.go
generated
vendored
|
@ -93,13 +93,7 @@ func compressorToCompression(compressor string) otlpconfig.Compression {
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithCompressor sets the compressor for the gRPC client to use when sending
|
// WithCompressor sets the compressor for the gRPC client to use when sending
|
||||||
// requests. It is the responsibility of the caller to ensure that the
|
// requests. Supported compressor values: "gzip".
|
||||||
// compressor set has been registered with google.golang.org/grpc/encoding.
|
|
||||||
// This can be done by encoding.RegisterCompressor. Some compressors
|
|
||||||
// auto-register on import, such as gzip, which can be registered by calling
|
|
||||||
// `import _ "google.golang.org/grpc/encoding/gzip"`.
|
|
||||||
//
|
|
||||||
// This option has no effect if WithGRPCConn is used.
|
|
||||||
func WithCompressor(compressor string) Option {
|
func WithCompressor(compressor string) Option {
|
||||||
return wrappedOption{otlpconfig.WithCompression(compressorToCompression(compressor))}
|
return wrappedOption{otlpconfig.WithCompression(compressorToCompression(compressor))}
|
||||||
}
|
}
|
||||||
|
|
10
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/client.go
generated
vendored
10
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/client.go
generated
vendored
|
@ -18,6 +18,7 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"compress/gzip"
|
"compress/gzip"
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net"
|
"net"
|
||||||
|
@ -152,6 +153,10 @@ func (d *client) UploadTraces(ctx context.Context, protoSpans []*tracepb.Resourc
|
||||||
|
|
||||||
request.reset(ctx)
|
request.reset(ctx)
|
||||||
resp, err := d.client.Do(request.Request)
|
resp, err := d.client.Do(request.Request)
|
||||||
|
var urlErr *url.Error
|
||||||
|
if errors.As(err, &urlErr) && urlErr.Temporary() {
|
||||||
|
return newResponseError(http.Header{})
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -190,7 +195,10 @@ func (d *client) UploadTraces(ctx context.Context, protoSpans []*tracepb.Resourc
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
|
||||||
case sc == http.StatusTooManyRequests, sc == http.StatusServiceUnavailable:
|
case sc == http.StatusTooManyRequests,
|
||||||
|
sc == http.StatusBadGateway,
|
||||||
|
sc == http.StatusServiceUnavailable,
|
||||||
|
sc == http.StatusGatewayTimeout:
|
||||||
// Retry-able failures. Drain the body to reuse the connection.
|
// Retry-able failures. Drain the body to reuse the connection.
|
||||||
if _, err := io.Copy(io.Discard, resp.Body); err != nil {
|
if _, err := io.Copy(io.Discard, resp.Body); err != nil {
|
||||||
otel.Handle(err)
|
otel.Handle(err)
|
||||||
|
|
|
@ -13,7 +13,62 @@
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Package otlptracehttp a client that sends traces to the collector using HTTP
|
Package otlptracehttp provides an OTLP span exporter using HTTP with protobuf payloads.
|
||||||
with binary protobuf payloads.
|
By default the telemetry is sent to https://localhost:4318/v1/traces.
|
||||||
|
|
||||||
|
Exporter should be created using [New].
|
||||||
|
|
||||||
|
The environment variables described below can be used for configuration.
|
||||||
|
|
||||||
|
OTEL_EXPORTER_OTLP_ENDPOINT (default: "https://localhost:4318") -
|
||||||
|
target base URL ("/v1/traces" is appended) to which the exporter sends telemetry.
|
||||||
|
The value must contain a scheme ("http" or "https") and host.
|
||||||
|
The value may additionally contain a port and a path.
|
||||||
|
The value should not contain a query string or fragment.
|
||||||
|
The configuration can be overridden by OTEL_EXPORTER_OTLP_TRACES_ENDPOINT
|
||||||
|
environment variable and by [WithEndpoint], [WithInsecure] options.
|
||||||
|
|
||||||
|
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT (default: "https://localhost:4318/v1/traces") -
|
||||||
|
target URL to which the exporter sends telemetry.
|
||||||
|
The value must contain a scheme ("http" or "https") and host.
|
||||||
|
The value may additionally contain a port and a path.
|
||||||
|
The value should not contain a query string or fragment.
|
||||||
|
The configuration can be overridden by [WithEndpoint], [WitnInsecure], [WithURLPath] options.
|
||||||
|
|
||||||
|
OTEL_EXPORTER_OTLP_HEADERS, OTEL_EXPORTER_OTLP_TRACES_HEADERS (default: none) -
|
||||||
|
key-value pairs used as headers associated with HTTP requests.
|
||||||
|
The value is expected to be represented in a format matching to the [W3C Baggage HTTP Header Content Format],
|
||||||
|
except that additional semi-colon delimited metadata is not supported.
|
||||||
|
Example value: "key1=value1,key2=value2".
|
||||||
|
OTEL_EXPORTER_OTLP_TRACES_HEADERS takes precedence over OTEL_EXPORTER_OTLP_HEADERS.
|
||||||
|
The configuration can be overridden by [WithHeaders] option.
|
||||||
|
|
||||||
|
OTEL_EXPORTER_OTLP_TIMEOUT, OTEL_EXPORTER_OTLP_TRACES_TIMEOUT (default: "10000") -
|
||||||
|
maximum time in milliseconds the OTLP exporter waits for each batch export.
|
||||||
|
OTEL_EXPORTER_OTLP_TRACES_TIMEOUT takes precedence over OTEL_EXPORTER_OTLP_TIMEOUT.
|
||||||
|
The configuration can be overridden by [WithTimeout] option.
|
||||||
|
|
||||||
|
OTEL_EXPORTER_OTLP_COMPRESSION, OTEL_EXPORTER_OTLP_TRACES_COMPRESSION (default: none) -
|
||||||
|
the compression strategy the exporter uses to compress the HTTP body.
|
||||||
|
Supported value: "gzip".
|
||||||
|
OTEL_EXPORTER_OTLP_TRACES_COMPRESSION takes precedence over OTEL_EXPORTER_OTLP_COMPRESSION.
|
||||||
|
The configuration can be overridden by [WithCompression] option.
|
||||||
|
|
||||||
|
OTEL_EXPORTER_OTLP_CERTIFICATE, OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE (default: none) -
|
||||||
|
the filepath to the trusted certificate to use when verifying a server's TLS credentials.
|
||||||
|
OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE takes precedence over OTEL_EXPORTER_OTLP_CERTIFICATE.
|
||||||
|
The configuration can be overridden by [WithTLSClientConfig] option.
|
||||||
|
|
||||||
|
OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE, OTEL_EXPORTER_OTLP_TRACES_CLIENT_CERTIFICATE (default: none) -
|
||||||
|
the filepath to the client certificate/chain trust for clients private key to use in mTLS communication in PEM format.
|
||||||
|
OTEL_EXPORTER_OTLP_TRACES_CLIENT_CERTIFICATE takes precedence over OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE.
|
||||||
|
The configuration can be overridden by [WithTLSClientConfig] option.
|
||||||
|
|
||||||
|
OTEL_EXPORTER_OTLP_CLIENT_KEY, OTEL_EXPORTER_OTLP_TRACES_CLIENT_KEY (default: none) -
|
||||||
|
the filepath to the clients private key to use in mTLS communication in PEM format.
|
||||||
|
OTEL_EXPORTER_OTLP_TRACES_CLIENT_KEY takes precedence over OTEL_EXPORTER_OTLP_CLIENT_KEY.
|
||||||
|
The configuration can be overridden by [WithTLSClientConfig] option.
|
||||||
|
|
||||||
|
[W3C Baggage HTTP Header Content Format]: https://www.w3.org/TR/baggage/#header-content
|
||||||
*/
|
*/
|
||||||
package otlptracehttp // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
|
package otlptracehttp // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
|
||||||
|
|
|
@ -174,13 +174,13 @@ func stringToHeader(value string) map[string]string {
|
||||||
global.Error(errors.New("missing '="), "parse headers", "input", header)
|
global.Error(errors.New("missing '="), "parse headers", "input", header)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
name, err := url.QueryUnescape(n)
|
name, err := url.PathUnescape(n)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
global.Error(err, "escape header key", "key", n)
|
global.Error(err, "escape header key", "key", n)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
trimmedName := strings.TrimSpace(name)
|
trimmedName := strings.TrimSpace(name)
|
||||||
value, err := url.QueryUnescape(v)
|
value, err := url.PathUnescape(v)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
global.Error(err, "escape header value", "value", v)
|
global.Error(err, "escape header value", "value", v)
|
||||||
continue
|
continue
|
||||||
|
|
|
@ -141,9 +141,6 @@ func NewGRPCConfig(opts ...GRPCOption) Config {
|
||||||
if cfg.Traces.Compression == GzipCompression {
|
if cfg.Traces.Compression == GzipCompression {
|
||||||
cfg.DialOptions = append(cfg.DialOptions, grpc.WithDefaultCallOptions(grpc.UseCompressor(gzip.Name)))
|
cfg.DialOptions = append(cfg.DialOptions, grpc.WithDefaultCallOptions(grpc.UseCompressor(gzip.Name)))
|
||||||
}
|
}
|
||||||
if len(cfg.DialOptions) != 0 {
|
|
||||||
cfg.DialOptions = append(cfg.DialOptions, cfg.DialOptions...)
|
|
||||||
}
|
|
||||||
if cfg.ReconnectionPeriod != 0 {
|
if cfg.ReconnectionPeriod != 0 {
|
||||||
p := grpc.ConnectParams{
|
p := grpc.ConnectParams{
|
||||||
Backoff: backoff.DefaultConfig,
|
Backoff: backoff.DefaultConfig,
|
||||||
|
|
|
@ -16,5 +16,5 @@ package otlptrace // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace"
|
||||||
|
|
||||||
// Version is the current release version of the OpenTelemetry OTLP trace exporter in use.
|
// Version is the current release version of the OpenTelemetry OTLP trace exporter in use.
|
||||||
func Version() string {
|
func Version() string {
|
||||||
return "1.19.0"
|
return "1.20.0"
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,11 +34,13 @@ type afCounter struct {
|
||||||
name string
|
name string
|
||||||
opts []metric.Float64ObservableCounterOption
|
opts []metric.Float64ObservableCounterOption
|
||||||
|
|
||||||
delegate atomic.Value //metric.Float64ObservableCounter
|
delegate atomic.Value // metric.Float64ObservableCounter
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ unwrapper = (*afCounter)(nil)
|
var (
|
||||||
var _ metric.Float64ObservableCounter = (*afCounter)(nil)
|
_ unwrapper = (*afCounter)(nil)
|
||||||
|
_ metric.Float64ObservableCounter = (*afCounter)(nil)
|
||||||
|
)
|
||||||
|
|
||||||
func (i *afCounter) setDelegate(m metric.Meter) {
|
func (i *afCounter) setDelegate(m metric.Meter) {
|
||||||
ctr, err := m.Float64ObservableCounter(i.name, i.opts...)
|
ctr, err := m.Float64ObservableCounter(i.name, i.opts...)
|
||||||
|
@ -63,11 +65,13 @@ type afUpDownCounter struct {
|
||||||
name string
|
name string
|
||||||
opts []metric.Float64ObservableUpDownCounterOption
|
opts []metric.Float64ObservableUpDownCounterOption
|
||||||
|
|
||||||
delegate atomic.Value //metric.Float64ObservableUpDownCounter
|
delegate atomic.Value // metric.Float64ObservableUpDownCounter
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ unwrapper = (*afUpDownCounter)(nil)
|
var (
|
||||||
var _ metric.Float64ObservableUpDownCounter = (*afUpDownCounter)(nil)
|
_ unwrapper = (*afUpDownCounter)(nil)
|
||||||
|
_ metric.Float64ObservableUpDownCounter = (*afUpDownCounter)(nil)
|
||||||
|
)
|
||||||
|
|
||||||
func (i *afUpDownCounter) setDelegate(m metric.Meter) {
|
func (i *afUpDownCounter) setDelegate(m metric.Meter) {
|
||||||
ctr, err := m.Float64ObservableUpDownCounter(i.name, i.opts...)
|
ctr, err := m.Float64ObservableUpDownCounter(i.name, i.opts...)
|
||||||
|
@ -92,11 +96,13 @@ type afGauge struct {
|
||||||
name string
|
name string
|
||||||
opts []metric.Float64ObservableGaugeOption
|
opts []metric.Float64ObservableGaugeOption
|
||||||
|
|
||||||
delegate atomic.Value //metric.Float64ObservableGauge
|
delegate atomic.Value // metric.Float64ObservableGauge
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ unwrapper = (*afGauge)(nil)
|
var (
|
||||||
var _ metric.Float64ObservableGauge = (*afGauge)(nil)
|
_ unwrapper = (*afGauge)(nil)
|
||||||
|
_ metric.Float64ObservableGauge = (*afGauge)(nil)
|
||||||
|
)
|
||||||
|
|
||||||
func (i *afGauge) setDelegate(m metric.Meter) {
|
func (i *afGauge) setDelegate(m metric.Meter) {
|
||||||
ctr, err := m.Float64ObservableGauge(i.name, i.opts...)
|
ctr, err := m.Float64ObservableGauge(i.name, i.opts...)
|
||||||
|
@ -121,11 +127,13 @@ type aiCounter struct {
|
||||||
name string
|
name string
|
||||||
opts []metric.Int64ObservableCounterOption
|
opts []metric.Int64ObservableCounterOption
|
||||||
|
|
||||||
delegate atomic.Value //metric.Int64ObservableCounter
|
delegate atomic.Value // metric.Int64ObservableCounter
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ unwrapper = (*aiCounter)(nil)
|
var (
|
||||||
var _ metric.Int64ObservableCounter = (*aiCounter)(nil)
|
_ unwrapper = (*aiCounter)(nil)
|
||||||
|
_ metric.Int64ObservableCounter = (*aiCounter)(nil)
|
||||||
|
)
|
||||||
|
|
||||||
func (i *aiCounter) setDelegate(m metric.Meter) {
|
func (i *aiCounter) setDelegate(m metric.Meter) {
|
||||||
ctr, err := m.Int64ObservableCounter(i.name, i.opts...)
|
ctr, err := m.Int64ObservableCounter(i.name, i.opts...)
|
||||||
|
@ -150,11 +158,13 @@ type aiUpDownCounter struct {
|
||||||
name string
|
name string
|
||||||
opts []metric.Int64ObservableUpDownCounterOption
|
opts []metric.Int64ObservableUpDownCounterOption
|
||||||
|
|
||||||
delegate atomic.Value //metric.Int64ObservableUpDownCounter
|
delegate atomic.Value // metric.Int64ObservableUpDownCounter
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ unwrapper = (*aiUpDownCounter)(nil)
|
var (
|
||||||
var _ metric.Int64ObservableUpDownCounter = (*aiUpDownCounter)(nil)
|
_ unwrapper = (*aiUpDownCounter)(nil)
|
||||||
|
_ metric.Int64ObservableUpDownCounter = (*aiUpDownCounter)(nil)
|
||||||
|
)
|
||||||
|
|
||||||
func (i *aiUpDownCounter) setDelegate(m metric.Meter) {
|
func (i *aiUpDownCounter) setDelegate(m metric.Meter) {
|
||||||
ctr, err := m.Int64ObservableUpDownCounter(i.name, i.opts...)
|
ctr, err := m.Int64ObservableUpDownCounter(i.name, i.opts...)
|
||||||
|
@ -179,11 +189,13 @@ type aiGauge struct {
|
||||||
name string
|
name string
|
||||||
opts []metric.Int64ObservableGaugeOption
|
opts []metric.Int64ObservableGaugeOption
|
||||||
|
|
||||||
delegate atomic.Value //metric.Int64ObservableGauge
|
delegate atomic.Value // metric.Int64ObservableGauge
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ unwrapper = (*aiGauge)(nil)
|
var (
|
||||||
var _ metric.Int64ObservableGauge = (*aiGauge)(nil)
|
_ unwrapper = (*aiGauge)(nil)
|
||||||
|
_ metric.Int64ObservableGauge = (*aiGauge)(nil)
|
||||||
|
)
|
||||||
|
|
||||||
func (i *aiGauge) setDelegate(m metric.Meter) {
|
func (i *aiGauge) setDelegate(m metric.Meter) {
|
||||||
ctr, err := m.Int64ObservableGauge(i.name, i.opts...)
|
ctr, err := m.Int64ObservableGauge(i.name, i.opts...)
|
||||||
|
@ -208,7 +220,7 @@ type sfCounter struct {
|
||||||
name string
|
name string
|
||||||
opts []metric.Float64CounterOption
|
opts []metric.Float64CounterOption
|
||||||
|
|
||||||
delegate atomic.Value //metric.Float64Counter
|
delegate atomic.Value // metric.Float64Counter
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ metric.Float64Counter = (*sfCounter)(nil)
|
var _ metric.Float64Counter = (*sfCounter)(nil)
|
||||||
|
@ -234,7 +246,7 @@ type sfUpDownCounter struct {
|
||||||
name string
|
name string
|
||||||
opts []metric.Float64UpDownCounterOption
|
opts []metric.Float64UpDownCounterOption
|
||||||
|
|
||||||
delegate atomic.Value //metric.Float64UpDownCounter
|
delegate atomic.Value // metric.Float64UpDownCounter
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ metric.Float64UpDownCounter = (*sfUpDownCounter)(nil)
|
var _ metric.Float64UpDownCounter = (*sfUpDownCounter)(nil)
|
||||||
|
@ -260,7 +272,7 @@ type sfHistogram struct {
|
||||||
name string
|
name string
|
||||||
opts []metric.Float64HistogramOption
|
opts []metric.Float64HistogramOption
|
||||||
|
|
||||||
delegate atomic.Value //metric.Float64Histogram
|
delegate atomic.Value // metric.Float64Histogram
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ metric.Float64Histogram = (*sfHistogram)(nil)
|
var _ metric.Float64Histogram = (*sfHistogram)(nil)
|
||||||
|
@ -286,7 +298,7 @@ type siCounter struct {
|
||||||
name string
|
name string
|
||||||
opts []metric.Int64CounterOption
|
opts []metric.Int64CounterOption
|
||||||
|
|
||||||
delegate atomic.Value //metric.Int64Counter
|
delegate atomic.Value // metric.Int64Counter
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ metric.Int64Counter = (*siCounter)(nil)
|
var _ metric.Int64Counter = (*siCounter)(nil)
|
||||||
|
@ -312,7 +324,7 @@ type siUpDownCounter struct {
|
||||||
name string
|
name string
|
||||||
opts []metric.Int64UpDownCounterOption
|
opts []metric.Int64UpDownCounterOption
|
||||||
|
|
||||||
delegate atomic.Value //metric.Int64UpDownCounter
|
delegate atomic.Value // metric.Int64UpDownCounter
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ metric.Int64UpDownCounter = (*siUpDownCounter)(nil)
|
var _ metric.Int64UpDownCounter = (*siUpDownCounter)(nil)
|
||||||
|
@ -338,7 +350,7 @@ type siHistogram struct {
|
||||||
name string
|
name string
|
||||||
opts []metric.Int64HistogramOption
|
opts []metric.Int64HistogramOption
|
||||||
|
|
||||||
delegate atomic.Value //metric.Int64Histogram
|
delegate atomic.Value // metric.Int64Histogram
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ metric.Int64Histogram = (*siHistogram)(nil)
|
var _ metric.Int64Histogram = (*siHistogram)(nil)
|
||||||
|
|
|
@ -39,6 +39,7 @@ import (
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
"go.opentelemetry.io/otel/codes"
|
"go.opentelemetry.io/otel/codes"
|
||||||
"go.opentelemetry.io/otel/trace"
|
"go.opentelemetry.io/otel/trace"
|
||||||
|
"go.opentelemetry.io/otel/trace/embedded"
|
||||||
)
|
)
|
||||||
|
|
||||||
// tracerProvider is a placeholder for a configured SDK TracerProvider.
|
// tracerProvider is a placeholder for a configured SDK TracerProvider.
|
||||||
|
@ -46,6 +47,8 @@ import (
|
||||||
// All TracerProvider functionality is forwarded to a delegate once
|
// All TracerProvider functionality is forwarded to a delegate once
|
||||||
// configured.
|
// configured.
|
||||||
type tracerProvider struct {
|
type tracerProvider struct {
|
||||||
|
embedded.TracerProvider
|
||||||
|
|
||||||
mtx sync.Mutex
|
mtx sync.Mutex
|
||||||
tracers map[il]*tracer
|
tracers map[il]*tracer
|
||||||
delegate trace.TracerProvider
|
delegate trace.TracerProvider
|
||||||
|
@ -119,6 +122,8 @@ type il struct {
|
||||||
// All Tracer functionality is forwarded to a delegate once configured.
|
// All Tracer functionality is forwarded to a delegate once configured.
|
||||||
// Otherwise, all functionality is forwarded to a NoopTracer.
|
// Otherwise, all functionality is forwarded to a NoopTracer.
|
||||||
type tracer struct {
|
type tracer struct {
|
||||||
|
embedded.Tracer
|
||||||
|
|
||||||
name string
|
name string
|
||||||
opts []trace.TracerOption
|
opts []trace.TracerOption
|
||||||
provider *tracerProvider
|
provider *tracerProvider
|
||||||
|
@ -156,6 +161,8 @@ func (t *tracer) Start(ctx context.Context, name string, opts ...trace.SpanStart
|
||||||
// SpanContext. It performs no operations other than to return the wrapped
|
// SpanContext. It performs no operations other than to return the wrapped
|
||||||
// SpanContext.
|
// SpanContext.
|
||||||
type nonRecordingSpan struct {
|
type nonRecordingSpan struct {
|
||||||
|
embedded.Span
|
||||||
|
|
||||||
sc trace.SpanContext
|
sc trace.SpanContext
|
||||||
tracer *tracer
|
tracer *tracer
|
||||||
}
|
}
|
||||||
|
|
|
@ -149,7 +149,7 @@ of [go.opentelemetry.io/otel/metric].
|
||||||
|
|
||||||
Finally, an author can embed another implementation in theirs. The embedded
|
Finally, an author can embed another implementation in theirs. The embedded
|
||||||
implementation will be used for methods not defined by the author. For example,
|
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
|
an author who wants to default to silently dropping the call can use
|
||||||
[go.opentelemetry.io/otel/metric/noop]:
|
[go.opentelemetry.io/otel/metric/noop]:
|
||||||
|
|
||||||
import "go.opentelemetry.io/otel/metric/noop"
|
import "go.opentelemetry.io/otel/metric/noop"
|
||||||
|
|
|
@ -39,6 +39,12 @@ type InstrumentOption interface {
|
||||||
Float64ObservableGaugeOption
|
Float64ObservableGaugeOption
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// HistogramOption applies options to histogram instruments.
|
||||||
|
type HistogramOption interface {
|
||||||
|
Int64HistogramOption
|
||||||
|
Float64HistogramOption
|
||||||
|
}
|
||||||
|
|
||||||
type descOpt string
|
type descOpt string
|
||||||
|
|
||||||
func (o descOpt) applyFloat64Counter(c Float64CounterConfig) Float64CounterConfig {
|
func (o descOpt) applyFloat64Counter(c Float64CounterConfig) Float64CounterConfig {
|
||||||
|
@ -171,6 +177,23 @@ func (o unitOpt) applyInt64ObservableGauge(c Int64ObservableGaugeConfig) Int64Ob
|
||||||
// The unit u should be defined using the appropriate [UCUM](https://ucum.org) case-sensitive code.
|
// The unit u should be defined using the appropriate [UCUM](https://ucum.org) case-sensitive code.
|
||||||
func WithUnit(u string) InstrumentOption { return unitOpt(u) }
|
func WithUnit(u string) InstrumentOption { return unitOpt(u) }
|
||||||
|
|
||||||
|
// WithExplicitBucketBoundaries sets the instrument explicit bucket boundaries.
|
||||||
|
//
|
||||||
|
// This option is considered "advisory", and may be ignored by API implementations.
|
||||||
|
func WithExplicitBucketBoundaries(bounds ...float64) HistogramOption { return bucketOpt(bounds) }
|
||||||
|
|
||||||
|
type bucketOpt []float64
|
||||||
|
|
||||||
|
func (o bucketOpt) applyFloat64Histogram(c Float64HistogramConfig) Float64HistogramConfig {
|
||||||
|
c.explicitBucketBoundaries = o
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o bucketOpt) applyInt64Histogram(c Int64HistogramConfig) Int64HistogramConfig {
|
||||||
|
c.explicitBucketBoundaries = o
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
// AddOption applies options to an addition measurement. See
|
// AddOption applies options to an addition measurement. See
|
||||||
// [MeasurementOption] for other options that can be used as an AddOption.
|
// [MeasurementOption] for other options that can be used as an AddOption.
|
||||||
type AddOption interface {
|
type AddOption interface {
|
||||||
|
|
|
@ -149,6 +149,7 @@ type Float64Histogram interface {
|
||||||
type Float64HistogramConfig struct {
|
type Float64HistogramConfig struct {
|
||||||
description string
|
description string
|
||||||
unit string
|
unit string
|
||||||
|
explicitBucketBoundaries []float64
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewFloat64HistogramConfig returns a new [Float64HistogramConfig] with all
|
// NewFloat64HistogramConfig returns a new [Float64HistogramConfig] with all
|
||||||
|
@ -171,6 +172,11 @@ func (c Float64HistogramConfig) Unit() string {
|
||||||
return c.unit
|
return c.unit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ExplicitBucketBoundaries returns the configured explicit bucket boundaries.
|
||||||
|
func (c Float64HistogramConfig) ExplicitBucketBoundaries() []float64 {
|
||||||
|
return c.explicitBucketBoundaries
|
||||||
|
}
|
||||||
|
|
||||||
// Float64HistogramOption applies options to a [Float64HistogramConfig]. See
|
// Float64HistogramOption applies options to a [Float64HistogramConfig]. See
|
||||||
// [InstrumentOption] for other options that can be used as a
|
// [InstrumentOption] for other options that can be used as a
|
||||||
// Float64HistogramOption.
|
// Float64HistogramOption.
|
||||||
|
|
|
@ -149,6 +149,7 @@ type Int64Histogram interface {
|
||||||
type Int64HistogramConfig struct {
|
type Int64HistogramConfig struct {
|
||||||
description string
|
description string
|
||||||
unit string
|
unit string
|
||||||
|
explicitBucketBoundaries []float64
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewInt64HistogramConfig returns a new [Int64HistogramConfig] with all opts
|
// NewInt64HistogramConfig returns a new [Int64HistogramConfig] with all opts
|
||||||
|
@ -171,6 +172,11 @@ func (c Int64HistogramConfig) Unit() string {
|
||||||
return c.unit
|
return c.unit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ExplicitBucketBoundaries returns the configured explicit bucket boundaries.
|
||||||
|
func (c Int64HistogramConfig) ExplicitBucketBoundaries() []float64 {
|
||||||
|
return c.explicitBucketBoundaries
|
||||||
|
}
|
||||||
|
|
||||||
// Int64HistogramOption applies options to a [Int64HistogramConfig]. See
|
// Int64HistogramOption applies options to a [Int64HistogramConfig]. See
|
||||||
// [InstrumentOption] for other options that can be used as an
|
// [InstrumentOption] for other options that can be used as an
|
||||||
// Int64HistogramOption.
|
// Int64HistogramOption.
|
||||||
|
|
|
@ -40,8 +40,10 @@ const (
|
||||||
// their proprietary information.
|
// their proprietary information.
|
||||||
type TraceContext struct{}
|
type TraceContext struct{}
|
||||||
|
|
||||||
var _ TextMapPropagator = TraceContext{}
|
var (
|
||||||
var traceCtxRegExp = regexp.MustCompile("^(?P<version>[0-9a-f]{2})-(?P<traceID>[a-f0-9]{32})-(?P<spanID>[a-f0-9]{16})-(?P<traceFlags>[a-f0-9]{2})(?:-.*)?$")
|
_ TextMapPropagator = TraceContext{}
|
||||||
|
traceCtxRegExp = regexp.MustCompile("^(?P<version>[0-9a-f]{2})-(?P<traceID>[a-f0-9]{32})-(?P<spanID>[a-f0-9]{16})-(?P<traceFlags>[a-f0-9]{2})(?:-.*)?$")
|
||||||
|
)
|
||||||
|
|
||||||
// Inject set tracecontext from the Context into the carrier.
|
// Inject set tracecontext from the Context into the carrier.
|
||||||
func (tc TraceContext) Inject(ctx context.Context, carrier TextMapCarrier) {
|
func (tc TraceContext) Inject(ctx context.Context, carrier TextMapCarrier) {
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
codespell==2.2.5
|
codespell==2.2.6
|
||||||
|
|
|
@ -21,12 +21,10 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
// ErrPartialResource is returned by a detector when complete source
|
||||||
// ErrPartialResource is returned by a detector when complete source
|
// information for a Resource is unavailable or the source information
|
||||||
// information for a Resource is unavailable or the source information
|
// contains invalid values that are omitted from the returned Resource.
|
||||||
// contains invalid values that are omitted from the returned Resource.
|
var ErrPartialResource = errors.New("partial resource")
|
||||||
ErrPartialResource = errors.New("partial resource")
|
|
||||||
)
|
|
||||||
|
|
||||||
// Detector detects OpenTelemetry resource information.
|
// Detector detects OpenTelemetry resource information.
|
||||||
type Detector interface {
|
type Detector interface {
|
||||||
|
|
|
@ -28,16 +28,14 @@ import (
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// resourceAttrKey is the environment variable name OpenTelemetry Resource information will be read from.
|
// resourceAttrKey is the environment variable name OpenTelemetry Resource information will be read from.
|
||||||
resourceAttrKey = "OTEL_RESOURCE_ATTRIBUTES"
|
resourceAttrKey = "OTEL_RESOURCE_ATTRIBUTES" //nolint:gosec // False positive G101: Potential hardcoded credentials
|
||||||
|
|
||||||
// svcNameKey is the environment variable name that Service Name information will be read from.
|
// svcNameKey is the environment variable name that Service Name information will be read from.
|
||||||
svcNameKey = "OTEL_SERVICE_NAME"
|
svcNameKey = "OTEL_SERVICE_NAME"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
// errMissingValue is returned when a resource value is missing.
|
||||||
// errMissingValue is returned when a resource value is missing.
|
var errMissingValue = fmt.Errorf("%w: missing value", ErrPartialResource)
|
||||||
errMissingValue = fmt.Errorf("%w: missing value", ErrPartialResource)
|
|
||||||
)
|
|
||||||
|
|
||||||
// fromEnv is a Detector that implements the Detector and collects
|
// fromEnv is a Detector that implements the Detector and collects
|
||||||
// resources from environment. This Detector is included as a
|
// resources from environment. This Detector is included as a
|
||||||
|
@ -91,7 +89,7 @@ func constructOTResources(s string) (*Resource, error) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
key := strings.TrimSpace(k)
|
key := strings.TrimSpace(k)
|
||||||
val, err := url.QueryUnescape(strings.TrimSpace(v))
|
val, err := url.PathUnescape(strings.TrimSpace(v))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Retain original value if decoding fails, otherwise it will be
|
// Retain original value if decoding fails, otherwise it will be
|
||||||
// an empty string.
|
// an empty string.
|
||||||
|
|
|
@ -36,8 +36,10 @@ func setOSDescriptionProvider(osDescriptionProvider osDescriptionProvider) {
|
||||||
osDescription = osDescriptionProvider
|
osDescription = osDescriptionProvider
|
||||||
}
|
}
|
||||||
|
|
||||||
type osTypeDetector struct{}
|
type (
|
||||||
type osDescriptionDetector struct{}
|
osTypeDetector struct{}
|
||||||
|
osDescriptionDetector struct{}
|
||||||
|
)
|
||||||
|
|
||||||
// Detect returns a *Resource that describes the operating system type the
|
// Detect returns a *Resource that describes the operating system type the
|
||||||
// service is running on.
|
// service is running on.
|
||||||
|
@ -56,7 +58,6 @@ func (osTypeDetector) Detect(ctx context.Context) (*Resource, error) {
|
||||||
// service is running on.
|
// service is running on.
|
||||||
func (osDescriptionDetector) Detect(ctx context.Context) (*Resource, error) {
|
func (osDescriptionDetector) Detect(ctx context.Context) (*Resource, error) {
|
||||||
description, err := osDescription()
|
description, err := osDescription()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,14 +25,16 @@ import (
|
||||||
semconv "go.opentelemetry.io/otel/semconv/v1.21.0"
|
semconv "go.opentelemetry.io/otel/semconv/v1.21.0"
|
||||||
)
|
)
|
||||||
|
|
||||||
type pidProvider func() int
|
type (
|
||||||
type executablePathProvider func() (string, error)
|
pidProvider func() int
|
||||||
type commandArgsProvider func() []string
|
executablePathProvider func() (string, error)
|
||||||
type ownerProvider func() (*user.User, error)
|
commandArgsProvider func() []string
|
||||||
type runtimeNameProvider func() string
|
ownerProvider func() (*user.User, error)
|
||||||
type runtimeVersionProvider func() string
|
runtimeNameProvider func() string
|
||||||
type runtimeOSProvider func() string
|
runtimeVersionProvider func() string
|
||||||
type runtimeArchProvider func() string
|
runtimeOSProvider func() string
|
||||||
|
runtimeArchProvider func() string
|
||||||
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
defaultPidProvider pidProvider = os.Getpid
|
defaultPidProvider pidProvider = os.Getpid
|
||||||
|
@ -108,14 +110,16 @@ func setUserProviders(ownerProvider ownerProvider) {
|
||||||
owner = ownerProvider
|
owner = ownerProvider
|
||||||
}
|
}
|
||||||
|
|
||||||
type processPIDDetector struct{}
|
type (
|
||||||
type processExecutableNameDetector struct{}
|
processPIDDetector struct{}
|
||||||
type processExecutablePathDetector struct{}
|
processExecutableNameDetector struct{}
|
||||||
type processCommandArgsDetector struct{}
|
processExecutablePathDetector struct{}
|
||||||
type processOwnerDetector struct{}
|
processCommandArgsDetector struct{}
|
||||||
type processRuntimeNameDetector struct{}
|
processOwnerDetector struct{}
|
||||||
type processRuntimeVersionDetector struct{}
|
processRuntimeNameDetector struct{}
|
||||||
type processRuntimeDescriptionDetector struct{}
|
processRuntimeVersionDetector struct{}
|
||||||
|
processRuntimeDescriptionDetector struct{}
|
||||||
|
)
|
||||||
|
|
||||||
// Detect returns a *Resource that describes the process identifier (PID) of the
|
// Detect returns a *Resource that describes the process identifier (PID) of the
|
||||||
// executing process.
|
// executing process.
|
||||||
|
|
|
@ -25,6 +25,8 @@ import (
|
||||||
"go.opentelemetry.io/otel/sdk/instrumentation"
|
"go.opentelemetry.io/otel/sdk/instrumentation"
|
||||||
"go.opentelemetry.io/otel/sdk/resource"
|
"go.opentelemetry.io/otel/sdk/resource"
|
||||||
"go.opentelemetry.io/otel/trace"
|
"go.opentelemetry.io/otel/trace"
|
||||||
|
"go.opentelemetry.io/otel/trace/embedded"
|
||||||
|
"go.opentelemetry.io/otel/trace/noop"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -73,6 +75,8 @@ func (cfg tracerProviderConfig) MarshalLog() interface{} {
|
||||||
// TracerProvider is an OpenTelemetry TracerProvider. It provides Tracers to
|
// TracerProvider is an OpenTelemetry TracerProvider. It provides Tracers to
|
||||||
// instrumentation so it can trace operational flow through a system.
|
// instrumentation so it can trace operational flow through a system.
|
||||||
type TracerProvider struct {
|
type TracerProvider struct {
|
||||||
|
embedded.TracerProvider
|
||||||
|
|
||||||
mu sync.Mutex
|
mu sync.Mutex
|
||||||
namedTracer map[instrumentation.Scope]*tracer
|
namedTracer map[instrumentation.Scope]*tracer
|
||||||
spanProcessors atomic.Pointer[spanProcessorStates]
|
spanProcessors atomic.Pointer[spanProcessorStates]
|
||||||
|
@ -139,7 +143,7 @@ func NewTracerProvider(opts ...TracerProviderOption) *TracerProvider {
|
||||||
func (p *TracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer {
|
func (p *TracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer {
|
||||||
// This check happens before the mutex is acquired to avoid deadlocking if Tracer() is called from within Shutdown().
|
// This check happens before the mutex is acquired to avoid deadlocking if Tracer() is called from within Shutdown().
|
||||||
if p.isShutdown.Load() {
|
if p.isShutdown.Load() {
|
||||||
return trace.NewNoopTracerProvider().Tracer(name, opts...)
|
return noop.NewTracerProvider().Tracer(name, opts...)
|
||||||
}
|
}
|
||||||
c := trace.NewTracerConfig(opts...)
|
c := trace.NewTracerConfig(opts...)
|
||||||
if name == "" {
|
if name == "" {
|
||||||
|
@ -157,7 +161,7 @@ func (p *TracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.T
|
||||||
// Must check the flag after acquiring the mutex to avoid returning a valid tracer if Shutdown() ran
|
// Must check the flag after acquiring the mutex to avoid returning a valid tracer if Shutdown() ran
|
||||||
// after the first check above but before we acquired the mutex.
|
// after the first check above but before we acquired the mutex.
|
||||||
if p.isShutdown.Load() {
|
if p.isShutdown.Load() {
|
||||||
return trace.NewNoopTracerProvider().Tracer(name, opts...), true
|
return noop.NewTracerProvider().Tracer(name, opts...), true
|
||||||
}
|
}
|
||||||
t, ok := p.namedTracer[is]
|
t, ok := p.namedTracer[is]
|
||||||
if !ok {
|
if !ok {
|
||||||
|
|
|
@ -158,9 +158,9 @@ func NeverSample() Sampler {
|
||||||
return alwaysOffSampler{}
|
return alwaysOffSampler{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ParentBased returns a composite sampler which behaves differently,
|
// ParentBased returns a sampler decorator which behaves differently,
|
||||||
// based on the parent of the span. If the span has no parent,
|
// based on the parent of the span. If the span has no parent,
|
||||||
// the root(Sampler) is used to make sampling decision. If the span has
|
// the decorated sampler is used to make sampling decision. If the span has
|
||||||
// a parent, depending on whether the parent is remote and whether it
|
// a parent, depending on whether the parent is remote and whether it
|
||||||
// is sampled, one of the following samplers will apply:
|
// is sampled, one of the following samplers will apply:
|
||||||
// - remoteParentSampled(Sampler) (default: AlwaysOn)
|
// - remoteParentSampled(Sampler) (default: AlwaysOn)
|
||||||
|
|
|
@ -32,6 +32,7 @@ import (
|
||||||
"go.opentelemetry.io/otel/sdk/resource"
|
"go.opentelemetry.io/otel/sdk/resource"
|
||||||
semconv "go.opentelemetry.io/otel/semconv/v1.21.0"
|
semconv "go.opentelemetry.io/otel/semconv/v1.21.0"
|
||||||
"go.opentelemetry.io/otel/trace"
|
"go.opentelemetry.io/otel/trace"
|
||||||
|
"go.opentelemetry.io/otel/trace/embedded"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ReadOnlySpan allows reading information from the data structure underlying a
|
// ReadOnlySpan allows reading information from the data structure underlying a
|
||||||
|
@ -108,6 +109,8 @@ type ReadWriteSpan interface {
|
||||||
// recordingSpan is an implementation of the OpenTelemetry Span API
|
// recordingSpan is an implementation of the OpenTelemetry Span API
|
||||||
// representing the individual component of a trace that is sampled.
|
// representing the individual component of a trace that is sampled.
|
||||||
type recordingSpan struct {
|
type recordingSpan struct {
|
||||||
|
embedded.Span
|
||||||
|
|
||||||
// mu protects the contents of this span.
|
// mu protects the contents of this span.
|
||||||
mu sync.Mutex
|
mu sync.Mutex
|
||||||
|
|
||||||
|
@ -158,8 +161,10 @@ type recordingSpan struct {
|
||||||
tracer *tracer
|
tracer *tracer
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ ReadWriteSpan = (*recordingSpan)(nil)
|
var (
|
||||||
var _ runtimeTracer = (*recordingSpan)(nil)
|
_ ReadWriteSpan = (*recordingSpan)(nil)
|
||||||
|
_ runtimeTracer = (*recordingSpan)(nil)
|
||||||
|
)
|
||||||
|
|
||||||
// SpanContext returns the SpanContext of this span.
|
// SpanContext returns the SpanContext of this span.
|
||||||
func (s *recordingSpan) SpanContext() trace.SpanContext {
|
func (s *recordingSpan) SpanContext() trace.SpanContext {
|
||||||
|
@ -772,6 +777,8 @@ func (s *recordingSpan) runtimeTrace(ctx context.Context) context.Context {
|
||||||
// that wraps a SpanContext. It performs no operations other than to return
|
// that wraps a SpanContext. It performs no operations other than to return
|
||||||
// the wrapped SpanContext or TracerProvider that created it.
|
// the wrapped SpanContext or TracerProvider that created it.
|
||||||
type nonRecordingSpan struct {
|
type nonRecordingSpan struct {
|
||||||
|
embedded.Span
|
||||||
|
|
||||||
// tracer is the SDK tracer that created this span.
|
// tracer is the SDK tracer that created this span.
|
||||||
tracer *tracer
|
tracer *tracer
|
||||||
sc trace.SpanContext
|
sc trace.SpanContext
|
||||||
|
|
|
@ -20,9 +20,12 @@ import (
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/sdk/instrumentation"
|
"go.opentelemetry.io/otel/sdk/instrumentation"
|
||||||
"go.opentelemetry.io/otel/trace"
|
"go.opentelemetry.io/otel/trace"
|
||||||
|
"go.opentelemetry.io/otel/trace/embedded"
|
||||||
)
|
)
|
||||||
|
|
||||||
type tracer struct {
|
type tracer struct {
|
||||||
|
embedded.Tracer
|
||||||
|
|
||||||
provider *TracerProvider
|
provider *TracerProvider
|
||||||
instrumentationScope instrumentation.Scope
|
instrumentationScope instrumentation.Scope
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,5 +16,5 @@ package sdk // import "go.opentelemetry.io/otel/sdk"
|
||||||
|
|
||||||
// Version is the current release version of the OpenTelemetry SDK in use.
|
// Version is the current release version of the OpenTelemetry SDK in use.
|
||||||
func Version() string {
|
func Version() string {
|
||||||
return "1.19.0"
|
return "1.20.0"
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 internal // import "go.opentelemetry.io/otel/semconv/internal/v2"
|
package internal // import "go.opentelemetry.io/otel/semconv/internal/v4"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
@ -30,7 +30,8 @@ type HTTPConv struct {
|
||||||
|
|
||||||
EnduserIDKey attribute.Key
|
EnduserIDKey attribute.Key
|
||||||
HTTPClientIPKey attribute.Key
|
HTTPClientIPKey attribute.Key
|
||||||
HTTPFlavorKey attribute.Key
|
NetProtocolNameKey attribute.Key
|
||||||
|
NetProtocolVersionKey attribute.Key
|
||||||
HTTPMethodKey attribute.Key
|
HTTPMethodKey attribute.Key
|
||||||
HTTPRequestContentLengthKey attribute.Key
|
HTTPRequestContentLengthKey attribute.Key
|
||||||
HTTPResponseContentLengthKey attribute.Key
|
HTTPResponseContentLengthKey attribute.Key
|
||||||
|
@ -40,7 +41,7 @@ type HTTPConv struct {
|
||||||
HTTPStatusCodeKey attribute.Key
|
HTTPStatusCodeKey attribute.Key
|
||||||
HTTPTargetKey attribute.Key
|
HTTPTargetKey attribute.Key
|
||||||
HTTPURLKey attribute.Key
|
HTTPURLKey attribute.Key
|
||||||
HTTPUserAgentKey attribute.Key
|
UserAgentOriginalKey attribute.Key
|
||||||
}
|
}
|
||||||
|
|
||||||
// ClientResponse returns attributes for an HTTP response received by a client
|
// ClientResponse returns attributes for an HTTP response received by a client
|
||||||
|
@ -121,7 +122,7 @@ func (c *HTTPConv) ClientRequest(req *http.Request) []attribute.KeyValue {
|
||||||
}
|
}
|
||||||
|
|
||||||
if useragent != "" {
|
if useragent != "" {
|
||||||
attrs = append(attrs, c.HTTPUserAgentKey.String(useragent))
|
attrs = append(attrs, c.UserAgentOriginalKey.String(useragent))
|
||||||
}
|
}
|
||||||
|
|
||||||
if l := req.ContentLength; l > 0 {
|
if l := req.ContentLength; l > 0 {
|
||||||
|
@ -220,7 +221,7 @@ func (c *HTTPConv) ServerRequest(server string, req *http.Request) []attribute.K
|
||||||
}
|
}
|
||||||
|
|
||||||
if useragent != "" {
|
if useragent != "" {
|
||||||
attrs = append(attrs, c.HTTPUserAgentKey.String(useragent))
|
attrs = append(attrs, c.UserAgentOriginalKey.String(useragent))
|
||||||
}
|
}
|
||||||
|
|
||||||
if hasUserID {
|
if hasUserID {
|
||||||
|
@ -251,15 +252,15 @@ func (c *HTTPConv) scheme(https bool) attribute.KeyValue { // nolint:revive
|
||||||
func (c *HTTPConv) proto(proto string) attribute.KeyValue {
|
func (c *HTTPConv) proto(proto string) attribute.KeyValue {
|
||||||
switch proto {
|
switch proto {
|
||||||
case "HTTP/1.0":
|
case "HTTP/1.0":
|
||||||
return c.HTTPFlavorKey.String("1.0")
|
return c.NetProtocolVersionKey.String("1.0")
|
||||||
case "HTTP/1.1":
|
case "HTTP/1.1":
|
||||||
return c.HTTPFlavorKey.String("1.1")
|
return c.NetProtocolVersionKey.String("1.1")
|
||||||
case "HTTP/2":
|
case "HTTP/2":
|
||||||
return c.HTTPFlavorKey.String("2.0")
|
return c.NetProtocolVersionKey.String("2.0")
|
||||||
case "HTTP/3":
|
case "HTTP/3":
|
||||||
return c.HTTPFlavorKey.String("3.0")
|
return c.NetProtocolVersionKey.String("3.0")
|
||||||
default:
|
default:
|
||||||
return c.HTTPFlavorKey.String(proto)
|
return c.NetProtocolNameKey.String(proto)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 internal // import "go.opentelemetry.io/otel/semconv/internal/v2"
|
package internal // import "go.opentelemetry.io/otel/semconv/internal/v4"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"net"
|
"net"
|
|
@ -1,20 +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 semconv implements OpenTelemetry semantic conventions.
|
|
||||||
//
|
|
||||||
// OpenTelemetry semantic conventions are agreed standardized naming
|
|
||||||
// patterns for OpenTelemetry things. This package represents the conventions
|
|
||||||
// as of the v1.17.0 version of the OpenTelemetry specification.
|
|
||||||
package semconv // import "go.opentelemetry.io/otel/semconv/v1.17.0"
|
|
|
@ -1,199 +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.
|
|
||||||
|
|
||||||
// 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)
|
|
||||||
}
|
|
|
@ -1,21 +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 semconv // import "go.opentelemetry.io/otel/semconv/v1.17.0"
|
|
||||||
|
|
||||||
// HTTP scheme attributes.
|
|
||||||
var (
|
|
||||||
HTTPSchemeHTTP = HTTPSchemeKey.String("http")
|
|
||||||
HTTPSchemeHTTPS = HTTPSchemeKey.String("https")
|
|
||||||
)
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,20 +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 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"
|
|
File diff suppressed because it is too large
Load Diff
|
@ -14,15 +14,15 @@
|
||||||
|
|
||||||
// Package httpconv provides OpenTelemetry HTTP semantic conventions for
|
// Package httpconv provides OpenTelemetry HTTP semantic conventions for
|
||||||
// tracing telemetry.
|
// tracing telemetry.
|
||||||
package httpconv // import "go.opentelemetry.io/otel/semconv/v1.17.0/httpconv"
|
package httpconv // import "go.opentelemetry.io/otel/semconv/v1.20.0/httpconv"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
"go.opentelemetry.io/otel/codes"
|
"go.opentelemetry.io/otel/codes"
|
||||||
"go.opentelemetry.io/otel/semconv/internal/v2"
|
"go.opentelemetry.io/otel/semconv/internal/v4"
|
||||||
semconv "go.opentelemetry.io/otel/semconv/v1.17.0"
|
semconv "go.opentelemetry.io/otel/semconv/v1.20.0"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -44,7 +44,8 @@ var (
|
||||||
|
|
||||||
EnduserIDKey: semconv.EnduserIDKey,
|
EnduserIDKey: semconv.EnduserIDKey,
|
||||||
HTTPClientIPKey: semconv.HTTPClientIPKey,
|
HTTPClientIPKey: semconv.HTTPClientIPKey,
|
||||||
HTTPFlavorKey: semconv.HTTPFlavorKey,
|
NetProtocolNameKey: semconv.NetProtocolNameKey,
|
||||||
|
NetProtocolVersionKey: semconv.NetProtocolVersionKey,
|
||||||
HTTPMethodKey: semconv.HTTPMethodKey,
|
HTTPMethodKey: semconv.HTTPMethodKey,
|
||||||
HTTPRequestContentLengthKey: semconv.HTTPRequestContentLengthKey,
|
HTTPRequestContentLengthKey: semconv.HTTPRequestContentLengthKey,
|
||||||
HTTPResponseContentLengthKey: semconv.HTTPResponseContentLengthKey,
|
HTTPResponseContentLengthKey: semconv.HTTPResponseContentLengthKey,
|
||||||
|
@ -54,7 +55,7 @@ var (
|
||||||
HTTPStatusCodeKey: semconv.HTTPStatusCodeKey,
|
HTTPStatusCodeKey: semconv.HTTPStatusCodeKey,
|
||||||
HTTPTargetKey: semconv.HTTPTargetKey,
|
HTTPTargetKey: semconv.HTTPTargetKey,
|
||||||
HTTPURLKey: semconv.HTTPURLKey,
|
HTTPURLKey: semconv.HTTPURLKey,
|
||||||
HTTPUserAgentKey: semconv.HTTPUserAgentKey,
|
UserAgentOriginalKey: semconv.UserAgentOriginalKey,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -74,10 +75,11 @@ func ClientResponse(resp *http.Response) []attribute.KeyValue {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ClientRequest returns trace attributes for an HTTP request made by a client.
|
// ClientRequest returns trace attributes for an HTTP request made by a client.
|
||||||
// The following attributes are always returned: "http.url", "http.flavor",
|
// The following attributes are always returned: "http.url",
|
||||||
// "http.method", "net.peer.name". The following attributes are returned if the
|
// "net.protocol.(name|version)", "http.method", "net.peer.name".
|
||||||
// related values are defined in req: "net.peer.port", "http.user_agent",
|
// The following attributes are returned if the related values are defined
|
||||||
// "http.request_content_length", "enduser.id".
|
// in req: "net.peer.port", "http.user_agent", "http.request_content_length",
|
||||||
|
// "enduser.id".
|
||||||
func ClientRequest(req *http.Request) []attribute.KeyValue {
|
func ClientRequest(req *http.Request) []attribute.KeyValue {
|
||||||
return hc.ClientRequest(req)
|
return hc.ClientRequest(req)
|
||||||
}
|
}
|
||||||
|
@ -106,10 +108,10 @@ func ClientStatus(code int) (codes.Code, string) {
|
||||||
// The req Host will be used to determine the server instead.
|
// The req Host will be used to determine the server instead.
|
||||||
//
|
//
|
||||||
// The following attributes are always returned: "http.method", "http.scheme",
|
// The following attributes are always returned: "http.method", "http.scheme",
|
||||||
// "http.flavor", "http.target", "net.host.name". The following attributes are
|
// ""net.protocol.(name|version)", "http.target", "net.host.name".
|
||||||
// returned if they related values are defined in req: "net.host.port",
|
// The following attributes are returned if they related values are defined
|
||||||
// "net.sock.peer.addr", "net.sock.peer.port", "http.user_agent", "enduser.id",
|
// in req: "net.host.port", "net.sock.peer.addr", "net.sock.peer.port",
|
||||||
// "http.client_ip".
|
// "user_agent.original", "enduser.id", "http.client_ip".
|
||||||
func ServerRequest(server string, req *http.Request) []attribute.KeyValue {
|
func ServerRequest(server string, req *http.Request) []attribute.KeyValue {
|
||||||
return hc.ServerRequest(server, req)
|
return hc.ServerRequest(server, req)
|
||||||
}
|
}
|
||||||
|
@ -128,7 +130,7 @@ func ServerStatus(code int) (codes.Code, string) {
|
||||||
// security risk - explicit configuration helps avoid leaking sensitive
|
// security risk - explicit configuration helps avoid leaking sensitive
|
||||||
// information.
|
// information.
|
||||||
//
|
//
|
||||||
// The User-Agent header is already captured in the http.user_agent attribute
|
// The User-Agent header is already captured in the user_agent.original attribute
|
||||||
// from ClientRequest and ServerRequest. Instrumentation may provide an option
|
// from ClientRequest and ServerRequest. Instrumentation may provide an option
|
||||||
// to capture that header here even though it is not recommended. Otherwise,
|
// to capture that header here even though it is not recommended. Otherwise,
|
||||||
// instrumentation should filter that out of what is passed.
|
// instrumentation should filter that out of what is passed.
|
||||||
|
@ -143,7 +145,7 @@ func RequestHeader(h http.Header) []attribute.KeyValue {
|
||||||
// security risk - explicit configuration helps avoid leaking sensitive
|
// security risk - explicit configuration helps avoid leaking sensitive
|
||||||
// information.
|
// information.
|
||||||
//
|
//
|
||||||
// The User-Agent header is already captured in the http.user_agent attribute
|
// The User-Agent header is already captured in the user_agent.original attribute
|
||||||
// from ClientRequest and ServerRequest. Instrumentation may provide an option
|
// from ClientRequest and ServerRequest. Instrumentation may provide an option
|
||||||
// to capture that header here even though it is not recommended. Otherwise,
|
// to capture that header here even though it is not recommended. Otherwise,
|
||||||
// instrumentation should filter that out of what is passed.
|
// instrumentation should filter that out of what is passed.
|
|
@ -268,6 +268,7 @@ func (o stackTraceOption) applyEvent(c EventConfig) EventConfig {
|
||||||
c.stackTrace = bool(o)
|
c.stackTrace = bool(o)
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o stackTraceOption) applySpan(c SpanConfig) SpanConfig {
|
func (o stackTraceOption) applySpan(c SpanConfig) SpanConfig {
|
||||||
c.stackTrace = bool(o)
|
c.stackTrace = bool(o)
|
||||||
return c
|
return c
|
||||||
|
|
|
@ -62,5 +62,69 @@ a default.
|
||||||
defer span.End()
|
defer span.End()
|
||||||
// ...
|
// ...
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# 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/trace/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/trace/embedded] in their implementation. For
|
||||||
|
example,
|
||||||
|
|
||||||
|
import "go.opentelemetry.io/otel/trace/embedded"
|
||||||
|
|
||||||
|
type TracerProvider struct {
|
||||||
|
embedded.TracerProvider
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
|
||||||
|
If an author wants the default behavior of their implementations to panic, they
|
||||||
|
can embed the API interface directly.
|
||||||
|
|
||||||
|
import "go.opentelemetry.io/otel/trace"
|
||||||
|
|
||||||
|
type TracerProvider struct {
|
||||||
|
trace.TracerProvider
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
|
||||||
|
This option is not recommended. It will lead to publishing packages that
|
||||||
|
contain runtime panics when users update to newer versions of
|
||||||
|
[go.opentelemetry.io/otel/trace], which may be done with a trasitive
|
||||||
|
dependency.
|
||||||
|
|
||||||
|
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 wants to default to silently dropping the call can use
|
||||||
|
[go.opentelemetry.io/otel/trace/noop]:
|
||||||
|
|
||||||
|
import "go.opentelemetry.io/otel/trace/noop"
|
||||||
|
|
||||||
|
type TracerProvider struct {
|
||||||
|
noop.TracerProvider
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
|
||||||
|
It is strongly recommended that authors only embed
|
||||||
|
[go.opentelemetry.io/otel/trace/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.
|
||||||
*/
|
*/
|
||||||
package trace // import "go.opentelemetry.io/otel/trace"
|
package trace // import "go.opentelemetry.io/otel/trace"
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
// 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
|
||||||
|
// trace API].
|
||||||
|
//
|
||||||
|
// Implementers of the [OpenTelemetry trace 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 trace API] is
|
||||||
|
// extended (which is something that can happen without a major version bump of
|
||||||
|
// the API package).
|
||||||
|
//
|
||||||
|
// [OpenTelemetry trace API]: https://pkg.go.dev/go.opentelemetry.io/otel/trace
|
||||||
|
package embedded // import "go.opentelemetry.io/otel/trace/embedded"
|
||||||
|
|
||||||
|
// TracerProvider is embedded in
|
||||||
|
// [go.opentelemetry.io/otel/trace.TracerProvider].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/trace.TracerProvider] if you want users to
|
||||||
|
// experience a compilation error, signaling they need to update to your latest
|
||||||
|
// implementation, when the [go.opentelemetry.io/otel/trace.TracerProvider]
|
||||||
|
// interface is extended (which is something that can happen without a major
|
||||||
|
// version bump of the API package).
|
||||||
|
type TracerProvider interface{ tracerProvider() }
|
||||||
|
|
||||||
|
// Tracer is embedded in [go.opentelemetry.io/otel/trace.Tracer].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/trace.Tracer] if you want users to experience a
|
||||||
|
// compilation error, signaling they need to update to your latest
|
||||||
|
// implementation, when the [go.opentelemetry.io/otel/trace.Tracer] interface
|
||||||
|
// is extended (which is something that can happen without a major version bump
|
||||||
|
// of the API package).
|
||||||
|
type Tracer interface{ tracer() }
|
||||||
|
|
||||||
|
// Span is embedded in [go.opentelemetry.io/otel/trace.Span].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/trace.Span] if you want users to experience a
|
||||||
|
// compilation error, signaling they need to update to your latest
|
||||||
|
// implementation, when the [go.opentelemetry.io/otel/trace.Span] interface is
|
||||||
|
// extended (which is something that can happen without a major version bump of
|
||||||
|
// the API package).
|
||||||
|
type Span interface{ span() }
|
|
@ -19,16 +19,20 @@ import (
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
"go.opentelemetry.io/otel/codes"
|
"go.opentelemetry.io/otel/codes"
|
||||||
|
"go.opentelemetry.io/otel/trace/embedded"
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewNoopTracerProvider returns an implementation of TracerProvider that
|
// NewNoopTracerProvider returns an implementation of TracerProvider that
|
||||||
// performs no operations. The Tracer and Spans created from the returned
|
// performs no operations. The Tracer and Spans created from the returned
|
||||||
// TracerProvider also perform no operations.
|
// TracerProvider also perform no operations.
|
||||||
|
//
|
||||||
|
// Deprecated: Use [go.opentelemetry.io/otel/trace/noop.NewTracerProvider]
|
||||||
|
// instead.
|
||||||
func NewNoopTracerProvider() TracerProvider {
|
func NewNoopTracerProvider() TracerProvider {
|
||||||
return noopTracerProvider{}
|
return noopTracerProvider{}
|
||||||
}
|
}
|
||||||
|
|
||||||
type noopTracerProvider struct{}
|
type noopTracerProvider struct{ embedded.TracerProvider }
|
||||||
|
|
||||||
var _ TracerProvider = noopTracerProvider{}
|
var _ TracerProvider = noopTracerProvider{}
|
||||||
|
|
||||||
|
@ -38,7 +42,7 @@ func (p noopTracerProvider) Tracer(string, ...TracerOption) Tracer {
|
||||||
}
|
}
|
||||||
|
|
||||||
// noopTracer is an implementation of Tracer that performs no operations.
|
// noopTracer is an implementation of Tracer that performs no operations.
|
||||||
type noopTracer struct{}
|
type noopTracer struct{ embedded.Tracer }
|
||||||
|
|
||||||
var _ Tracer = noopTracer{}
|
var _ Tracer = noopTracer{}
|
||||||
|
|
||||||
|
@ -54,7 +58,7 @@ func (t noopTracer) Start(ctx context.Context, name string, _ ...SpanStartOption
|
||||||
}
|
}
|
||||||
|
|
||||||
// noopSpan is an implementation of Span that performs no operations.
|
// noopSpan is an implementation of Span that performs no operations.
|
||||||
type noopSpan struct{}
|
type noopSpan struct{ embedded.Span }
|
||||||
|
|
||||||
var _ Span = noopSpan{}
|
var _ Span = noopSpan{}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,118 @@
|
||||||
|
// 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 noop provides an implementation of the OpenTelemetry trace API that
|
||||||
|
// produces no telemetry and minimizes used computation resources.
|
||||||
|
//
|
||||||
|
// Using this package to implement the OpenTelemetry trace API will effectively
|
||||||
|
// disable OpenTelemetry.
|
||||||
|
//
|
||||||
|
// This implementation can be embedded in other implementations of the
|
||||||
|
// OpenTelemetry trace API. Doing so will mean the implementation defaults to
|
||||||
|
// no operation for methods it does not implement.
|
||||||
|
package noop // import "go.opentelemetry.io/otel/trace/noop"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/attribute"
|
||||||
|
"go.opentelemetry.io/otel/codes"
|
||||||
|
"go.opentelemetry.io/otel/trace"
|
||||||
|
"go.opentelemetry.io/otel/trace/embedded"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// Compile-time check this implements the OpenTelemetry API.
|
||||||
|
|
||||||
|
_ trace.TracerProvider = TracerProvider{}
|
||||||
|
_ trace.Tracer = Tracer{}
|
||||||
|
_ trace.Span = Span{}
|
||||||
|
)
|
||||||
|
|
||||||
|
// TracerProvider is an OpenTelemetry No-Op TracerProvider.
|
||||||
|
type TracerProvider struct{ embedded.TracerProvider }
|
||||||
|
|
||||||
|
// NewTracerProvider returns a TracerProvider that does not record any telemetry.
|
||||||
|
func NewTracerProvider() TracerProvider {
|
||||||
|
return TracerProvider{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tracer returns an OpenTelemetry Tracer that does not record any telemetry.
|
||||||
|
func (TracerProvider) Tracer(string, ...trace.TracerOption) trace.Tracer {
|
||||||
|
return Tracer{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tracer is an OpenTelemetry No-Op Tracer.
|
||||||
|
type Tracer struct{ embedded.Tracer }
|
||||||
|
|
||||||
|
// Start creates a span. The created span will be set in a child context of ctx
|
||||||
|
// and returned with the span.
|
||||||
|
//
|
||||||
|
// If ctx contains a span context, the returned span will also contain that
|
||||||
|
// span context. If the span context in ctx is for a non-recording span, that
|
||||||
|
// span instance will be returned directly.
|
||||||
|
func (t Tracer) Start(ctx context.Context, _ string, _ ...trace.SpanStartOption) (context.Context, trace.Span) {
|
||||||
|
span := trace.SpanFromContext(ctx)
|
||||||
|
|
||||||
|
// If the parent context contains a non-zero span context, that span
|
||||||
|
// context needs to be returned as a non-recording span
|
||||||
|
// (https://github.com/open-telemetry/opentelemetry-specification/blob/3a1dde966a4ce87cce5adf464359fe369741bbea/specification/trace/api.md#behavior-of-the-api-in-the-absence-of-an-installed-sdk).
|
||||||
|
var zeroSC trace.SpanContext
|
||||||
|
if sc := span.SpanContext(); !sc.Equal(zeroSC) {
|
||||||
|
if !span.IsRecording() {
|
||||||
|
// If the span is not recording return it directly.
|
||||||
|
return ctx, span
|
||||||
|
}
|
||||||
|
// Otherwise, return the span context needs in a non-recording span.
|
||||||
|
span = Span{sc: sc}
|
||||||
|
} else {
|
||||||
|
// No parent, return a No-Op span with an empty span context.
|
||||||
|
span = Span{}
|
||||||
|
}
|
||||||
|
return trace.ContextWithSpan(ctx, span), span
|
||||||
|
}
|
||||||
|
|
||||||
|
// Span is an OpenTelemetry No-Op Span.
|
||||||
|
type Span struct {
|
||||||
|
embedded.Span
|
||||||
|
|
||||||
|
sc trace.SpanContext
|
||||||
|
}
|
||||||
|
|
||||||
|
// SpanContext returns an empty span context.
|
||||||
|
func (s Span) SpanContext() trace.SpanContext { return s.sc }
|
||||||
|
|
||||||
|
// IsRecording always returns false.
|
||||||
|
func (Span) IsRecording() bool { return false }
|
||||||
|
|
||||||
|
// SetStatus does nothing.
|
||||||
|
func (Span) SetStatus(codes.Code, string) {}
|
||||||
|
|
||||||
|
// SetAttributes does nothing.
|
||||||
|
func (Span) SetAttributes(...attribute.KeyValue) {}
|
||||||
|
|
||||||
|
// End does nothing.
|
||||||
|
func (Span) End(...trace.SpanEndOption) {}
|
||||||
|
|
||||||
|
// RecordError does nothing.
|
||||||
|
func (Span) RecordError(error, ...trace.EventOption) {}
|
||||||
|
|
||||||
|
// AddEvent does nothing.
|
||||||
|
func (Span) AddEvent(string, ...trace.EventOption) {}
|
||||||
|
|
||||||
|
// SetName does nothing.
|
||||||
|
func (Span) SetName(string) {}
|
||||||
|
|
||||||
|
// TracerProvider returns a No-Op TracerProvider.
|
||||||
|
func (Span) TracerProvider() trace.TracerProvider { return TracerProvider{} }
|
|
@ -22,6 +22,7 @@ import (
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
"go.opentelemetry.io/otel/codes"
|
"go.opentelemetry.io/otel/codes"
|
||||||
|
"go.opentelemetry.io/otel/trace/embedded"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -48,8 +49,10 @@ func (e errorConst) Error() string {
|
||||||
// nolint:revive // revive complains about stutter of `trace.TraceID`.
|
// nolint:revive // revive complains about stutter of `trace.TraceID`.
|
||||||
type TraceID [16]byte
|
type TraceID [16]byte
|
||||||
|
|
||||||
var nilTraceID TraceID
|
var (
|
||||||
var _ json.Marshaler = nilTraceID
|
nilTraceID TraceID
|
||||||
|
_ json.Marshaler = nilTraceID
|
||||||
|
)
|
||||||
|
|
||||||
// IsValid checks whether the trace TraceID is valid. A valid trace ID does
|
// IsValid checks whether the trace TraceID is valid. A valid trace ID does
|
||||||
// not consist of zeros only.
|
// not consist of zeros only.
|
||||||
|
@ -71,8 +74,10 @@ func (t TraceID) String() string {
|
||||||
// SpanID is a unique identity of a span in a trace.
|
// SpanID is a unique identity of a span in a trace.
|
||||||
type SpanID [8]byte
|
type SpanID [8]byte
|
||||||
|
|
||||||
var nilSpanID SpanID
|
var (
|
||||||
var _ json.Marshaler = nilSpanID
|
nilSpanID SpanID
|
||||||
|
_ json.Marshaler = nilSpanID
|
||||||
|
)
|
||||||
|
|
||||||
// IsValid checks whether the SpanID is valid. A valid SpanID does not consist
|
// IsValid checks whether the SpanID is valid. A valid SpanID does not consist
|
||||||
// of zeros only.
|
// of zeros only.
|
||||||
|
@ -338,8 +343,15 @@ func (sc SpanContext) MarshalJSON() ([]byte, error) {
|
||||||
// create a Span and it is then up to the operation the Span represents to
|
// create a Span and it is then up to the operation the Span represents to
|
||||||
// properly end the Span when the operation itself ends.
|
// properly end the Span when the operation itself ends.
|
||||||
//
|
//
|
||||||
// Warning: methods may be added to this interface in minor releases.
|
// 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 Span interface {
|
type Span 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.Span
|
||||||
|
|
||||||
// End completes the Span. The Span is considered complete and ready to be
|
// End completes the Span. The Span is considered complete and ready to be
|
||||||
// delivered through the rest of the telemetry pipeline after this method
|
// delivered through the rest of the telemetry pipeline after this method
|
||||||
// is called. Therefore, updates to the Span are not allowed after this
|
// is called. Therefore, updates to the Span are not allowed after this
|
||||||
|
@ -486,8 +498,15 @@ func (sk SpanKind) String() string {
|
||||||
|
|
||||||
// Tracer is the creator of Spans.
|
// Tracer is the creator of Spans.
|
||||||
//
|
//
|
||||||
// Warning: methods may be added to this interface in minor releases.
|
// 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 Tracer interface {
|
type Tracer 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.Tracer
|
||||||
|
|
||||||
// Start creates a span and a context.Context containing the newly-created span.
|
// Start creates a span and a context.Context containing the newly-created span.
|
||||||
//
|
//
|
||||||
// If the context.Context provided in `ctx` contains a Span then the newly-created
|
// If the context.Context provided in `ctx` contains a Span then the newly-created
|
||||||
|
@ -518,8 +537,15 @@ type Tracer interface {
|
||||||
// at runtime from its users or it can simply use the globally registered one
|
// at runtime from its users or it can simply use the globally registered one
|
||||||
// (see https://pkg.go.dev/go.opentelemetry.io/otel#GetTracerProvider).
|
// (see https://pkg.go.dev/go.opentelemetry.io/otel#GetTracerProvider).
|
||||||
//
|
//
|
||||||
// Warning: methods may be added to this interface in minor releases.
|
// 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 TracerProvider interface {
|
type TracerProvider 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.TracerProvider
|
||||||
|
|
||||||
// Tracer returns a unique Tracer scoped to be used by instrumentation code
|
// Tracer returns a unique Tracer scoped to be used by instrumentation code
|
||||||
// to trace computational workflows. The scope and identity of that
|
// to trace computational workflows. The scope and identity of that
|
||||||
// instrumentation code is uniquely defined by the name and options passed.
|
// instrumentation code is uniquely defined by the name and options passed.
|
||||||
|
|
|
@ -28,9 +28,9 @@ const (
|
||||||
|
|
||||||
// based on the W3C Trace Context specification, see
|
// based on the W3C Trace Context specification, see
|
||||||
// https://www.w3.org/TR/trace-context-1/#tracestate-header
|
// https://www.w3.org/TR/trace-context-1/#tracestate-header
|
||||||
noTenantKeyFormat = `[a-z][_0-9a-z\-\*\/]{0,255}`
|
noTenantKeyFormat = `[a-z][_0-9a-z\-\*\/]*`
|
||||||
withTenantKeyFormat = `[a-z0-9][_0-9a-z\-\*\/]{0,240}@[a-z][_0-9a-z\-\*\/]{0,13}`
|
withTenantKeyFormat = `[a-z0-9][_0-9a-z\-\*\/]*@[a-z][_0-9a-z\-\*\/]*`
|
||||||
valueFormat = `[\x20-\x2b\x2d-\x3c\x3e-\x7e]{0,255}[\x21-\x2b\x2d-\x3c\x3e-\x7e]`
|
valueFormat = `[\x20-\x2b\x2d-\x3c\x3e-\x7e]*[\x21-\x2b\x2d-\x3c\x3e-\x7e]`
|
||||||
|
|
||||||
errInvalidKey errorConst = "invalid tracestate key"
|
errInvalidKey errorConst = "invalid tracestate key"
|
||||||
errInvalidValue errorConst = "invalid tracestate value"
|
errInvalidValue errorConst = "invalid tracestate value"
|
||||||
|
@ -40,9 +40,10 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
keyRe = regexp.MustCompile(`^((` + noTenantKeyFormat + `)|(` + withTenantKeyFormat + `))$`)
|
noTenantKeyRe = regexp.MustCompile(`^` + noTenantKeyFormat + `$`)
|
||||||
valueRe = regexp.MustCompile(`^(` + valueFormat + `)$`)
|
withTenantKeyRe = regexp.MustCompile(`^` + withTenantKeyFormat + `$`)
|
||||||
memberRe = regexp.MustCompile(`^\s*((` + noTenantKeyFormat + `)|(` + withTenantKeyFormat + `))=(` + valueFormat + `)\s*$`)
|
valueRe = regexp.MustCompile(`^` + valueFormat + `$`)
|
||||||
|
memberRe = regexp.MustCompile(`^\s*((?:` + noTenantKeyFormat + `)|(?:` + withTenantKeyFormat + `))=(` + valueFormat + `)\s*$`)
|
||||||
)
|
)
|
||||||
|
|
||||||
type member struct {
|
type member struct {
|
||||||
|
@ -51,10 +52,19 @@ type member struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func newMember(key, value string) (member, error) {
|
func newMember(key, value string) (member, error) {
|
||||||
if !keyRe.MatchString(key) {
|
if len(key) > 256 {
|
||||||
return member{}, fmt.Errorf("%w: %s", errInvalidKey, key)
|
return member{}, fmt.Errorf("%w: %s", errInvalidKey, key)
|
||||||
}
|
}
|
||||||
if !valueRe.MatchString(value) {
|
if !noTenantKeyRe.MatchString(key) {
|
||||||
|
if !withTenantKeyRe.MatchString(key) {
|
||||||
|
return member{}, fmt.Errorf("%w: %s", errInvalidKey, key)
|
||||||
|
}
|
||||||
|
atIndex := strings.LastIndex(key, "@")
|
||||||
|
if atIndex > 241 || len(key)-1-atIndex > 14 {
|
||||||
|
return member{}, fmt.Errorf("%w: %s", errInvalidKey, key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(value) > 256 || !valueRe.MatchString(value) {
|
||||||
return member{}, fmt.Errorf("%w: %s", errInvalidValue, value)
|
return member{}, fmt.Errorf("%w: %s", errInvalidValue, value)
|
||||||
}
|
}
|
||||||
return member{Key: key, Value: value}, nil
|
return member{Key: key, Value: value}, nil
|
||||||
|
@ -62,14 +72,14 @@ func newMember(key, value string) (member, error) {
|
||||||
|
|
||||||
func parseMember(m string) (member, error) {
|
func parseMember(m string) (member, error) {
|
||||||
matches := memberRe.FindStringSubmatch(m)
|
matches := memberRe.FindStringSubmatch(m)
|
||||||
if len(matches) != 5 {
|
if len(matches) != 3 {
|
||||||
return member{}, fmt.Errorf("%w: %s", errInvalidMember, m)
|
return member{}, fmt.Errorf("%w: %s", errInvalidMember, m)
|
||||||
}
|
}
|
||||||
|
result, e := newMember(matches[1], matches[2])
|
||||||
return member{
|
if e != nil {
|
||||||
Key: matches[1],
|
return member{}, fmt.Errorf("%w: %s", errInvalidMember, m)
|
||||||
Value: matches[4],
|
}
|
||||||
}, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// String encodes member into a string compliant with the W3C Trace Context
|
// String encodes member into a string compliant with the W3C Trace Context
|
||||||
|
|
|
@ -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.19.0"
|
return "1.20.0"
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
|
|
||||||
module-sets:
|
module-sets:
|
||||||
stable-v1:
|
stable-v1:
|
||||||
version: v1.19.0
|
version: v1.20.0
|
||||||
modules:
|
modules:
|
||||||
- go.opentelemetry.io/otel
|
- go.opentelemetry.io/otel
|
||||||
- go.opentelemetry.io/otel/bridge/opentracing
|
- go.opentelemetry.io/otel/bridge/opentracing
|
||||||
|
@ -35,7 +35,7 @@ module-sets:
|
||||||
- go.opentelemetry.io/otel/sdk/metric
|
- go.opentelemetry.io/otel/sdk/metric
|
||||||
- go.opentelemetry.io/otel/trace
|
- go.opentelemetry.io/otel/trace
|
||||||
experimental-metrics:
|
experimental-metrics:
|
||||||
version: v0.42.0
|
version: v0.43.0
|
||||||
modules:
|
modules:
|
||||||
- go.opentelemetry.io/otel/bridge/opencensus
|
- go.opentelemetry.io/otel/bridge/opencensus
|
||||||
- go.opentelemetry.io/otel/bridge/opencensus/test
|
- go.opentelemetry.io/otel/bridge/opencensus/test
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build gc
|
//go:build gc
|
||||||
// +build gc
|
|
||||||
|
|
||||||
#include "textflag.h"
|
#include "textflag.h"
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build aix
|
//go:build aix
|
||||||
// +build aix
|
|
||||||
|
|
||||||
package cpu
|
package cpu
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build gc
|
//go:build gc
|
||||||
// +build gc
|
|
||||||
|
|
||||||
#include "textflag.h"
|
#include "textflag.h"
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build gc
|
//go:build gc
|
||||||
// +build gc
|
|
||||||
|
|
||||||
package cpu
|
package cpu
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build gc
|
//go:build gc
|
||||||
// +build gc
|
|
||||||
|
|
||||||
package cpu
|
package cpu
|
||||||
|
|
||||||
|
|
|
@ -3,8 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build (386 || amd64 || amd64p32) && gc
|
//go:build (386 || amd64 || amd64p32) && gc
|
||||||
// +build 386 amd64 amd64p32
|
|
||||||
// +build gc
|
|
||||||
|
|
||||||
package cpu
|
package cpu
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build gccgo
|
//go:build gccgo
|
||||||
// +build gccgo
|
|
||||||
|
|
||||||
package cpu
|
package cpu
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build gccgo
|
//go:build gccgo
|
||||||
// +build gccgo
|
|
||||||
|
|
||||||
package cpu
|
package cpu
|
||||||
|
|
||||||
|
|
|
@ -3,8 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build (386 || amd64 || amd64p32) && gccgo
|
//go:build (386 || amd64 || amd64p32) && gccgo
|
||||||
// +build 386 amd64 amd64p32
|
|
||||||
// +build gccgo
|
|
||||||
|
|
||||||
#include <cpuid.h>
|
#include <cpuid.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
|
@ -3,8 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build (386 || amd64 || amd64p32) && gccgo
|
//go:build (386 || amd64 || amd64p32) && gccgo
|
||||||
// +build 386 amd64 amd64p32
|
|
||||||
// +build gccgo
|
|
||||||
|
|
||||||
package cpu
|
package cpu
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build !386 && !amd64 && !amd64p32 && !arm64
|
//go:build !386 && !amd64 && !amd64p32 && !arm64
|
||||||
// +build !386,!amd64,!amd64p32,!arm64
|
|
||||||
|
|
||||||
package cpu
|
package cpu
|
||||||
|
|
||||||
|
|
|
@ -3,8 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build linux && (mips64 || mips64le)
|
//go:build linux && (mips64 || mips64le)
|
||||||
// +build linux
|
|
||||||
// +build mips64 mips64le
|
|
||||||
|
|
||||||
package cpu
|
package cpu
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build linux && !arm && !arm64 && !mips64 && !mips64le && !ppc64 && !ppc64le && !s390x
|
//go:build linux && !arm && !arm64 && !mips64 && !mips64le && !ppc64 && !ppc64le && !s390x
|
||||||
// +build linux,!arm,!arm64,!mips64,!mips64le,!ppc64,!ppc64le,!s390x
|
|
||||||
|
|
||||||
package cpu
|
package cpu
|
||||||
|
|
||||||
|
|
|
@ -3,8 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build linux && (ppc64 || ppc64le)
|
//go:build linux && (ppc64 || ppc64le)
|
||||||
// +build linux
|
|
||||||
// +build ppc64 ppc64le
|
|
||||||
|
|
||||||
package cpu
|
package cpu
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build loong64
|
//go:build loong64
|
||||||
// +build loong64
|
|
||||||
|
|
||||||
package cpu
|
package cpu
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build mips64 || mips64le
|
//go:build mips64 || mips64le
|
||||||
// +build mips64 mips64le
|
|
||||||
|
|
||||||
package cpu
|
package cpu
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build mips || mipsle
|
//go:build mips || mipsle
|
||||||
// +build mips mipsle
|
|
||||||
|
|
||||||
package cpu
|
package cpu
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build !linux && arm
|
//go:build !linux && arm
|
||||||
// +build !linux,arm
|
|
||||||
|
|
||||||
package cpu
|
package cpu
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build !linux && !netbsd && !openbsd && arm64
|
//go:build !linux && !netbsd && !openbsd && arm64
|
||||||
// +build !linux,!netbsd,!openbsd,arm64
|
|
||||||
|
|
||||||
package cpu
|
package cpu
|
||||||
|
|
||||||
|
|
|
@ -3,8 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build !linux && (mips64 || mips64le)
|
//go:build !linux && (mips64 || mips64le)
|
||||||
// +build !linux
|
|
||||||
// +build mips64 mips64le
|
|
||||||
|
|
||||||
package cpu
|
package cpu
|
||||||
|
|
||||||
|
|
|
@ -3,9 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build !aix && !linux && (ppc64 || ppc64le)
|
//go:build !aix && !linux && (ppc64 || ppc64le)
|
||||||
// +build !aix
|
|
||||||
// +build !linux
|
|
||||||
// +build ppc64 ppc64le
|
|
||||||
|
|
||||||
package cpu
|
package cpu
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build !linux && riscv64
|
//go:build !linux && riscv64
|
||||||
// +build !linux,riscv64
|
|
||||||
|
|
||||||
package cpu
|
package cpu
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build ppc64 || ppc64le
|
//go:build ppc64 || ppc64le
|
||||||
// +build ppc64 ppc64le
|
|
||||||
|
|
||||||
package cpu
|
package cpu
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build riscv64
|
//go:build riscv64
|
||||||
// +build riscv64
|
|
||||||
|
|
||||||
package cpu
|
package cpu
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build gc
|
//go:build gc
|
||||||
// +build gc
|
|
||||||
|
|
||||||
#include "textflag.h"
|
#include "textflag.h"
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build wasm
|
//go:build wasm
|
||||||
// +build wasm
|
|
||||||
|
|
||||||
package cpu
|
package cpu
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build 386 || amd64 || amd64p32
|
//go:build 386 || amd64 || amd64p32
|
||||||
// +build 386 amd64 amd64p32
|
|
||||||
|
|
||||||
package cpu
|
package cpu
|
||||||
|
|
||||||
|
|
|
@ -3,8 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build (386 || amd64 || amd64p32) && gc
|
//go:build (386 || amd64 || amd64p32) && gc
|
||||||
// +build 386 amd64 amd64p32
|
|
||||||
// +build gc
|
|
||||||
|
|
||||||
#include "textflag.h"
|
#include "textflag.h"
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build armbe || arm64be || m68k || mips || mips64 || mips64p32 || ppc || ppc64 || s390 || s390x || shbe || sparc || sparc64
|
//go:build armbe || arm64be || m68k || mips || mips64 || mips64p32 || ppc || ppc64 || s390 || s390x || shbe || sparc || sparc64
|
||||||
// +build armbe arm64be m68k mips mips64 mips64p32 ppc ppc64 s390 s390x shbe sparc sparc64
|
|
||||||
|
|
||||||
package cpu
|
package cpu
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build 386 || amd64 || amd64p32 || alpha || arm || arm64 || loong64 || mipsle || mips64le || mips64p32le || nios2 || ppc64le || riscv || riscv64 || sh || wasm
|
//go:build 386 || amd64 || amd64p32 || alpha || arm || arm64 || loong64 || mipsle || mips64le || mips64p32le || nios2 || ppc64le || riscv || riscv64 || sh || wasm
|
||||||
// +build 386 amd64 amd64p32 alpha arm arm64 loong64 mipsle mips64le mips64p32le nios2 ppc64le riscv riscv64 sh wasm
|
|
||||||
|
|
||||||
package cpu
|
package cpu
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build linux && arm64
|
//go:build linux && arm64
|
||||||
// +build linux,arm64
|
|
||||||
|
|
||||||
package cpu
|
package cpu
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build go1.21
|
//go:build go1.21
|
||||||
// +build go1.21
|
|
||||||
|
|
||||||
package cpu
|
package cpu
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,6 @@
|
||||||
// gccgo's libgo and thus must not used a CGo method.
|
// gccgo's libgo and thus must not used a CGo method.
|
||||||
|
|
||||||
//go:build aix && gccgo
|
//go:build aix && gccgo
|
||||||
// +build aix,gccgo
|
|
||||||
|
|
||||||
package cpu
|
package cpu
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,6 @@
|
||||||
// (See golang.org/issue/32102)
|
// (See golang.org/issue/32102)
|
||||||
|
|
||||||
//go:build aix && ppc64 && gc
|
//go:build aix && ppc64 && gc
|
||||||
// +build aix,ppc64,gc
|
|
||||||
|
|
||||||
package cpu
|
package cpu
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build !go1.19
|
//go:build !go1.19
|
||||||
// +build !go1.19
|
|
||||||
|
|
||||||
package execabs
|
package execabs
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build go1.19
|
//go:build go1.19
|
||||||
// +build go1.19
|
|
||||||
|
|
||||||
package execabs
|
package execabs
|
||||||
|
|
||||||
|
|
|
@ -3,8 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build (aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos) && go1.9
|
//go:build (aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos) && go1.9
|
||||||
// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos
|
|
||||||
// +build go1.9
|
|
||||||
|
|
||||||
package unix
|
package unix
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build gc
|
//go:build gc
|
||||||
// +build gc
|
|
||||||
|
|
||||||
#include "textflag.h"
|
#include "textflag.h"
|
||||||
|
|
||||||
|
|
|
@ -3,8 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build (freebsd || netbsd || openbsd) && gc
|
//go:build (freebsd || netbsd || openbsd) && gc
|
||||||
// +build freebsd netbsd openbsd
|
|
||||||
// +build gc
|
|
||||||
|
|
||||||
#include "textflag.h"
|
#include "textflag.h"
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue