Merge pull request #6127 from thaJeztah/bump_deps
vendor: update buildkit and containerd dependencies
This commit is contained in:
commit
082d23d12d
41
vendor.mod
41
vendor.mod
@ -46,15 +46,15 @@ require (
|
|||||||
github.com/theupdateframework/notary v0.7.1-0.20210315103452-bf96a202a09a
|
github.com/theupdateframework/notary v0.7.1-0.20210315103452-bf96a202a09a
|
||||||
github.com/tonistiigi/go-rosetta v0.0.0-20220804170347-3f4430f2d346
|
github.com/tonistiigi/go-rosetta v0.0.0-20220804170347-3f4430f2d346
|
||||||
github.com/xeipuuv/gojsonschema v1.2.0
|
github.com/xeipuuv/gojsonschema v1.2.0
|
||||||
go.opentelemetry.io/otel v1.31.0
|
go.opentelemetry.io/otel v1.35.0
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.31.0
|
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.35.0
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.35.0
|
||||||
go.opentelemetry.io/otel/metric v1.31.0
|
go.opentelemetry.io/otel/metric v1.35.0
|
||||||
go.opentelemetry.io/otel/sdk v1.31.0
|
go.opentelemetry.io/otel/sdk v1.35.0
|
||||||
go.opentelemetry.io/otel/sdk/metric v1.31.0
|
go.opentelemetry.io/otel/sdk/metric v1.35.0
|
||||||
go.opentelemetry.io/otel/trace v1.31.0
|
go.opentelemetry.io/otel/trace v1.35.0
|
||||||
golang.org/x/sync v0.13.0
|
golang.org/x/sync v0.14.0
|
||||||
golang.org/x/sys v0.32.0
|
golang.org/x/sys v0.33.0
|
||||||
golang.org/x/term v0.31.0
|
golang.org/x/term v0.31.0
|
||||||
golang.org/x/text v0.24.0
|
golang.org/x/text v0.24.0
|
||||||
gopkg.in/yaml.v3 v3.0.1
|
gopkg.in/yaml.v3 v3.0.1
|
||||||
@ -78,7 +78,7 @@ require (
|
|||||||
github.com/go-logr/stdr v1.2.2 // indirect
|
github.com/go-logr/stdr v1.2.2 // indirect
|
||||||
github.com/golang/protobuf v1.5.4 // indirect
|
github.com/golang/protobuf v1.5.4 // indirect
|
||||||
github.com/gorilla/mux v1.8.1 // indirect
|
github.com/gorilla/mux v1.8.1 // indirect
|
||||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 // indirect
|
||||||
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
||||||
github.com/klauspost/compress v1.18.0 // indirect
|
github.com/klauspost/compress v1.18.0 // indirect
|
||||||
github.com/miekg/pkcs11 v1.1.1 // indirect
|
github.com/miekg/pkcs11 v1.1.1 // indirect
|
||||||
@ -87,24 +87,25 @@ require (
|
|||||||
github.com/moby/sys/user v0.4.0 // indirect
|
github.com/moby/sys/user v0.4.0 // indirect
|
||||||
github.com/moby/sys/userns v0.1.0 // indirect
|
github.com/moby/sys/userns v0.1.0 // indirect
|
||||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
||||||
github.com/prometheus/client_golang v1.20.5 // indirect
|
github.com/prometheus/client_golang v1.22.0 // indirect
|
||||||
github.com/prometheus/client_model v0.6.1 // indirect
|
github.com/prometheus/client_model v0.6.1 // indirect
|
||||||
github.com/prometheus/common v0.55.0 // indirect
|
github.com/prometheus/common v0.62.0 // indirect
|
||||||
github.com/prometheus/procfs v0.15.1 // indirect
|
github.com/prometheus/procfs v0.15.1 // indirect
|
||||||
github.com/rivo/uniseg v0.2.0 // indirect
|
github.com/rivo/uniseg v0.2.0 // indirect
|
||||||
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
||||||
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
|
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
|
||||||
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
|
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
|
||||||
go.etcd.io/etcd/raft/v3 v3.5.16 // indirect
|
go.etcd.io/etcd/raft/v3 v3.5.16 // indirect
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect
|
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 // indirect
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 // indirect
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0 // indirect
|
||||||
go.opentelemetry.io/proto/otlp v1.3.1 // indirect
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.35.0 // indirect
|
||||||
|
go.opentelemetry.io/proto/otlp v1.5.0 // indirect
|
||||||
golang.org/x/crypto v0.37.0 // indirect
|
golang.org/x/crypto v0.37.0 // indirect
|
||||||
golang.org/x/net v0.39.0 // indirect
|
golang.org/x/net v0.39.0 // indirect
|
||||||
golang.org/x/time v0.11.0 // indirect
|
golang.org/x/time v0.11.0 // indirect
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38 // indirect
|
google.golang.org/genproto/googleapis/api v0.0.0-20250218202821-56aae31c358a // indirect
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 // indirect
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20250218202821-56aae31c358a // indirect
|
||||||
google.golang.org/grpc v1.69.4 // indirect
|
google.golang.org/grpc v1.72.2 // indirect
|
||||||
google.golang.org/protobuf v1.35.2 // indirect
|
google.golang.org/protobuf v1.36.6 // indirect
|
||||||
)
|
)
|
||||||
|
82
vendor.sum
82
vendor.sum
@ -122,8 +122,8 @@ github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+
|
|||||||
github.com/gorilla/mux v1.7.0/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
github.com/gorilla/mux v1.7.0/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||||
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
|
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
|
||||||
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
|
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
|
||||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys=
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 h1:e9Rjr40Z98/clHv5Yg79Is0NtosR5LXRvdr7o/6NwbA=
|
||||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I=
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1/go.mod h1:tIxuGz/9mpox++sgp9fJjHO0+q1X9/UOWd798aAm22M=
|
||||||
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8=
|
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8=
|
||||||
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4=
|
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4=
|
||||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||||
@ -224,8 +224,8 @@ github.com/prometheus/client_golang v0.9.0-pre1.0.20180209125602-c332b6f63c06/go
|
|||||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||||
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
|
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
|
||||||
github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g=
|
github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g=
|
||||||
github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y=
|
github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q=
|
||||||
github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
|
github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0=
|
||||||
github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||||
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
@ -234,8 +234,8 @@ github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQy
|
|||||||
github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
||||||
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
||||||
github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=
|
github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=
|
||||||
github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc=
|
github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io=
|
||||||
github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8=
|
github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I=
|
||||||
github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||||
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||||
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
||||||
@ -296,28 +296,30 @@ github.com/zmap/zlint/v3 v3.1.0 h1:WjVytZo79m/L1+/Mlphl09WBob6YTGljN5IGWZFpAv0=
|
|||||||
github.com/zmap/zlint/v3 v3.1.0/go.mod h1:L7t8s3sEKkb0A2BxGy1IWrxt1ZATa1R4QfJZaQOD3zU=
|
github.com/zmap/zlint/v3 v3.1.0/go.mod h1:L7t8s3sEKkb0A2BxGy1IWrxt1ZATa1R4QfJZaQOD3zU=
|
||||||
go.etcd.io/etcd/raft/v3 v3.5.16 h1:zBXA3ZUpYs1AwiLGPafYAKKl/CORn/uaxYDwlNwndAk=
|
go.etcd.io/etcd/raft/v3 v3.5.16 h1:zBXA3ZUpYs1AwiLGPafYAKKl/CORn/uaxYDwlNwndAk=
|
||||||
go.etcd.io/etcd/raft/v3 v3.5.16/go.mod h1:P4UP14AxofMJ/54boWilabqqWoW9eLodl6I5GdGzazI=
|
go.etcd.io/etcd/raft/v3 v3.5.16/go.mod h1:P4UP14AxofMJ/54boWilabqqWoW9eLodl6I5GdGzazI=
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s=
|
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM=
|
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
|
||||||
go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY=
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU=
|
||||||
go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE=
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.31.0 h1:FZ6ei8GFW7kyPYdxJaV2rgI6M+4tvZzhYsQ2wgyVC08=
|
go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.31.0/go.mod h1:MdEu/mC6j3D+tTEfvI15b5Ci2Fn7NneJ71YMoiS3tpI=
|
go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 h1:K0XaT3DwHAcV4nKLzcQvwAgSyisUghWoY20I7huthMk=
|
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.35.0 h1:QcFwRrZLc82r8wODjvyCbP7Ifp3UANaBSmhDSFjnqSc=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0/go.mod h1:B5Ki776z/MBnVha1Nzwp5arlzBbE3+1jk+pGmaP5HME=
|
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.35.0/go.mod h1:CXIWhUomyWBG/oY2/r/kLp6K/cmx9e/7DLpBuuGdLCA=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 h1:FFeLy03iVTXP6ffeN2iXrxfGsZGCjVx0/4KlizjyBwU=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0 h1:1fTNlAIJZGWLP5FVu0fikVry1IsiUnXjf7QFvoNN3Xw=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0/go.mod h1:TMu73/k1CP8nBUpDLc71Wj/Kf7ZS9FK5b53VapRsP9o=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0/go.mod h1:zjPK58DtkqQFn+YUMbx0M2XV3QgKU0gS9LeGohREyK4=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 h1:lUsI2TYsQw2r1IASwoROaCnjdj2cvC2+Jbxvk6nHnWU=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.35.0 h1:m639+BofXTvcY1q8CGs4ItwQarYtJPOWmVobfM1HpVI=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0/go.mod h1:2HpZxxQurfGxJlJDblybejHB6RX6pmExPNe517hREw4=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.35.0/go.mod h1:LjReUci/F4BUyv+y4dwnq3h/26iNOeC3wAIqgvTIZVo=
|
||||||
go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.35.0 h1:xJ2qHD0C1BeYVTLLR9sX12+Qb95kfeD/byKj6Ky1pXg=
|
||||||
go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.35.0/go.mod h1:u5BF1xyjstDowA1R5QAO9JHzqK+ublenEW/dyqTjBVk=
|
||||||
go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk=
|
go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M=
|
||||||
go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0=
|
go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE=
|
||||||
go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc=
|
go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY=
|
||||||
go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8=
|
go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg=
|
||||||
go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys=
|
go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o=
|
||||||
go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A=
|
go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w=
|
||||||
go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
|
go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs=
|
||||||
go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
|
go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
|
||||||
|
go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4=
|
||||||
|
go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4=
|
||||||
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
||||||
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
||||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
@ -346,8 +348,8 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ
|
|||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610=
|
golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=
|
||||||
golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
|
golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
|
||||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
@ -360,8 +362,8 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
|
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
|
||||||
golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||||
golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o=
|
golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o=
|
||||||
golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw=
|
golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw=
|
||||||
@ -379,15 +381,15 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
|
|||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38 h1:2oV8dfuIkM1Ti7DwXc0BJfnwr9csz4TDXI9EmiI+Rbw=
|
google.golang.org/genproto/googleapis/api v0.0.0-20250218202821-56aae31c358a h1:nwKuGPlUAt+aR+pcrkfFRrTU1BVrSmYyYMxYbUIVHr0=
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38/go.mod h1:vuAjtvlwkDKF6L1GQ0SokiRLCGFfeBUXWr/aFFkHACc=
|
google.golang.org/genproto/googleapis/api v0.0.0-20250218202821-56aae31c358a/go.mod h1:3kWAYMk1I75K4vykHtKt2ycnOgpA6974V7bREqbsenU=
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 h1:zciRKQ4kBpFgpfC5QQCVtnnNAcLIqweL7plyZRQHVpI=
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20250218202821-56aae31c358a h1:51aaUVRocpvUOSQKM6Q7VuoaktNIaMCLuhZB6DKksq4=
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI=
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20250218202821-56aae31c358a/go.mod h1:uRxBH1mhmO8PGhU89cMcHaXKZqO+OfakD8QQO0oYwlQ=
|
||||||
google.golang.org/grpc v1.0.5/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
google.golang.org/grpc v1.0.5/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
||||||
google.golang.org/grpc v1.69.4 h1:MF5TftSMkd8GLw/m0KM6V8CMOCY6NZ1NQDPGFgbTt4A=
|
google.golang.org/grpc v1.72.2 h1:TdbGzwb82ty4OusHWepvFWGLgIbNo1/SUynEN0ssqv8=
|
||||||
google.golang.org/grpc v1.69.4/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4=
|
google.golang.org/grpc v1.72.2/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM=
|
||||||
google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io=
|
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
|
||||||
google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
|
google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
|
||||||
gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
|
gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
|
||||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||||
gopkg.in/cenkalti/backoff.v2 v2.2.1 h1:eJ9UAg01/HIHG987TwxvnzK2MgxXq97YY6rYDpY9aII=
|
gopkg.in/cenkalti/backoff.v2 v2.2.1 h1:eJ9UAg01/HIHG987TwxvnzK2MgxXq97YY6rYDpY9aII=
|
||||||
|
6
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/convert.go
generated
vendored
6
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/convert.go
generated
vendored
@ -94,7 +94,7 @@ func Int64(val string) (int64, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Int64Slice converts 'val' where individual integers are separated by
|
// Int64Slice converts 'val' where individual integers are separated by
|
||||||
// 'sep' into a int64 slice.
|
// 'sep' into an int64 slice.
|
||||||
func Int64Slice(val, sep string) ([]int64, error) {
|
func Int64Slice(val, sep string) ([]int64, error) {
|
||||||
s := strings.Split(val, sep)
|
s := strings.Split(val, sep)
|
||||||
values := make([]int64, len(s))
|
values := make([]int64, len(s))
|
||||||
@ -118,7 +118,7 @@ func Int32(val string) (int32, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Int32Slice converts 'val' where individual integers are separated by
|
// Int32Slice converts 'val' where individual integers are separated by
|
||||||
// 'sep' into a int32 slice.
|
// 'sep' into an int32 slice.
|
||||||
func Int32Slice(val, sep string) ([]int32, error) {
|
func Int32Slice(val, sep string) ([]int32, error) {
|
||||||
s := strings.Split(val, sep)
|
s := strings.Split(val, sep)
|
||||||
values := make([]int32, len(s))
|
values := make([]int32, len(s))
|
||||||
@ -190,7 +190,7 @@ func Bytes(val string) ([]byte, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// BytesSlice converts 'val' where individual bytes sequences, encoded in URL-safe
|
// BytesSlice converts 'val' where individual bytes sequences, encoded in URL-safe
|
||||||
// base64 without padding, are separated by 'sep' into a slice of bytes slices slice.
|
// base64 without padding, are separated by 'sep' into a slice of byte slices.
|
||||||
func BytesSlice(val, sep string) ([][]byte, error) {
|
func BytesSlice(val, sep string) ([][]byte, error) {
|
||||||
s := strings.Split(val, sep)
|
s := strings.Split(val, sep)
|
||||||
values := make([][]byte, len(s))
|
values := make([][]byte, len(s))
|
||||||
|
15
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/errors.go
generated
vendored
15
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/errors.go
generated
vendored
@ -81,6 +81,21 @@ func HTTPError(ctx context.Context, mux *ServeMux, marshaler Marshaler, w http.R
|
|||||||
mux.errorHandler(ctx, mux, marshaler, w, r, err)
|
mux.errorHandler(ctx, mux, marshaler, w, r, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// HTTPStreamError uses the mux-configured stream error handler to notify error to the client without closing the connection.
|
||||||
|
func HTTPStreamError(ctx context.Context, mux *ServeMux, marshaler Marshaler, w http.ResponseWriter, r *http.Request, err error) {
|
||||||
|
st := mux.streamErrorHandler(ctx, err)
|
||||||
|
msg := errorChunk(st)
|
||||||
|
buf, err := marshaler.Marshal(msg)
|
||||||
|
if err != nil {
|
||||||
|
grpclog.Errorf("Failed to marshal an error: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if _, err := w.Write(buf); err != nil {
|
||||||
|
grpclog.Errorf("Failed to notify error to client: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// DefaultHTTPErrorHandler is the default error handler.
|
// DefaultHTTPErrorHandler is the default error handler.
|
||||||
// If "err" is a gRPC Status, the function replies with the status code mapped by HTTPStatusFromCode.
|
// If "err" is a gRPC Status, the function replies with the status code mapped by HTTPStatusFromCode.
|
||||||
// If "err" is a HTTPStatusError, the function replies with the status code provide by that struct. This is
|
// If "err" is a HTTPStatusError, the function replies with the status code provide by that struct. This is
|
||||||
|
2
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/fieldmask.go
generated
vendored
2
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/fieldmask.go
generated
vendored
@ -155,7 +155,7 @@ func buildPathsBlindly(name string, in interface{}) []string {
|
|||||||
return paths
|
return paths
|
||||||
}
|
}
|
||||||
|
|
||||||
// fieldMaskPathItem stores a in-progress deconstruction of a path for a fieldmask
|
// fieldMaskPathItem stores an in-progress deconstruction of a path for a fieldmask
|
||||||
type fieldMaskPathItem struct {
|
type fieldMaskPathItem struct {
|
||||||
// the list of prior fields leading up to node connected by dots
|
// the list of prior fields leading up to node connected by dots
|
||||||
path string
|
path string
|
||||||
|
12
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/handler.go
generated
vendored
12
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/handler.go
generated
vendored
@ -64,7 +64,13 @@ func ForwardResponseStream(ctx context.Context, mux *ServeMux, marshaler Marshal
|
|||||||
}
|
}
|
||||||
|
|
||||||
if !wroteHeader {
|
if !wroteHeader {
|
||||||
w.Header().Set("Content-Type", marshaler.ContentType(respRw))
|
var contentType string
|
||||||
|
if sct, ok := marshaler.(StreamContentType); ok {
|
||||||
|
contentType = sct.StreamContentType(respRw)
|
||||||
|
} else {
|
||||||
|
contentType = marshaler.ContentType(respRw)
|
||||||
|
}
|
||||||
|
w.Header().Set("Content-Type", contentType)
|
||||||
}
|
}
|
||||||
|
|
||||||
var buf []byte
|
var buf []byte
|
||||||
@ -190,11 +196,11 @@ func ForwardResponseMessage(ctx context.Context, mux *ServeMux, marshaler Marsha
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if !doForwardTrailers {
|
if !doForwardTrailers && mux.writeContentLength {
|
||||||
w.Header().Set("Content-Length", strconv.Itoa(len(buf)))
|
w.Header().Set("Content-Length", strconv.Itoa(len(buf)))
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err = w.Write(buf); err != nil {
|
if _, err = w.Write(buf); err != nil && !errors.Is(err, http.ErrBodyNotAllowed) {
|
||||||
grpclog.Errorf("Failed to write response: %v", err)
|
grpclog.Errorf("Failed to write response: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
8
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/marshaler.go
generated
vendored
8
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/marshaler.go
generated
vendored
@ -48,3 +48,11 @@ type Delimited interface {
|
|||||||
// Delimiter returns the record separator for the stream.
|
// Delimiter returns the record separator for the stream.
|
||||||
Delimiter() []byte
|
Delimiter() []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// StreamContentType defines the streaming content type.
|
||||||
|
type StreamContentType interface {
|
||||||
|
// StreamContentType returns the content type for a stream. This shares the
|
||||||
|
// same behaviour as for `Marshaler.ContentType`, but is called, if present,
|
||||||
|
// in the case of a streamed response.
|
||||||
|
StreamContentType(v interface{}) string
|
||||||
|
}
|
||||||
|
4
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/marshaler_registry.go
generated
vendored
4
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/marshaler_registry.go
generated
vendored
@ -86,8 +86,8 @@ func (m marshalerRegistry) add(mime string, marshaler Marshaler) error {
|
|||||||
// It allows for a mapping of case-sensitive Content-Type MIME type string to runtime.Marshaler interfaces.
|
// It allows for a mapping of case-sensitive Content-Type MIME type string to runtime.Marshaler interfaces.
|
||||||
//
|
//
|
||||||
// For example, you could allow the client to specify the use of the runtime.JSONPb marshaler
|
// For example, you could allow the client to specify the use of the runtime.JSONPb marshaler
|
||||||
// with a "application/jsonpb" Content-Type and the use of the runtime.JSONBuiltin marshaler
|
// with an "application/jsonpb" Content-Type and the use of the runtime.JSONBuiltin marshaler
|
||||||
// with a "application/json" Content-Type.
|
// with an "application/json" Content-Type.
|
||||||
// "*" can be used to match any Content-Type.
|
// "*" can be used to match any Content-Type.
|
||||||
// This can be attached to a ServerMux with the marshaler option.
|
// This can be attached to a ServerMux with the marshaler option.
|
||||||
func makeMarshalerMIMERegistry() marshalerRegistry {
|
func makeMarshalerMIMERegistry() marshalerRegistry {
|
||||||
|
8
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/mux.go
generated
vendored
8
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/mux.go
generated
vendored
@ -71,6 +71,7 @@ type ServeMux struct {
|
|||||||
routingErrorHandler RoutingErrorHandlerFunc
|
routingErrorHandler RoutingErrorHandlerFunc
|
||||||
disablePathLengthFallback bool
|
disablePathLengthFallback bool
|
||||||
unescapingMode UnescapingMode
|
unescapingMode UnescapingMode
|
||||||
|
writeContentLength bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// ServeMuxOption is an option that can be given to a ServeMux on construction.
|
// ServeMuxOption is an option that can be given to a ServeMux on construction.
|
||||||
@ -258,6 +259,13 @@ func WithDisablePathLengthFallback() ServeMuxOption {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WithWriteContentLength returns a ServeMuxOption to enable writing content length on non-streaming responses
|
||||||
|
func WithWriteContentLength() ServeMuxOption {
|
||||||
|
return func(serveMux *ServeMux) {
|
||||||
|
serveMux.writeContentLength = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// WithHealthEndpointAt returns a ServeMuxOption that will add an endpoint to the created ServeMux at the path specified by endpointPath.
|
// WithHealthEndpointAt returns a ServeMuxOption that will add an endpoint to the created ServeMux at the path specified by endpointPath.
|
||||||
// When called the handler will forward the request to the upstream grpc service health check (defined in the
|
// When called the handler will forward the request to the upstream grpc service health check (defined in the
|
||||||
// gRPC Health Checking Protocol).
|
// gRPC Health Checking Protocol).
|
||||||
|
4
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/proto2_convert.go
generated
vendored
4
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/proto2_convert.go
generated
vendored
@ -40,7 +40,7 @@ func Float32P(val string) (*float32, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Int64P parses the given string representation of an integer
|
// Int64P parses the given string representation of an integer
|
||||||
// and returns a pointer to a int64 whose value is same as the parsed integer.
|
// and returns a pointer to an int64 whose value is same as the parsed integer.
|
||||||
func Int64P(val string) (*int64, error) {
|
func Int64P(val string) (*int64, error) {
|
||||||
i, err := Int64(val)
|
i, err := Int64(val)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -50,7 +50,7 @@ func Int64P(val string) (*int64, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Int32P parses the given string representation of an integer
|
// Int32P parses the given string representation of an integer
|
||||||
// and returns a pointer to a int32 whose value is same as the parsed integer.
|
// and returns a pointer to an int32 whose value is same as the parsed integer.
|
||||||
func Int32P(val string) (*int32, error) {
|
func Int32P(val string) (*int32, error) {
|
||||||
i, err := Int32(val)
|
i, err := Int32(val)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
22
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/query.go
generated
vendored
22
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/query.go
generated
vendored
@ -126,6 +126,15 @@ func populateFieldValueFromPath(msgValue protoreflect.Message, fieldPath []strin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check if oneof already set
|
||||||
|
if of := fieldDescriptor.ContainingOneof(); of != nil && !of.IsSynthetic() {
|
||||||
|
if f := msgValue.WhichOneof(of); f != nil {
|
||||||
|
if fieldDescriptor.Message() == nil || fieldDescriptor.FullName() != f.FullName() {
|
||||||
|
return fmt.Errorf("field already set for oneof %q", of.FullName().Name())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// If this is the last element, we're done
|
// If this is the last element, we're done
|
||||||
if i == len(fieldPath)-1 {
|
if i == len(fieldPath)-1 {
|
||||||
break
|
break
|
||||||
@ -140,13 +149,6 @@ func populateFieldValueFromPath(msgValue protoreflect.Message, fieldPath []strin
|
|||||||
msgValue = msgValue.Mutable(fieldDescriptor).Message()
|
msgValue = msgValue.Mutable(fieldDescriptor).Message()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if oneof already set
|
|
||||||
if of := fieldDescriptor.ContainingOneof(); of != nil {
|
|
||||||
if f := msgValue.WhichOneof(of); f != nil {
|
|
||||||
return fmt.Errorf("field already set for oneof %q", of.FullName().Name())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
case fieldDescriptor.IsList():
|
case fieldDescriptor.IsList():
|
||||||
return populateRepeatedField(fieldDescriptor, msgValue.Mutable(fieldDescriptor).List(), values)
|
return populateRepeatedField(fieldDescriptor, msgValue.Mutable(fieldDescriptor).List(), values)
|
||||||
@ -291,7 +293,11 @@ func parseMessage(msgDescriptor protoreflect.MessageDescriptor, value string) (p
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return protoreflect.Value{}, err
|
return protoreflect.Value{}, err
|
||||||
}
|
}
|
||||||
msg = timestamppb.New(t)
|
timestamp := timestamppb.New(t)
|
||||||
|
if ok := timestamp.IsValid(); !ok {
|
||||||
|
return protoreflect.Value{}, fmt.Errorf("%s before 0001-01-01", value)
|
||||||
|
}
|
||||||
|
msg = timestamp
|
||||||
case "google.protobuf.Duration":
|
case "google.protobuf.Duration":
|
||||||
d, err := time.ParseDuration(value)
|
d, err := time.ParseDuration(value)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
2
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/utilities/pattern.go
generated
vendored
2
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/utilities/pattern.go
generated
vendored
@ -1,6 +1,6 @@
|
|||||||
package utilities
|
package utilities
|
||||||
|
|
||||||
// An OpCode is a opcode of compiled path patterns.
|
// OpCode is an opcode of compiled path patterns.
|
||||||
type OpCode int
|
type OpCode int
|
||||||
|
|
||||||
// These constants are the valid values of OpCode.
|
// These constants are the valid values of OpCode.
|
||||||
|
2
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/utilities/string_array_flag.go
generated
vendored
2
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/utilities/string_array_flag.go
generated
vendored
@ -5,7 +5,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// flagInterface is an cut down interface to `flag`
|
// flagInterface is a cut down interface to `flag`
|
||||||
type flagInterface interface {
|
type flagInterface interface {
|
||||||
Var(value flag.Value, name string, usage string)
|
Var(value flag.Value, name string, usage string)
|
||||||
}
|
}
|
||||||
|
30
vendor/github.com/prometheus/client_golang/prometheus/collectorfunc.go
generated
vendored
Normal file
30
vendor/github.com/prometheus/client_golang/prometheus/collectorfunc.go
generated
vendored
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
// Copyright 2025 The Prometheus 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 prometheus
|
||||||
|
|
||||||
|
// CollectorFunc is a convenient way to implement a Prometheus Collector
|
||||||
|
// without interface boilerplate.
|
||||||
|
// This implementation is based on DescribeByCollect method.
|
||||||
|
// familiarize yourself to it before using.
|
||||||
|
type CollectorFunc func(chan<- Metric)
|
||||||
|
|
||||||
|
// Collect calls the defined CollectorFunc function with the provided Metrics channel
|
||||||
|
func (f CollectorFunc) Collect(ch chan<- Metric) {
|
||||||
|
f(ch)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Describe sends the descriptor information using DescribeByCollect
|
||||||
|
func (f CollectorFunc) Describe(ch chan<- *Desc) {
|
||||||
|
DescribeByCollect(f, ch)
|
||||||
|
}
|
15
vendor/github.com/prometheus/client_golang/prometheus/desc.go
generated
vendored
15
vendor/github.com/prometheus/client_golang/prometheus/desc.go
generated
vendored
@ -189,12 +189,15 @@ func (d *Desc) String() string {
|
|||||||
fmt.Sprintf("%s=%q", lp.GetName(), lp.GetValue()),
|
fmt.Sprintf("%s=%q", lp.GetName(), lp.GetValue()),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
vlStrings := make([]string, 0, len(d.variableLabels.names))
|
vlStrings := []string{}
|
||||||
for _, vl := range d.variableLabels.names {
|
if d.variableLabels != nil {
|
||||||
if fn, ok := d.variableLabels.labelConstraints[vl]; ok && fn != nil {
|
vlStrings = make([]string, 0, len(d.variableLabels.names))
|
||||||
vlStrings = append(vlStrings, fmt.Sprintf("c(%s)", vl))
|
for _, vl := range d.variableLabels.names {
|
||||||
} else {
|
if fn, ok := d.variableLabels.labelConstraints[vl]; ok && fn != nil {
|
||||||
vlStrings = append(vlStrings, vl)
|
vlStrings = append(vlStrings, fmt.Sprintf("c(%s)", vl))
|
||||||
|
} else {
|
||||||
|
vlStrings = append(vlStrings, vl)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return fmt.Sprintf(
|
return fmt.Sprintf(
|
||||||
|
2
vendor/github.com/prometheus/client_golang/prometheus/go_collector_latest.go
generated
vendored
2
vendor/github.com/prometheus/client_golang/prometheus/go_collector_latest.go
generated
vendored
@ -288,7 +288,7 @@ func NewGoCollector(opts ...func(o *internal.GoCollectorOptions)) Collector {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func attachOriginalName(desc, origName string) string {
|
func attachOriginalName(desc, origName string) string {
|
||||||
return fmt.Sprintf("%s Sourced from %s", desc, origName)
|
return fmt.Sprintf("%s Sourced from %s.", desc, origName)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Describe returns all descriptions of the collector.
|
// Describe returns all descriptions of the collector.
|
||||||
|
249
vendor/github.com/prometheus/client_golang/prometheus/histogram.go
generated
vendored
249
vendor/github.com/prometheus/client_golang/prometheus/histogram.go
generated
vendored
@ -14,6 +14,7 @@
|
|||||||
package prometheus
|
package prometheus
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
"runtime"
|
"runtime"
|
||||||
@ -28,6 +29,11 @@ import (
|
|||||||
"google.golang.org/protobuf/types/known/timestamppb"
|
"google.golang.org/protobuf/types/known/timestamppb"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
nativeHistogramSchemaMaximum = 8
|
||||||
|
nativeHistogramSchemaMinimum = -4
|
||||||
|
)
|
||||||
|
|
||||||
// nativeHistogramBounds for the frac of observed values. Only relevant for
|
// nativeHistogramBounds for the frac of observed values. Only relevant for
|
||||||
// schema > 0. The position in the slice is the schema. (0 is never used, just
|
// schema > 0. The position in the slice is the schema. (0 is never used, just
|
||||||
// here for convenience of using the schema directly as the index.)
|
// here for convenience of using the schema directly as the index.)
|
||||||
@ -330,11 +336,11 @@ func ExponentialBuckets(start, factor float64, count int) []float64 {
|
|||||||
// used for the Buckets field of HistogramOpts.
|
// used for the Buckets field of HistogramOpts.
|
||||||
//
|
//
|
||||||
// The function panics if 'count' is 0 or negative, if 'min' is 0 or negative.
|
// The function panics if 'count' is 0 or negative, if 'min' is 0 or negative.
|
||||||
func ExponentialBucketsRange(min, max float64, count int) []float64 {
|
func ExponentialBucketsRange(minBucket, maxBucket float64, count int) []float64 {
|
||||||
if count < 1 {
|
if count < 1 {
|
||||||
panic("ExponentialBucketsRange count needs a positive count")
|
panic("ExponentialBucketsRange count needs a positive count")
|
||||||
}
|
}
|
||||||
if min <= 0 {
|
if minBucket <= 0 {
|
||||||
panic("ExponentialBucketsRange min needs to be greater than 0")
|
panic("ExponentialBucketsRange min needs to be greater than 0")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -342,12 +348,12 @@ func ExponentialBucketsRange(min, max float64, count int) []float64 {
|
|||||||
// max = min*growthFactor^(bucketCount-1)
|
// max = min*growthFactor^(bucketCount-1)
|
||||||
|
|
||||||
// We know max/min and highest bucket. Solve for growthFactor.
|
// We know max/min and highest bucket. Solve for growthFactor.
|
||||||
growthFactor := math.Pow(max/min, 1.0/float64(count-1))
|
growthFactor := math.Pow(maxBucket/minBucket, 1.0/float64(count-1))
|
||||||
|
|
||||||
// Now that we know growthFactor, solve for each bucket.
|
// Now that we know growthFactor, solve for each bucket.
|
||||||
buckets := make([]float64, count)
|
buckets := make([]float64, count)
|
||||||
for i := 1; i <= count; i++ {
|
for i := 1; i <= count; i++ {
|
||||||
buckets[i-1] = min * math.Pow(growthFactor, float64(i-1))
|
buckets[i-1] = minBucket * math.Pow(growthFactor, float64(i-1))
|
||||||
}
|
}
|
||||||
return buckets
|
return buckets
|
||||||
}
|
}
|
||||||
@ -858,15 +864,35 @@ func (h *histogram) Write(out *dto.Metric) error {
|
|||||||
// findBucket returns the index of the bucket for the provided value, or
|
// findBucket returns the index of the bucket for the provided value, or
|
||||||
// len(h.upperBounds) for the +Inf bucket.
|
// len(h.upperBounds) for the +Inf bucket.
|
||||||
func (h *histogram) findBucket(v float64) int {
|
func (h *histogram) findBucket(v float64) int {
|
||||||
// TODO(beorn7): For small numbers of buckets (<30), a linear search is
|
n := len(h.upperBounds)
|
||||||
// slightly faster than the binary search. If we really care, we could
|
if n == 0 {
|
||||||
// switch from one search strategy to the other depending on the number
|
return 0
|
||||||
// of buckets.
|
}
|
||||||
//
|
|
||||||
// Microbenchmarks (BenchmarkHistogramNoLabels):
|
// Early exit: if v is less than or equal to the first upper bound, return 0
|
||||||
// 11 buckets: 38.3 ns/op linear - binary 48.7 ns/op
|
if v <= h.upperBounds[0] {
|
||||||
// 100 buckets: 78.1 ns/op linear - binary 54.9 ns/op
|
return 0
|
||||||
// 300 buckets: 154 ns/op linear - binary 61.6 ns/op
|
}
|
||||||
|
|
||||||
|
// Early exit: if v is greater than the last upper bound, return len(h.upperBounds)
|
||||||
|
if v > h.upperBounds[n-1] {
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
|
// For small arrays, use simple linear search
|
||||||
|
// "magic number" 35 is result of tests on couple different (AWS and baremetal) servers
|
||||||
|
// see more details here: https://github.com/prometheus/client_golang/pull/1662
|
||||||
|
if n < 35 {
|
||||||
|
for i, bound := range h.upperBounds {
|
||||||
|
if v <= bound {
|
||||||
|
return i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If v is greater than all upper bounds, return len(h.upperBounds)
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
|
// For larger arrays, use stdlib's binary search
|
||||||
return sort.SearchFloat64s(h.upperBounds, v)
|
return sort.SearchFloat64s(h.upperBounds, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1440,9 +1466,9 @@ func pickSchema(bucketFactor float64) int32 {
|
|||||||
floor := math.Floor(math.Log2(math.Log2(bucketFactor)))
|
floor := math.Floor(math.Log2(math.Log2(bucketFactor)))
|
||||||
switch {
|
switch {
|
||||||
case floor <= -8:
|
case floor <= -8:
|
||||||
return 8
|
return nativeHistogramSchemaMaximum
|
||||||
case floor >= 4:
|
case floor >= 4:
|
||||||
return -4
|
return nativeHistogramSchemaMinimum
|
||||||
default:
|
default:
|
||||||
return -int32(floor)
|
return -int32(floor)
|
||||||
}
|
}
|
||||||
@ -1835,3 +1861,196 @@ func (n *nativeExemplars) addExemplar(e *dto.Exemplar) {
|
|||||||
n.exemplars = append(n.exemplars[:nIdx], append([]*dto.Exemplar{e}, append(n.exemplars[nIdx:rIdx], n.exemplars[rIdx+1:]...)...)...)
|
n.exemplars = append(n.exemplars[:nIdx], append([]*dto.Exemplar{e}, append(n.exemplars[nIdx:rIdx], n.exemplars[rIdx+1:]...)...)...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type constNativeHistogram struct {
|
||||||
|
desc *Desc
|
||||||
|
dto.Histogram
|
||||||
|
labelPairs []*dto.LabelPair
|
||||||
|
}
|
||||||
|
|
||||||
|
func validateCount(sum float64, count uint64, negativeBuckets, positiveBuckets map[int]int64, zeroBucket uint64) error {
|
||||||
|
var bucketPopulationSum int64
|
||||||
|
for _, v := range positiveBuckets {
|
||||||
|
bucketPopulationSum += v
|
||||||
|
}
|
||||||
|
for _, v := range negativeBuckets {
|
||||||
|
bucketPopulationSum += v
|
||||||
|
}
|
||||||
|
bucketPopulationSum += int64(zeroBucket)
|
||||||
|
|
||||||
|
// If the sum of observations is NaN, the number of observations must be greater or equal to the sum of all bucket counts.
|
||||||
|
// Otherwise, the number of observations must be equal to the sum of all bucket counts .
|
||||||
|
|
||||||
|
if math.IsNaN(sum) && bucketPopulationSum > int64(count) ||
|
||||||
|
!math.IsNaN(sum) && bucketPopulationSum != int64(count) {
|
||||||
|
return errors.New("the sum of all bucket populations exceeds the count of observations")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewConstNativeHistogram returns a metric representing a Prometheus native histogram with
|
||||||
|
// fixed values for the count, sum, and positive/negative/zero bucket counts. As those parameters
|
||||||
|
// cannot be changed, the returned value does not implement the Histogram
|
||||||
|
// interface (but only the Metric interface). Users of this package will not
|
||||||
|
// have much use for it in regular operations. However, when implementing custom
|
||||||
|
// OpenTelemetry Collectors, it is useful as a throw-away metric that is generated on the fly
|
||||||
|
// to send it to Prometheus in the Collect method.
|
||||||
|
//
|
||||||
|
// zeroBucket counts all (positive and negative)
|
||||||
|
// observations in the zero bucket (with an absolute value less or equal
|
||||||
|
// the current threshold).
|
||||||
|
// positiveBuckets and negativeBuckets are separate maps for negative and positive
|
||||||
|
// observations. The map's value is an int64, counting observations in
|
||||||
|
// that bucket. The map's key is the
|
||||||
|
// index of the bucket according to the used
|
||||||
|
// Schema. Index 0 is for an upper bound of 1 in positive buckets and for a lower bound of -1 in negative buckets.
|
||||||
|
// NewConstNativeHistogram returns an error if
|
||||||
|
// - the length of labelValues is not consistent with the variable labels in Desc or if Desc is invalid.
|
||||||
|
// - the schema passed is not between 8 and -4
|
||||||
|
// - the sum of counts in all buckets including the zero bucket does not equal the count if sum is not NaN (or exceeds the count if sum is NaN)
|
||||||
|
//
|
||||||
|
// See https://opentelemetry.io/docs/specs/otel/compatibility/prometheus_and_openmetrics/#exponential-histograms for more details about the conversion from OTel to Prometheus.
|
||||||
|
func NewConstNativeHistogram(
|
||||||
|
desc *Desc,
|
||||||
|
count uint64,
|
||||||
|
sum float64,
|
||||||
|
positiveBuckets, negativeBuckets map[int]int64,
|
||||||
|
zeroBucket uint64,
|
||||||
|
schema int32,
|
||||||
|
zeroThreshold float64,
|
||||||
|
createdTimestamp time.Time,
|
||||||
|
labelValues ...string,
|
||||||
|
) (Metric, error) {
|
||||||
|
if desc.err != nil {
|
||||||
|
return nil, desc.err
|
||||||
|
}
|
||||||
|
if err := validateLabelValues(labelValues, len(desc.variableLabels.names)); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if schema > nativeHistogramSchemaMaximum || schema < nativeHistogramSchemaMinimum {
|
||||||
|
return nil, errors.New("invalid native histogram schema")
|
||||||
|
}
|
||||||
|
if err := validateCount(sum, count, negativeBuckets, positiveBuckets, zeroBucket); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
NegativeSpan, NegativeDelta := makeBucketsFromMap(negativeBuckets)
|
||||||
|
PositiveSpan, PositiveDelta := makeBucketsFromMap(positiveBuckets)
|
||||||
|
ret := &constNativeHistogram{
|
||||||
|
desc: desc,
|
||||||
|
Histogram: dto.Histogram{
|
||||||
|
CreatedTimestamp: timestamppb.New(createdTimestamp),
|
||||||
|
Schema: &schema,
|
||||||
|
ZeroThreshold: &zeroThreshold,
|
||||||
|
SampleCount: &count,
|
||||||
|
SampleSum: &sum,
|
||||||
|
|
||||||
|
NegativeSpan: NegativeSpan,
|
||||||
|
NegativeDelta: NegativeDelta,
|
||||||
|
|
||||||
|
PositiveSpan: PositiveSpan,
|
||||||
|
PositiveDelta: PositiveDelta,
|
||||||
|
|
||||||
|
ZeroCount: proto.Uint64(zeroBucket),
|
||||||
|
},
|
||||||
|
labelPairs: MakeLabelPairs(desc, labelValues),
|
||||||
|
}
|
||||||
|
if *ret.ZeroThreshold == 0 && *ret.ZeroCount == 0 && len(ret.PositiveSpan) == 0 && len(ret.NegativeSpan) == 0 {
|
||||||
|
ret.PositiveSpan = []*dto.BucketSpan{{
|
||||||
|
Offset: proto.Int32(0),
|
||||||
|
Length: proto.Uint32(0),
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
return ret, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// MustNewConstNativeHistogram is a version of NewConstNativeHistogram that panics where
|
||||||
|
// NewConstNativeHistogram would have returned an error.
|
||||||
|
func MustNewConstNativeHistogram(
|
||||||
|
desc *Desc,
|
||||||
|
count uint64,
|
||||||
|
sum float64,
|
||||||
|
positiveBuckets, negativeBuckets map[int]int64,
|
||||||
|
zeroBucket uint64,
|
||||||
|
nativeHistogramSchema int32,
|
||||||
|
nativeHistogramZeroThreshold float64,
|
||||||
|
createdTimestamp time.Time,
|
||||||
|
labelValues ...string,
|
||||||
|
) Metric {
|
||||||
|
nativehistogram, err := NewConstNativeHistogram(desc,
|
||||||
|
count,
|
||||||
|
sum,
|
||||||
|
positiveBuckets,
|
||||||
|
negativeBuckets,
|
||||||
|
zeroBucket,
|
||||||
|
nativeHistogramSchema,
|
||||||
|
nativeHistogramZeroThreshold,
|
||||||
|
createdTimestamp,
|
||||||
|
labelValues...)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return nativehistogram
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *constNativeHistogram) Desc() *Desc {
|
||||||
|
return h.desc
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *constNativeHistogram) Write(out *dto.Metric) error {
|
||||||
|
out.Histogram = &h.Histogram
|
||||||
|
out.Label = h.labelPairs
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func makeBucketsFromMap(buckets map[int]int64) ([]*dto.BucketSpan, []int64) {
|
||||||
|
if len(buckets) == 0 {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
var ii []int
|
||||||
|
for k := range buckets {
|
||||||
|
ii = append(ii, k)
|
||||||
|
}
|
||||||
|
sort.Ints(ii)
|
||||||
|
|
||||||
|
var (
|
||||||
|
spans []*dto.BucketSpan
|
||||||
|
deltas []int64
|
||||||
|
prevCount int64
|
||||||
|
nextI int
|
||||||
|
)
|
||||||
|
|
||||||
|
appendDelta := func(count int64) {
|
||||||
|
*spans[len(spans)-1].Length++
|
||||||
|
deltas = append(deltas, count-prevCount)
|
||||||
|
prevCount = count
|
||||||
|
}
|
||||||
|
|
||||||
|
for n, i := range ii {
|
||||||
|
count := buckets[i]
|
||||||
|
// Multiple spans with only small gaps in between are probably
|
||||||
|
// encoded more efficiently as one larger span with a few empty
|
||||||
|
// buckets. Needs some research to find the sweet spot. For now,
|
||||||
|
// we assume that gaps of one or two buckets should not create
|
||||||
|
// a new span.
|
||||||
|
iDelta := int32(i - nextI)
|
||||||
|
if n == 0 || iDelta > 2 {
|
||||||
|
// We have to create a new span, either because we are
|
||||||
|
// at the very beginning, or because we have found a gap
|
||||||
|
// of more than two buckets.
|
||||||
|
spans = append(spans, &dto.BucketSpan{
|
||||||
|
Offset: proto.Int32(iDelta),
|
||||||
|
Length: proto.Uint32(0),
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
// We have found a small gap (or no gap at all).
|
||||||
|
// Insert empty buckets as needed.
|
||||||
|
for j := int32(0); j < iDelta; j++ {
|
||||||
|
appendDelta(0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
appendDelta(count)
|
||||||
|
nextI = i + 1
|
||||||
|
}
|
||||||
|
return spans, deltas
|
||||||
|
}
|
||||||
|
19
vendor/github.com/prometheus/client_golang/prometheus/internal/difflib.go
generated
vendored
19
vendor/github.com/prometheus/client_golang/prometheus/internal/difflib.go
generated
vendored
@ -22,17 +22,18 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
func min(a, b int) int {
|
func minInt(a, b int) int {
|
||||||
if a < b {
|
if a < b {
|
||||||
return a
|
return a
|
||||||
}
|
}
|
||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
func max(a, b int) int {
|
func maxInt(a, b int) int {
|
||||||
if a > b {
|
if a > b {
|
||||||
return a
|
return a
|
||||||
}
|
}
|
||||||
@ -427,12 +428,12 @@ func (m *SequenceMatcher) GetGroupedOpCodes(n int) [][]OpCode {
|
|||||||
if codes[0].Tag == 'e' {
|
if codes[0].Tag == 'e' {
|
||||||
c := codes[0]
|
c := codes[0]
|
||||||
i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2
|
i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2
|
||||||
codes[0] = OpCode{c.Tag, max(i1, i2-n), i2, max(j1, j2-n), j2}
|
codes[0] = OpCode{c.Tag, maxInt(i1, i2-n), i2, maxInt(j1, j2-n), j2}
|
||||||
}
|
}
|
||||||
if codes[len(codes)-1].Tag == 'e' {
|
if codes[len(codes)-1].Tag == 'e' {
|
||||||
c := codes[len(codes)-1]
|
c := codes[len(codes)-1]
|
||||||
i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2
|
i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2
|
||||||
codes[len(codes)-1] = OpCode{c.Tag, i1, min(i2, i1+n), j1, min(j2, j1+n)}
|
codes[len(codes)-1] = OpCode{c.Tag, i1, minInt(i2, i1+n), j1, minInt(j2, j1+n)}
|
||||||
}
|
}
|
||||||
nn := n + n
|
nn := n + n
|
||||||
groups := [][]OpCode{}
|
groups := [][]OpCode{}
|
||||||
@ -443,12 +444,12 @@ func (m *SequenceMatcher) GetGroupedOpCodes(n int) [][]OpCode {
|
|||||||
// there is a large range with no changes.
|
// there is a large range with no changes.
|
||||||
if c.Tag == 'e' && i2-i1 > nn {
|
if c.Tag == 'e' && i2-i1 > nn {
|
||||||
group = append(group, OpCode{
|
group = append(group, OpCode{
|
||||||
c.Tag, i1, min(i2, i1+n),
|
c.Tag, i1, minInt(i2, i1+n),
|
||||||
j1, min(j2, j1+n),
|
j1, minInt(j2, j1+n),
|
||||||
})
|
})
|
||||||
groups = append(groups, group)
|
groups = append(groups, group)
|
||||||
group = []OpCode{}
|
group = []OpCode{}
|
||||||
i1, j1 = max(i1, i2-n), max(j1, j2-n)
|
i1, j1 = maxInt(i1, i2-n), maxInt(j1, j2-n)
|
||||||
}
|
}
|
||||||
group = append(group, OpCode{c.Tag, i1, i2, j1, j2})
|
group = append(group, OpCode{c.Tag, i1, i2, j1, j2})
|
||||||
}
|
}
|
||||||
@ -515,7 +516,7 @@ func (m *SequenceMatcher) QuickRatio() float64 {
|
|||||||
// is faster to compute than either .Ratio() or .QuickRatio().
|
// is faster to compute than either .Ratio() or .QuickRatio().
|
||||||
func (m *SequenceMatcher) RealQuickRatio() float64 {
|
func (m *SequenceMatcher) RealQuickRatio() float64 {
|
||||||
la, lb := len(m.a), len(m.b)
|
la, lb := len(m.a), len(m.b)
|
||||||
return calculateRatio(min(la, lb), la+lb)
|
return calculateRatio(minInt(la, lb), la+lb)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert range to the "ed" format
|
// Convert range to the "ed" format
|
||||||
@ -524,7 +525,7 @@ func formatRangeUnified(start, stop int) string {
|
|||||||
beginning := start + 1 // lines start numbering with one
|
beginning := start + 1 // lines start numbering with one
|
||||||
length := stop - start
|
length := stop - start
|
||||||
if length == 1 {
|
if length == 1 {
|
||||||
return fmt.Sprintf("%d", beginning)
|
return strconv.Itoa(beginning)
|
||||||
}
|
}
|
||||||
if length == 0 {
|
if length == 0 {
|
||||||
beginning-- // empty ranges begin at line just before the range
|
beginning-- // empty ranges begin at line just before the range
|
||||||
|
3
vendor/github.com/prometheus/client_golang/prometheus/internal/go_runtime_metrics.go
generated
vendored
3
vendor/github.com/prometheus/client_golang/prometheus/internal/go_runtime_metrics.go
generated
vendored
@ -66,7 +66,8 @@ func RuntimeMetricsToProm(d *metrics.Description) (string, string, string, bool)
|
|||||||
name += "_total"
|
name += "_total"
|
||||||
}
|
}
|
||||||
|
|
||||||
valid := model.IsValidMetricName(model.LabelValue(namespace + "_" + subsystem + "_" + name))
|
// Our current conversion moves to legacy naming, so use legacy validation.
|
||||||
|
valid := model.IsValidLegacyMetricName(namespace + "_" + subsystem + "_" + name)
|
||||||
switch d.Kind {
|
switch d.Kind {
|
||||||
case metrics.KindUint64:
|
case metrics.KindUint64:
|
||||||
case metrics.KindFloat64:
|
case metrics.KindFloat64:
|
||||||
|
24
vendor/github.com/prometheus/client_golang/prometheus/metric.go
generated
vendored
24
vendor/github.com/prometheus/client_golang/prometheus/metric.go
generated
vendored
@ -108,15 +108,23 @@ func BuildFQName(namespace, subsystem, name string) string {
|
|||||||
if name == "" {
|
if name == "" {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
switch {
|
|
||||||
case namespace != "" && subsystem != "":
|
sb := strings.Builder{}
|
||||||
return strings.Join([]string{namespace, subsystem, name}, "_")
|
sb.Grow(len(namespace) + len(subsystem) + len(name) + 2)
|
||||||
case namespace != "":
|
|
||||||
return strings.Join([]string{namespace, name}, "_")
|
if namespace != "" {
|
||||||
case subsystem != "":
|
sb.WriteString(namespace)
|
||||||
return strings.Join([]string{subsystem, name}, "_")
|
sb.WriteString("_")
|
||||||
}
|
}
|
||||||
return name
|
|
||||||
|
if subsystem != "" {
|
||||||
|
sb.WriteString(subsystem)
|
||||||
|
sb.WriteString("_")
|
||||||
|
}
|
||||||
|
|
||||||
|
sb.WriteString(name)
|
||||||
|
|
||||||
|
return sb.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
type invalidMetric struct {
|
type invalidMetric struct {
|
||||||
|
31
vendor/github.com/prometheus/client_golang/prometheus/process_collector.go
generated
vendored
31
vendor/github.com/prometheus/client_golang/prometheus/process_collector.go
generated
vendored
@ -23,6 +23,7 @@ import (
|
|||||||
|
|
||||||
type processCollector struct {
|
type processCollector struct {
|
||||||
collectFn func(chan<- Metric)
|
collectFn func(chan<- Metric)
|
||||||
|
describeFn func(chan<- *Desc)
|
||||||
pidFn func() (int, error)
|
pidFn func() (int, error)
|
||||||
reportErrors bool
|
reportErrors bool
|
||||||
cpuTotal *Desc
|
cpuTotal *Desc
|
||||||
@ -122,26 +123,23 @@ func NewProcessCollector(opts ProcessCollectorOpts) Collector {
|
|||||||
// Set up process metric collection if supported by the runtime.
|
// Set up process metric collection if supported by the runtime.
|
||||||
if canCollectProcess() {
|
if canCollectProcess() {
|
||||||
c.collectFn = c.processCollect
|
c.collectFn = c.processCollect
|
||||||
|
c.describeFn = c.describe
|
||||||
} else {
|
} else {
|
||||||
c.collectFn = func(ch chan<- Metric) {
|
c.collectFn = c.errorCollectFn
|
||||||
c.reportError(ch, nil, errors.New("process metrics not supported on this platform"))
|
c.describeFn = c.errorDescribeFn
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
// Describe returns all descriptions of the collector.
|
func (c *processCollector) errorCollectFn(ch chan<- Metric) {
|
||||||
func (c *processCollector) Describe(ch chan<- *Desc) {
|
c.reportError(ch, nil, errors.New("process metrics not supported on this platform"))
|
||||||
ch <- c.cpuTotal
|
}
|
||||||
ch <- c.openFDs
|
|
||||||
ch <- c.maxFDs
|
func (c *processCollector) errorDescribeFn(ch chan<- *Desc) {
|
||||||
ch <- c.vsize
|
if c.reportErrors {
|
||||||
ch <- c.maxVsize
|
ch <- NewInvalidDesc(errors.New("process metrics not supported on this platform"))
|
||||||
ch <- c.rss
|
}
|
||||||
ch <- c.startTime
|
|
||||||
ch <- c.inBytes
|
|
||||||
ch <- c.outBytes
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Collect returns the current state of all metrics of the collector.
|
// Collect returns the current state of all metrics of the collector.
|
||||||
@ -149,6 +147,11 @@ func (c *processCollector) Collect(ch chan<- Metric) {
|
|||||||
c.collectFn(ch)
|
c.collectFn(ch)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Describe returns all descriptions of the collector.
|
||||||
|
func (c *processCollector) Describe(ch chan<- *Desc) {
|
||||||
|
c.describeFn(ch)
|
||||||
|
}
|
||||||
|
|
||||||
func (c *processCollector) reportError(ch chan<- Metric, desc *Desc, err error) {
|
func (c *processCollector) reportError(ch chan<- Metric, desc *Desc, err error) {
|
||||||
if !c.reportErrors {
|
if !c.reportErrors {
|
||||||
return
|
return
|
||||||
|
130
vendor/github.com/prometheus/client_golang/prometheus/process_collector_darwin.go
generated
vendored
Normal file
130
vendor/github.com/prometheus/client_golang/prometheus/process_collector_darwin.go
generated
vendored
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
// Copyright 2024 The Prometheus Authors
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
//go:build darwin && !ios
|
||||||
|
|
||||||
|
package prometheus
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"syscall"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"golang.org/x/sys/unix"
|
||||||
|
)
|
||||||
|
|
||||||
|
// notImplementedErr is returned by stub functions that replace cgo functions, when cgo
|
||||||
|
// isn't available.
|
||||||
|
var notImplementedErr = errors.New("not implemented")
|
||||||
|
|
||||||
|
type memoryInfo struct {
|
||||||
|
vsize uint64 // Virtual memory size in bytes
|
||||||
|
rss uint64 // Resident memory size in bytes
|
||||||
|
}
|
||||||
|
|
||||||
|
func canCollectProcess() bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func getSoftLimit(which int) (uint64, error) {
|
||||||
|
rlimit := syscall.Rlimit{}
|
||||||
|
|
||||||
|
if err := syscall.Getrlimit(which, &rlimit); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return rlimit.Cur, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getOpenFileCount() (float64, error) {
|
||||||
|
// Alternately, the undocumented proc_pidinfo(PROC_PIDLISTFDS) can be used to
|
||||||
|
// return a list of open fds, but that requires a way to call C APIs. The
|
||||||
|
// benefits, however, include fewer system calls and not failing when at the
|
||||||
|
// open file soft limit.
|
||||||
|
|
||||||
|
if dir, err := os.Open("/dev/fd"); err != nil {
|
||||||
|
return 0.0, err
|
||||||
|
} else {
|
||||||
|
defer dir.Close()
|
||||||
|
|
||||||
|
// Avoid ReadDir(), as it calls stat(2) on each descriptor. Not only is
|
||||||
|
// that info not used, but KQUEUE descriptors fail stat(2), which causes
|
||||||
|
// the whole method to fail.
|
||||||
|
if names, err := dir.Readdirnames(0); err != nil {
|
||||||
|
return 0.0, err
|
||||||
|
} else {
|
||||||
|
// Subtract 1 to ignore the open /dev/fd descriptor above.
|
||||||
|
return float64(len(names) - 1), nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *processCollector) processCollect(ch chan<- Metric) {
|
||||||
|
if procs, err := unix.SysctlKinfoProcSlice("kern.proc.pid", os.Getpid()); err == nil {
|
||||||
|
if len(procs) == 1 {
|
||||||
|
startTime := float64(procs[0].Proc.P_starttime.Nano() / 1e9)
|
||||||
|
ch <- MustNewConstMetric(c.startTime, GaugeValue, startTime)
|
||||||
|
} else {
|
||||||
|
err = fmt.Errorf("sysctl() returned %d proc structs (expected 1)", len(procs))
|
||||||
|
c.reportError(ch, c.startTime, err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
c.reportError(ch, c.startTime, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// The proc structure returned by kern.proc.pid above has an Rusage member,
|
||||||
|
// but it is not filled in, so it needs to be fetched by getrusage(2). For
|
||||||
|
// that call, the UTime, STime, and Maxrss members are filled out, but not
|
||||||
|
// Ixrss, Idrss, or Isrss for the memory usage. Memory stats will require
|
||||||
|
// access to the C API to call task_info(TASK_BASIC_INFO).
|
||||||
|
rusage := unix.Rusage{}
|
||||||
|
|
||||||
|
if err := unix.Getrusage(syscall.RUSAGE_SELF, &rusage); err == nil {
|
||||||
|
cpuTime := time.Duration(rusage.Stime.Nano() + rusage.Utime.Nano()).Seconds()
|
||||||
|
ch <- MustNewConstMetric(c.cpuTotal, CounterValue, cpuTime)
|
||||||
|
} else {
|
||||||
|
c.reportError(ch, c.cpuTotal, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if memInfo, err := getMemory(); err == nil {
|
||||||
|
ch <- MustNewConstMetric(c.rss, GaugeValue, float64(memInfo.rss))
|
||||||
|
ch <- MustNewConstMetric(c.vsize, GaugeValue, float64(memInfo.vsize))
|
||||||
|
} else if !errors.Is(err, notImplementedErr) {
|
||||||
|
// Don't report an error when support is not compiled in.
|
||||||
|
c.reportError(ch, c.rss, err)
|
||||||
|
c.reportError(ch, c.vsize, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if fds, err := getOpenFileCount(); err == nil {
|
||||||
|
ch <- MustNewConstMetric(c.openFDs, GaugeValue, fds)
|
||||||
|
} else {
|
||||||
|
c.reportError(ch, c.openFDs, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if openFiles, err := getSoftLimit(syscall.RLIMIT_NOFILE); err == nil {
|
||||||
|
ch <- MustNewConstMetric(c.maxFDs, GaugeValue, float64(openFiles))
|
||||||
|
} else {
|
||||||
|
c.reportError(ch, c.maxFDs, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if addressSpace, err := getSoftLimit(syscall.RLIMIT_AS); err == nil {
|
||||||
|
ch <- MustNewConstMetric(c.maxVsize, GaugeValue, float64(addressSpace))
|
||||||
|
} else {
|
||||||
|
c.reportError(ch, c.maxVsize, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: socket(PF_SYSTEM) to fetch "com.apple.network.statistics" might
|
||||||
|
// be able to get the per-process network send/receive counts.
|
||||||
|
}
|
84
vendor/github.com/prometheus/client_golang/prometheus/process_collector_mem_cgo_darwin.c
generated
vendored
Normal file
84
vendor/github.com/prometheus/client_golang/prometheus/process_collector_mem_cgo_darwin.c
generated
vendored
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
// Copyright 2024 The Prometheus Authors
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
//go:build darwin && !ios && cgo
|
||||||
|
|
||||||
|
#include <mach/mach_init.h>
|
||||||
|
#include <mach/task.h>
|
||||||
|
#include <mach/mach_vm.h>
|
||||||
|
|
||||||
|
// The compiler warns that mach/shared_memory_server.h is deprecated, and to use
|
||||||
|
// mach/shared_region.h instead. But that doesn't define
|
||||||
|
// SHARED_DATA_REGION_SIZE or SHARED_TEXT_REGION_SIZE, so redefine them here and
|
||||||
|
// avoid a warning message when running tests.
|
||||||
|
#define GLOBAL_SHARED_TEXT_SEGMENT 0x90000000U
|
||||||
|
#define SHARED_DATA_REGION_SIZE 0x10000000
|
||||||
|
#define SHARED_TEXT_REGION_SIZE 0x10000000
|
||||||
|
|
||||||
|
|
||||||
|
int get_memory_info(unsigned long long *rss, unsigned long long *vsize)
|
||||||
|
{
|
||||||
|
// This is lightly adapted from how ps(1) obtains its memory info.
|
||||||
|
// https://github.com/apple-oss-distributions/adv_cmds/blob/8744084ea0ff41ca4bb96b0f9c22407d0e48e9b7/ps/tasks.c#L109
|
||||||
|
|
||||||
|
kern_return_t error;
|
||||||
|
task_t task = MACH_PORT_NULL;
|
||||||
|
mach_task_basic_info_data_t info;
|
||||||
|
mach_msg_type_number_t info_count = MACH_TASK_BASIC_INFO_COUNT;
|
||||||
|
|
||||||
|
error = task_info(
|
||||||
|
mach_task_self(),
|
||||||
|
MACH_TASK_BASIC_INFO,
|
||||||
|
(task_info_t) &info,
|
||||||
|
&info_count );
|
||||||
|
|
||||||
|
if( error != KERN_SUCCESS )
|
||||||
|
{
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
*rss = info.resident_size;
|
||||||
|
*vsize = info.virtual_size;
|
||||||
|
|
||||||
|
{
|
||||||
|
vm_region_basic_info_data_64_t b_info;
|
||||||
|
mach_vm_address_t address = GLOBAL_SHARED_TEXT_SEGMENT;
|
||||||
|
mach_vm_size_t size;
|
||||||
|
mach_port_t object_name;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* try to determine if this task has the split libraries
|
||||||
|
* mapped in... if so, adjust its virtual size down by
|
||||||
|
* the 2 segments that are used for split libraries
|
||||||
|
*/
|
||||||
|
info_count = VM_REGION_BASIC_INFO_COUNT_64;
|
||||||
|
|
||||||
|
error = mach_vm_region(
|
||||||
|
mach_task_self(),
|
||||||
|
&address,
|
||||||
|
&size,
|
||||||
|
VM_REGION_BASIC_INFO_64,
|
||||||
|
(vm_region_info_t) &b_info,
|
||||||
|
&info_count,
|
||||||
|
&object_name);
|
||||||
|
|
||||||
|
if (error == KERN_SUCCESS) {
|
||||||
|
if (b_info.reserved && size == (SHARED_TEXT_REGION_SIZE) &&
|
||||||
|
*vsize > (SHARED_TEXT_REGION_SIZE + SHARED_DATA_REGION_SIZE)) {
|
||||||
|
*vsize -= (SHARED_TEXT_REGION_SIZE + SHARED_DATA_REGION_SIZE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
51
vendor/github.com/prometheus/client_golang/prometheus/process_collector_mem_cgo_darwin.go
generated
vendored
Normal file
51
vendor/github.com/prometheus/client_golang/prometheus/process_collector_mem_cgo_darwin.go
generated
vendored
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
// Copyright 2024 The Prometheus Authors
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
//go:build darwin && !ios && cgo
|
||||||
|
|
||||||
|
package prometheus
|
||||||
|
|
||||||
|
/*
|
||||||
|
int get_memory_info(unsigned long long *rss, unsigned long long *vs);
|
||||||
|
*/
|
||||||
|
import "C"
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func getMemory() (*memoryInfo, error) {
|
||||||
|
var rss, vsize C.ulonglong
|
||||||
|
|
||||||
|
if err := C.get_memory_info(&rss, &vsize); err != 0 {
|
||||||
|
return nil, fmt.Errorf("task_info() failed with 0x%x", int(err))
|
||||||
|
}
|
||||||
|
|
||||||
|
return &memoryInfo{vsize: uint64(vsize), rss: uint64(rss)}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// describe returns all descriptions of the collector for Darwin.
|
||||||
|
// Ensure that this list of descriptors is kept in sync with the metrics collected
|
||||||
|
// in the processCollect method. Any changes to the metrics in processCollect
|
||||||
|
// (such as adding or removing metrics) should be reflected in this list of descriptors.
|
||||||
|
func (c *processCollector) describe(ch chan<- *Desc) {
|
||||||
|
ch <- c.cpuTotal
|
||||||
|
ch <- c.openFDs
|
||||||
|
ch <- c.maxFDs
|
||||||
|
ch <- c.maxVsize
|
||||||
|
ch <- c.startTime
|
||||||
|
ch <- c.rss
|
||||||
|
ch <- c.vsize
|
||||||
|
|
||||||
|
/* the process could be collected but not implemented yet
|
||||||
|
ch <- c.inBytes
|
||||||
|
ch <- c.outBytes
|
||||||
|
*/
|
||||||
|
}
|
39
vendor/github.com/prometheus/client_golang/prometheus/process_collector_mem_nocgo_darwin.go
generated
vendored
Normal file
39
vendor/github.com/prometheus/client_golang/prometheus/process_collector_mem_nocgo_darwin.go
generated
vendored
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
// Copyright 2024 The Prometheus Authors
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
//go:build darwin && !ios && !cgo
|
||||||
|
|
||||||
|
package prometheus
|
||||||
|
|
||||||
|
func getMemory() (*memoryInfo, error) {
|
||||||
|
return nil, notImplementedErr
|
||||||
|
}
|
||||||
|
|
||||||
|
// describe returns all descriptions of the collector for Darwin.
|
||||||
|
// Ensure that this list of descriptors is kept in sync with the metrics collected
|
||||||
|
// in the processCollect method. Any changes to the metrics in processCollect
|
||||||
|
// (such as adding or removing metrics) should be reflected in this list of descriptors.
|
||||||
|
func (c *processCollector) describe(ch chan<- *Desc) {
|
||||||
|
ch <- c.cpuTotal
|
||||||
|
ch <- c.openFDs
|
||||||
|
ch <- c.maxFDs
|
||||||
|
ch <- c.maxVsize
|
||||||
|
ch <- c.startTime
|
||||||
|
|
||||||
|
/* the process could be collected but not implemented yet
|
||||||
|
ch <- c.rss
|
||||||
|
ch <- c.vsize
|
||||||
|
ch <- c.inBytes
|
||||||
|
ch <- c.outBytes
|
||||||
|
*/
|
||||||
|
}
|
@ -11,8 +11,8 @@
|
|||||||
// 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.
|
||||||
|
|
||||||
//go:build wasip1
|
//go:build wasip1 || js || ios
|
||||||
// +build wasip1
|
// +build wasip1 js ios
|
||||||
|
|
||||||
package prometheus
|
package prometheus
|
||||||
|
|
||||||
@ -20,7 +20,14 @@ func canCollectProcess() bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (*processCollector) processCollect(chan<- Metric) {
|
func (c *processCollector) processCollect(ch chan<- Metric) {
|
||||||
// noop on this platform
|
c.errorCollectFn(ch)
|
||||||
return
|
}
|
||||||
|
|
||||||
|
// describe returns all descriptions of the collector for wasip1 and js.
|
||||||
|
// Ensure that this list of descriptors is kept in sync with the metrics collected
|
||||||
|
// in the processCollect method. Any changes to the metrics in processCollect
|
||||||
|
// (such as adding or removing metrics) should be reflected in this list of descriptors.
|
||||||
|
func (c *processCollector) describe(ch chan<- *Desc) {
|
||||||
|
c.errorDescribeFn(ch)
|
||||||
}
|
}
|
@ -11,8 +11,8 @@
|
|||||||
// 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.
|
||||||
|
|
||||||
//go:build !windows && !js && !wasip1
|
//go:build !windows && !js && !wasip1 && !darwin
|
||||||
// +build !windows,!js,!wasip1
|
// +build !windows,!js,!wasip1,!darwin
|
||||||
|
|
||||||
package prometheus
|
package prometheus
|
||||||
|
|
||||||
@ -78,3 +78,19 @@ func (c *processCollector) processCollect(ch chan<- Metric) {
|
|||||||
c.reportError(ch, nil, err)
|
c.reportError(ch, nil, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// describe returns all descriptions of the collector for others than windows, js, wasip1 and darwin.
|
||||||
|
// Ensure that this list of descriptors is kept in sync with the metrics collected
|
||||||
|
// in the processCollect method. Any changes to the metrics in processCollect
|
||||||
|
// (such as adding or removing metrics) should be reflected in this list of descriptors.
|
||||||
|
func (c *processCollector) describe(ch chan<- *Desc) {
|
||||||
|
ch <- c.cpuTotal
|
||||||
|
ch <- c.openFDs
|
||||||
|
ch <- c.maxFDs
|
||||||
|
ch <- c.vsize
|
||||||
|
ch <- c.maxVsize
|
||||||
|
ch <- c.rss
|
||||||
|
ch <- c.startTime
|
||||||
|
ch <- c.inBytes
|
||||||
|
ch <- c.outBytes
|
||||||
|
}
|
21
vendor/github.com/prometheus/client_golang/prometheus/process_collector_windows.go
generated
vendored
21
vendor/github.com/prometheus/client_golang/prometheus/process_collector_windows.go
generated
vendored
@ -79,14 +79,10 @@ func getProcessHandleCount(handle windows.Handle) (uint32, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *processCollector) processCollect(ch chan<- Metric) {
|
func (c *processCollector) processCollect(ch chan<- Metric) {
|
||||||
h, err := windows.GetCurrentProcess()
|
h := windows.CurrentProcess()
|
||||||
if err != nil {
|
|
||||||
c.reportError(ch, nil, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var startTime, exitTime, kernelTime, userTime windows.Filetime
|
var startTime, exitTime, kernelTime, userTime windows.Filetime
|
||||||
err = windows.GetProcessTimes(h, &startTime, &exitTime, &kernelTime, &userTime)
|
err := windows.GetProcessTimes(h, &startTime, &exitTime, &kernelTime, &userTime)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.reportError(ch, nil, err)
|
c.reportError(ch, nil, err)
|
||||||
return
|
return
|
||||||
@ -111,6 +107,19 @@ func (c *processCollector) processCollect(ch chan<- Metric) {
|
|||||||
ch <- MustNewConstMetric(c.maxFDs, GaugeValue, float64(16*1024*1024)) // Windows has a hard-coded max limit, not per-process.
|
ch <- MustNewConstMetric(c.maxFDs, GaugeValue, float64(16*1024*1024)) // Windows has a hard-coded max limit, not per-process.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// describe returns all descriptions of the collector for windows.
|
||||||
|
// Ensure that this list of descriptors is kept in sync with the metrics collected
|
||||||
|
// in the processCollect method. Any changes to the metrics in processCollect
|
||||||
|
// (such as adding or removing metrics) should be reflected in this list of descriptors.
|
||||||
|
func (c *processCollector) describe(ch chan<- *Desc) {
|
||||||
|
ch <- c.cpuTotal
|
||||||
|
ch <- c.openFDs
|
||||||
|
ch <- c.maxFDs
|
||||||
|
ch <- c.vsize
|
||||||
|
ch <- c.rss
|
||||||
|
ch <- c.startTime
|
||||||
|
}
|
||||||
|
|
||||||
func fileTimeToSeconds(ft windows.Filetime) float64 {
|
func fileTimeToSeconds(ft windows.Filetime) float64 {
|
||||||
return float64(uint64(ft.HighDateTime)<<32+uint64(ft.LowDateTime)) / 1e7
|
return float64(uint64(ft.HighDateTime)<<32+uint64(ft.LowDateTime)) / 1e7
|
||||||
}
|
}
|
||||||
|
49
vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go
generated
vendored
49
vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go
generated
vendored
@ -41,11 +41,11 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/klauspost/compress/zstd"
|
|
||||||
"github.com/prometheus/common/expfmt"
|
"github.com/prometheus/common/expfmt"
|
||||||
|
|
||||||
"github.com/prometheus/client_golang/internal/github.com/golang/gddo/httputil"
|
"github.com/prometheus/client_golang/internal/github.com/golang/gddo/httputil"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
|
"github.com/prometheus/client_golang/prometheus/promhttp/internal"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -65,7 +65,13 @@ const (
|
|||||||
Zstd Compression = "zstd"
|
Zstd Compression = "zstd"
|
||||||
)
|
)
|
||||||
|
|
||||||
var defaultCompressionFormats = []Compression{Identity, Gzip, Zstd}
|
func defaultCompressionFormats() []Compression {
|
||||||
|
if internal.NewZstdWriter != nil {
|
||||||
|
return []Compression{Identity, Gzip, Zstd}
|
||||||
|
} else {
|
||||||
|
return []Compression{Identity, Gzip}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var gzipPool = sync.Pool{
|
var gzipPool = sync.Pool{
|
||||||
New: func() interface{} {
|
New: func() interface{} {
|
||||||
@ -138,7 +144,7 @@ func HandlerForTransactional(reg prometheus.TransactionalGatherer, opts HandlerO
|
|||||||
// Select compression formats to offer based on default or user choice.
|
// Select compression formats to offer based on default or user choice.
|
||||||
var compressions []string
|
var compressions []string
|
||||||
if !opts.DisableCompression {
|
if !opts.DisableCompression {
|
||||||
offers := defaultCompressionFormats
|
offers := defaultCompressionFormats()
|
||||||
if len(opts.OfferedCompressions) > 0 {
|
if len(opts.OfferedCompressions) > 0 {
|
||||||
offers = opts.OfferedCompressions
|
offers = opts.OfferedCompressions
|
||||||
}
|
}
|
||||||
@ -207,7 +213,13 @@ func HandlerForTransactional(reg prometheus.TransactionalGatherer, opts HandlerO
|
|||||||
if encodingHeader != string(Identity) {
|
if encodingHeader != string(Identity) {
|
||||||
rsp.Header().Set(contentEncodingHeader, encodingHeader)
|
rsp.Header().Set(contentEncodingHeader, encodingHeader)
|
||||||
}
|
}
|
||||||
enc := expfmt.NewEncoder(w, contentType)
|
|
||||||
|
var enc expfmt.Encoder
|
||||||
|
if opts.EnableOpenMetricsTextCreatedSamples {
|
||||||
|
enc = expfmt.NewEncoder(w, contentType, expfmt.WithCreatedLines())
|
||||||
|
} else {
|
||||||
|
enc = expfmt.NewEncoder(w, contentType)
|
||||||
|
}
|
||||||
|
|
||||||
// handleError handles the error according to opts.ErrorHandling
|
// handleError handles the error according to opts.ErrorHandling
|
||||||
// and returns true if we have to abort after the handling.
|
// and returns true if we have to abort after the handling.
|
||||||
@ -408,6 +420,21 @@ type HandlerOpts struct {
|
|||||||
// (which changes the identity of the resulting series on the Prometheus
|
// (which changes the identity of the resulting series on the Prometheus
|
||||||
// server).
|
// server).
|
||||||
EnableOpenMetrics bool
|
EnableOpenMetrics bool
|
||||||
|
// EnableOpenMetricsTextCreatedSamples specifies if this handler should add, extra, synthetic
|
||||||
|
// Created Timestamps for counters, histograms and summaries, which for the current
|
||||||
|
// version of OpenMetrics are defined as extra series with the same name and "_created"
|
||||||
|
// suffix. See also the OpenMetrics specification for more details
|
||||||
|
// https://github.com/prometheus/OpenMetrics/blob/v1.0.0/specification/OpenMetrics.md#counter-1
|
||||||
|
//
|
||||||
|
// Created timestamps are used to improve the accuracy of reset detection,
|
||||||
|
// but the way it's designed in OpenMetrics 1.0 it also dramatically increases cardinality
|
||||||
|
// if the scraper does not handle those metrics correctly (converting to created timestamp
|
||||||
|
// instead of leaving those series as-is). New OpenMetrics versions might improve
|
||||||
|
// this situation.
|
||||||
|
//
|
||||||
|
// Prometheus introduced the feature flag 'created-timestamp-zero-ingestion'
|
||||||
|
// in version 2.50.0 to handle this situation.
|
||||||
|
EnableOpenMetricsTextCreatedSamples bool
|
||||||
// ProcessStartTime allows setting process start timevalue that will be exposed
|
// ProcessStartTime allows setting process start timevalue that will be exposed
|
||||||
// with "Process-Start-Time-Unix" response header along with the metrics
|
// with "Process-Start-Time-Unix" response header along with the metrics
|
||||||
// payload. This allow callers to have efficient transformations to cumulative
|
// payload. This allow callers to have efficient transformations to cumulative
|
||||||
@ -445,14 +472,12 @@ func negotiateEncodingWriter(r *http.Request, rw io.Writer, compressions []strin
|
|||||||
|
|
||||||
switch selected {
|
switch selected {
|
||||||
case "zstd":
|
case "zstd":
|
||||||
// TODO(mrueg): Replace klauspost/compress with stdlib implementation once https://github.com/golang/go/issues/62513 is implemented.
|
if internal.NewZstdWriter == nil {
|
||||||
z, err := zstd.NewWriter(rw, zstd.WithEncoderLevel(zstd.SpeedFastest))
|
// The content encoding was not implemented yet.
|
||||||
if err != nil {
|
return nil, "", func() {}, fmt.Errorf("content compression format not recognized: %s. Valid formats are: %s", selected, defaultCompressionFormats())
|
||||||
return nil, "", func() {}, err
|
|
||||||
}
|
}
|
||||||
|
writer, closeWriter, err := internal.NewZstdWriter(rw)
|
||||||
z.Reset(rw)
|
return writer, selected, closeWriter, err
|
||||||
return z, selected, func() { _ = z.Close() }, nil
|
|
||||||
case "gzip":
|
case "gzip":
|
||||||
gz := gzipPool.Get().(*gzip.Writer)
|
gz := gzipPool.Get().(*gzip.Writer)
|
||||||
gz.Reset(rw)
|
gz.Reset(rw)
|
||||||
@ -462,6 +487,6 @@ func negotiateEncodingWriter(r *http.Request, rw io.Writer, compressions []strin
|
|||||||
return rw, selected, func() {}, nil
|
return rw, selected, func() {}, nil
|
||||||
default:
|
default:
|
||||||
// The content encoding was not implemented yet.
|
// The content encoding was not implemented yet.
|
||||||
return nil, "", func() {}, fmt.Errorf("content compression format not recognized: %s. Valid formats are: %s", selected, defaultCompressionFormats)
|
return nil, "", func() {}, fmt.Errorf("content compression format not recognized: %s. Valid formats are: %s", selected, defaultCompressionFormats())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2019 The Prometheus Authors
|
// Copyright 2025 The Prometheus Authors
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
// you may not use this file except in compliance with the License.
|
// you may not use this file except in compliance with the License.
|
||||||
// You may obtain a copy of the License at
|
// You may obtain a copy of the License at
|
||||||
@ -11,16 +11,11 @@
|
|||||||
// 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.
|
||||||
|
|
||||||
//go:build js
|
package internal
|
||||||
// +build js
|
|
||||||
|
|
||||||
package prometheus
|
import (
|
||||||
|
"io"
|
||||||
|
)
|
||||||
|
|
||||||
func canCollectProcess() bool {
|
// NewZstdWriter enables zstd write support if non-nil.
|
||||||
return false
|
var NewZstdWriter func(rw io.Writer) (_ io.Writer, closeWriter func(), _ error)
|
||||||
}
|
|
||||||
|
|
||||||
func (c *processCollector) processCollect(ch chan<- Metric) {
|
|
||||||
// noop on this platform
|
|
||||||
return
|
|
||||||
}
|
|
7
vendor/github.com/prometheus/client_golang/prometheus/summary.go
generated
vendored
7
vendor/github.com/prometheus/client_golang/prometheus/summary.go
generated
vendored
@ -243,6 +243,7 @@ func newSummary(desc *Desc, opts SummaryOpts, labelValues ...string) Summary {
|
|||||||
|
|
||||||
s := &summary{
|
s := &summary{
|
||||||
desc: desc,
|
desc: desc,
|
||||||
|
now: opts.now,
|
||||||
|
|
||||||
objectives: opts.Objectives,
|
objectives: opts.Objectives,
|
||||||
sortedObjectives: make([]float64, 0, len(opts.Objectives)),
|
sortedObjectives: make([]float64, 0, len(opts.Objectives)),
|
||||||
@ -280,6 +281,8 @@ type summary struct {
|
|||||||
|
|
||||||
desc *Desc
|
desc *Desc
|
||||||
|
|
||||||
|
now func() time.Time
|
||||||
|
|
||||||
objectives map[float64]float64
|
objectives map[float64]float64
|
||||||
sortedObjectives []float64
|
sortedObjectives []float64
|
||||||
|
|
||||||
@ -307,7 +310,7 @@ func (s *summary) Observe(v float64) {
|
|||||||
s.bufMtx.Lock()
|
s.bufMtx.Lock()
|
||||||
defer s.bufMtx.Unlock()
|
defer s.bufMtx.Unlock()
|
||||||
|
|
||||||
now := time.Now()
|
now := s.now()
|
||||||
if now.After(s.hotBufExpTime) {
|
if now.After(s.hotBufExpTime) {
|
||||||
s.asyncFlush(now)
|
s.asyncFlush(now)
|
||||||
}
|
}
|
||||||
@ -326,7 +329,7 @@ func (s *summary) Write(out *dto.Metric) error {
|
|||||||
s.bufMtx.Lock()
|
s.bufMtx.Lock()
|
||||||
s.mtx.Lock()
|
s.mtx.Lock()
|
||||||
// Swap bufs even if hotBuf is empty to set new hotBufExpTime.
|
// Swap bufs even if hotBuf is empty to set new hotBufExpTime.
|
||||||
s.swapBufs(time.Now())
|
s.swapBufs(s.now())
|
||||||
s.bufMtx.Unlock()
|
s.bufMtx.Unlock()
|
||||||
|
|
||||||
s.flushColdBuf()
|
s.flushColdBuf()
|
||||||
|
14
vendor/github.com/prometheus/common/expfmt/decode.go
generated
vendored
14
vendor/github.com/prometheus/common/expfmt/decode.go
generated
vendored
@ -45,7 +45,7 @@ func ResponseFormat(h http.Header) Format {
|
|||||||
|
|
||||||
mediatype, params, err := mime.ParseMediaType(ct)
|
mediatype, params, err := mime.ParseMediaType(ct)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmtUnknown
|
return FmtUnknown
|
||||||
}
|
}
|
||||||
|
|
||||||
const textType = "text/plain"
|
const textType = "text/plain"
|
||||||
@ -53,21 +53,21 @@ func ResponseFormat(h http.Header) Format {
|
|||||||
switch mediatype {
|
switch mediatype {
|
||||||
case ProtoType:
|
case ProtoType:
|
||||||
if p, ok := params["proto"]; ok && p != ProtoProtocol {
|
if p, ok := params["proto"]; ok && p != ProtoProtocol {
|
||||||
return fmtUnknown
|
return FmtUnknown
|
||||||
}
|
}
|
||||||
if e, ok := params["encoding"]; ok && e != "delimited" {
|
if e, ok := params["encoding"]; ok && e != "delimited" {
|
||||||
return fmtUnknown
|
return FmtUnknown
|
||||||
}
|
}
|
||||||
return fmtProtoDelim
|
return FmtProtoDelim
|
||||||
|
|
||||||
case textType:
|
case textType:
|
||||||
if v, ok := params["version"]; ok && v != TextVersion {
|
if v, ok := params["version"]; ok && v != TextVersion {
|
||||||
return fmtUnknown
|
return FmtUnknown
|
||||||
}
|
}
|
||||||
return fmtText
|
return FmtText
|
||||||
}
|
}
|
||||||
|
|
||||||
return fmtUnknown
|
return FmtUnknown
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewDecoder returns a new decoder based on the given input format.
|
// NewDecoder returns a new decoder based on the given input format.
|
||||||
|
28
vendor/github.com/prometheus/common/expfmt/encode.go
generated
vendored
28
vendor/github.com/prometheus/common/expfmt/encode.go
generated
vendored
@ -68,7 +68,7 @@ func Negotiate(h http.Header) Format {
|
|||||||
if escapeParam := ac.Params[model.EscapingKey]; escapeParam != "" {
|
if escapeParam := ac.Params[model.EscapingKey]; escapeParam != "" {
|
||||||
switch Format(escapeParam) {
|
switch Format(escapeParam) {
|
||||||
case model.AllowUTF8, model.EscapeUnderscores, model.EscapeDots, model.EscapeValues:
|
case model.AllowUTF8, model.EscapeUnderscores, model.EscapeDots, model.EscapeValues:
|
||||||
escapingScheme = Format(fmt.Sprintf("; escaping=%s", escapeParam))
|
escapingScheme = Format("; escaping=" + escapeParam)
|
||||||
default:
|
default:
|
||||||
// If the escaping parameter is unknown, ignore it.
|
// If the escaping parameter is unknown, ignore it.
|
||||||
}
|
}
|
||||||
@ -77,18 +77,18 @@ func Negotiate(h http.Header) Format {
|
|||||||
if ac.Type+"/"+ac.SubType == ProtoType && ac.Params["proto"] == ProtoProtocol {
|
if ac.Type+"/"+ac.SubType == ProtoType && ac.Params["proto"] == ProtoProtocol {
|
||||||
switch ac.Params["encoding"] {
|
switch ac.Params["encoding"] {
|
||||||
case "delimited":
|
case "delimited":
|
||||||
return fmtProtoDelim + escapingScheme
|
return FmtProtoDelim + escapingScheme
|
||||||
case "text":
|
case "text":
|
||||||
return fmtProtoText + escapingScheme
|
return FmtProtoText + escapingScheme
|
||||||
case "compact-text":
|
case "compact-text":
|
||||||
return fmtProtoCompact + escapingScheme
|
return FmtProtoCompact + escapingScheme
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ac.Type == "text" && ac.SubType == "plain" && (ver == TextVersion || ver == "") {
|
if ac.Type == "text" && ac.SubType == "plain" && (ver == TextVersion || ver == "") {
|
||||||
return fmtText + escapingScheme
|
return FmtText + escapingScheme
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return fmtText + escapingScheme
|
return FmtText + escapingScheme
|
||||||
}
|
}
|
||||||
|
|
||||||
// NegotiateIncludingOpenMetrics works like Negotiate but includes
|
// NegotiateIncludingOpenMetrics works like Negotiate but includes
|
||||||
@ -101,7 +101,7 @@ func NegotiateIncludingOpenMetrics(h http.Header) Format {
|
|||||||
if escapeParam := ac.Params[model.EscapingKey]; escapeParam != "" {
|
if escapeParam := ac.Params[model.EscapingKey]; escapeParam != "" {
|
||||||
switch Format(escapeParam) {
|
switch Format(escapeParam) {
|
||||||
case model.AllowUTF8, model.EscapeUnderscores, model.EscapeDots, model.EscapeValues:
|
case model.AllowUTF8, model.EscapeUnderscores, model.EscapeDots, model.EscapeValues:
|
||||||
escapingScheme = Format(fmt.Sprintf("; escaping=%s", escapeParam))
|
escapingScheme = Format("; escaping=" + escapeParam)
|
||||||
default:
|
default:
|
||||||
// If the escaping parameter is unknown, ignore it.
|
// If the escaping parameter is unknown, ignore it.
|
||||||
}
|
}
|
||||||
@ -110,26 +110,26 @@ func NegotiateIncludingOpenMetrics(h http.Header) Format {
|
|||||||
if ac.Type+"/"+ac.SubType == ProtoType && ac.Params["proto"] == ProtoProtocol {
|
if ac.Type+"/"+ac.SubType == ProtoType && ac.Params["proto"] == ProtoProtocol {
|
||||||
switch ac.Params["encoding"] {
|
switch ac.Params["encoding"] {
|
||||||
case "delimited":
|
case "delimited":
|
||||||
return fmtProtoDelim + escapingScheme
|
return FmtProtoDelim + escapingScheme
|
||||||
case "text":
|
case "text":
|
||||||
return fmtProtoText + escapingScheme
|
return FmtProtoText + escapingScheme
|
||||||
case "compact-text":
|
case "compact-text":
|
||||||
return fmtProtoCompact + escapingScheme
|
return FmtProtoCompact + escapingScheme
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ac.Type == "text" && ac.SubType == "plain" && (ver == TextVersion || ver == "") {
|
if ac.Type == "text" && ac.SubType == "plain" && (ver == TextVersion || ver == "") {
|
||||||
return fmtText + escapingScheme
|
return FmtText + escapingScheme
|
||||||
}
|
}
|
||||||
if ac.Type+"/"+ac.SubType == OpenMetricsType && (ver == OpenMetricsVersion_0_0_1 || ver == OpenMetricsVersion_1_0_0 || ver == "") {
|
if ac.Type+"/"+ac.SubType == OpenMetricsType && (ver == OpenMetricsVersion_0_0_1 || ver == OpenMetricsVersion_1_0_0 || ver == "") {
|
||||||
switch ver {
|
switch ver {
|
||||||
case OpenMetricsVersion_1_0_0:
|
case OpenMetricsVersion_1_0_0:
|
||||||
return fmtOpenMetrics_1_0_0 + escapingScheme
|
return FmtOpenMetrics_1_0_0 + escapingScheme
|
||||||
default:
|
default:
|
||||||
return fmtOpenMetrics_0_0_1 + escapingScheme
|
return FmtOpenMetrics_0_0_1 + escapingScheme
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return fmtText + escapingScheme
|
return FmtText + escapingScheme
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewEncoder returns a new encoder based on content type negotiation. All
|
// NewEncoder returns a new encoder based on content type negotiation. All
|
||||||
|
78
vendor/github.com/prometheus/common/expfmt/expfmt.go
generated
vendored
78
vendor/github.com/prometheus/common/expfmt/expfmt.go
generated
vendored
@ -15,7 +15,7 @@
|
|||||||
package expfmt
|
package expfmt
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"errors"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/prometheus/common/model"
|
"github.com/prometheus/common/model"
|
||||||
@ -32,24 +32,31 @@ type Format string
|
|||||||
// it on the wire, new content-type strings will have to be agreed upon and
|
// it on the wire, new content-type strings will have to be agreed upon and
|
||||||
// added here.
|
// added here.
|
||||||
const (
|
const (
|
||||||
TextVersion = "0.0.4"
|
TextVersion = "0.0.4"
|
||||||
ProtoType = `application/vnd.google.protobuf`
|
ProtoType = `application/vnd.google.protobuf`
|
||||||
ProtoProtocol = `io.prometheus.client.MetricFamily`
|
ProtoProtocol = `io.prometheus.client.MetricFamily`
|
||||||
protoFmt = ProtoType + "; proto=" + ProtoProtocol + ";"
|
// Deprecated: Use expfmt.NewFormat(expfmt.TypeProtoCompact) instead.
|
||||||
|
ProtoFmt = ProtoType + "; proto=" + ProtoProtocol + ";"
|
||||||
OpenMetricsType = `application/openmetrics-text`
|
OpenMetricsType = `application/openmetrics-text`
|
||||||
OpenMetricsVersion_0_0_1 = "0.0.1"
|
OpenMetricsVersion_0_0_1 = "0.0.1"
|
||||||
OpenMetricsVersion_1_0_0 = "1.0.0"
|
OpenMetricsVersion_1_0_0 = "1.0.0"
|
||||||
|
|
||||||
// The Content-Type values for the different wire protocols. Note that these
|
// The Content-Type values for the different wire protocols. Do not do direct
|
||||||
// values are now unexported. If code was relying on comparisons to these
|
// comparisons to these constants, instead use the comparison functions.
|
||||||
// constants, instead use FormatType().
|
// Deprecated: Use expfmt.NewFormat(expfmt.TypeUnknown) instead.
|
||||||
fmtUnknown Format = `<unknown>`
|
FmtUnknown Format = `<unknown>`
|
||||||
fmtText Format = `text/plain; version=` + TextVersion + `; charset=utf-8`
|
// Deprecated: Use expfmt.NewFormat(expfmt.TypeTextPlain) instead.
|
||||||
fmtProtoDelim Format = protoFmt + ` encoding=delimited`
|
FmtText Format = `text/plain; version=` + TextVersion + `; charset=utf-8`
|
||||||
fmtProtoText Format = protoFmt + ` encoding=text`
|
// Deprecated: Use expfmt.NewFormat(expfmt.TypeProtoDelim) instead.
|
||||||
fmtProtoCompact Format = protoFmt + ` encoding=compact-text`
|
FmtProtoDelim Format = ProtoFmt + ` encoding=delimited`
|
||||||
fmtOpenMetrics_1_0_0 Format = OpenMetricsType + `; version=` + OpenMetricsVersion_1_0_0 + `; charset=utf-8`
|
// Deprecated: Use expfmt.NewFormat(expfmt.TypeProtoText) instead.
|
||||||
fmtOpenMetrics_0_0_1 Format = OpenMetricsType + `; version=` + OpenMetricsVersion_0_0_1 + `; charset=utf-8`
|
FmtProtoText Format = ProtoFmt + ` encoding=text`
|
||||||
|
// Deprecated: Use expfmt.NewFormat(expfmt.TypeProtoCompact) instead.
|
||||||
|
FmtProtoCompact Format = ProtoFmt + ` encoding=compact-text`
|
||||||
|
// Deprecated: Use expfmt.NewFormat(expfmt.TypeOpenMetrics) instead.
|
||||||
|
FmtOpenMetrics_1_0_0 Format = OpenMetricsType + `; version=` + OpenMetricsVersion_1_0_0 + `; charset=utf-8`
|
||||||
|
// Deprecated: Use expfmt.NewFormat(expfmt.TypeOpenMetrics) instead.
|
||||||
|
FmtOpenMetrics_0_0_1 Format = OpenMetricsType + `; version=` + OpenMetricsVersion_0_0_1 + `; charset=utf-8`
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -79,17 +86,17 @@ const (
|
|||||||
func NewFormat(t FormatType) Format {
|
func NewFormat(t FormatType) Format {
|
||||||
switch t {
|
switch t {
|
||||||
case TypeProtoCompact:
|
case TypeProtoCompact:
|
||||||
return fmtProtoCompact
|
return FmtProtoCompact
|
||||||
case TypeProtoDelim:
|
case TypeProtoDelim:
|
||||||
return fmtProtoDelim
|
return FmtProtoDelim
|
||||||
case TypeProtoText:
|
case TypeProtoText:
|
||||||
return fmtProtoText
|
return FmtProtoText
|
||||||
case TypeTextPlain:
|
case TypeTextPlain:
|
||||||
return fmtText
|
return FmtText
|
||||||
case TypeOpenMetrics:
|
case TypeOpenMetrics:
|
||||||
return fmtOpenMetrics_1_0_0
|
return FmtOpenMetrics_1_0_0
|
||||||
default:
|
default:
|
||||||
return fmtUnknown
|
return FmtUnknown
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -97,12 +104,35 @@ func NewFormat(t FormatType) Format {
|
|||||||
// specified version number.
|
// specified version number.
|
||||||
func NewOpenMetricsFormat(version string) (Format, error) {
|
func NewOpenMetricsFormat(version string) (Format, error) {
|
||||||
if version == OpenMetricsVersion_0_0_1 {
|
if version == OpenMetricsVersion_0_0_1 {
|
||||||
return fmtOpenMetrics_0_0_1, nil
|
return FmtOpenMetrics_0_0_1, nil
|
||||||
}
|
}
|
||||||
if version == OpenMetricsVersion_1_0_0 {
|
if version == OpenMetricsVersion_1_0_0 {
|
||||||
return fmtOpenMetrics_1_0_0, nil
|
return FmtOpenMetrics_1_0_0, nil
|
||||||
}
|
}
|
||||||
return fmtUnknown, fmt.Errorf("unknown open metrics version string")
|
return FmtUnknown, errors.New("unknown open metrics version string")
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithEscapingScheme returns a copy of Format with the specified escaping
|
||||||
|
// scheme appended to the end. If an escaping scheme already exists it is
|
||||||
|
// removed.
|
||||||
|
func (f Format) WithEscapingScheme(s model.EscapingScheme) Format {
|
||||||
|
var terms []string
|
||||||
|
for _, p := range strings.Split(string(f), ";") {
|
||||||
|
toks := strings.Split(p, "=")
|
||||||
|
if len(toks) != 2 {
|
||||||
|
trimmed := strings.TrimSpace(p)
|
||||||
|
if len(trimmed) > 0 {
|
||||||
|
terms = append(terms, trimmed)
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
key := strings.TrimSpace(toks[0])
|
||||||
|
if key != model.EscapingKey {
|
||||||
|
terms = append(terms, strings.TrimSpace(p))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
terms = append(terms, model.EscapingKey+"="+s.String())
|
||||||
|
return Format(strings.Join(terms, "; "))
|
||||||
}
|
}
|
||||||
|
|
||||||
// FormatType deduces an overall FormatType for the given format.
|
// FormatType deduces an overall FormatType for the given format.
|
||||||
|
10
vendor/github.com/prometheus/common/expfmt/openmetrics_create.go
generated
vendored
10
vendor/github.com/prometheus/common/expfmt/openmetrics_create.go
generated
vendored
@ -38,7 +38,7 @@ type EncoderOption func(*encoderOption)
|
|||||||
|
|
||||||
// WithCreatedLines is an EncoderOption that configures the OpenMetrics encoder
|
// WithCreatedLines is an EncoderOption that configures the OpenMetrics encoder
|
||||||
// to include _created lines (See
|
// to include _created lines (See
|
||||||
// https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md#counter-1).
|
// https://github.com/prometheus/OpenMetrics/blob/v1.0.0/specification/OpenMetrics.md#counter-1).
|
||||||
// Created timestamps can improve the accuracy of series reset detection, but
|
// Created timestamps can improve the accuracy of series reset detection, but
|
||||||
// come with a bandwidth cost.
|
// come with a bandwidth cost.
|
||||||
//
|
//
|
||||||
@ -102,7 +102,7 @@ func WithUnit() EncoderOption {
|
|||||||
//
|
//
|
||||||
// - According to the OM specs, the `# UNIT` line is optional, but if populated,
|
// - According to the OM specs, the `# UNIT` line is optional, but if populated,
|
||||||
// the unit has to be present in the metric name as its suffix:
|
// the unit has to be present in the metric name as its suffix:
|
||||||
// (see https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md#unit).
|
// (see https://github.com/prometheus/OpenMetrics/blob/v1.0.0/specification/OpenMetrics.md#unit).
|
||||||
// However, in order to accommodate any potential scenario where such a change in the
|
// However, in order to accommodate any potential scenario where such a change in the
|
||||||
// metric name is not desirable, the users are here given the choice of either explicitly
|
// metric name is not desirable, the users are here given the choice of either explicitly
|
||||||
// opt in, in case they wish for the unit to be included in the output AND in the metric name
|
// opt in, in case they wish for the unit to be included in the output AND in the metric name
|
||||||
@ -152,8 +152,8 @@ func MetricFamilyToOpenMetrics(out io.Writer, in *dto.MetricFamily, options ...E
|
|||||||
if metricType == dto.MetricType_COUNTER && strings.HasSuffix(compliantName, "_total") {
|
if metricType == dto.MetricType_COUNTER && strings.HasSuffix(compliantName, "_total") {
|
||||||
compliantName = name[:len(name)-6]
|
compliantName = name[:len(name)-6]
|
||||||
}
|
}
|
||||||
if toOM.withUnit && in.Unit != nil && !strings.HasSuffix(compliantName, fmt.Sprintf("_%s", *in.Unit)) {
|
if toOM.withUnit && in.Unit != nil && !strings.HasSuffix(compliantName, "_"+*in.Unit) {
|
||||||
compliantName = compliantName + fmt.Sprintf("_%s", *in.Unit)
|
compliantName = compliantName + "_" + *in.Unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Comments, first HELP, then TYPE.
|
// Comments, first HELP, then TYPE.
|
||||||
@ -477,7 +477,7 @@ func writeOpenMetricsNameAndLabelPairs(
|
|||||||
if name != "" {
|
if name != "" {
|
||||||
// If the name does not pass the legacy validity check, we must put the
|
// If the name does not pass the legacy validity check, we must put the
|
||||||
// metric name inside the braces, quoted.
|
// metric name inside the braces, quoted.
|
||||||
if !model.IsValidLegacyMetricName(model.LabelValue(name)) {
|
if !model.IsValidLegacyMetricName(name) {
|
||||||
metricInsideBraces = true
|
metricInsideBraces = true
|
||||||
err := w.WriteByte(separator)
|
err := w.WriteByte(separator)
|
||||||
written++
|
written++
|
||||||
|
4
vendor/github.com/prometheus/common/expfmt/text_create.go
generated
vendored
4
vendor/github.com/prometheus/common/expfmt/text_create.go
generated
vendored
@ -354,7 +354,7 @@ func writeNameAndLabelPairs(
|
|||||||
if name != "" {
|
if name != "" {
|
||||||
// If the name does not pass the legacy validity check, we must put the
|
// If the name does not pass the legacy validity check, we must put the
|
||||||
// metric name inside the braces.
|
// metric name inside the braces.
|
||||||
if !model.IsValidLegacyMetricName(model.LabelValue(name)) {
|
if !model.IsValidLegacyMetricName(name) {
|
||||||
metricInsideBraces = true
|
metricInsideBraces = true
|
||||||
err := w.WriteByte(separator)
|
err := w.WriteByte(separator)
|
||||||
written++
|
written++
|
||||||
@ -498,7 +498,7 @@ func writeInt(w enhancedWriter, i int64) (int, error) {
|
|||||||
// writeName writes a string as-is if it complies with the legacy naming
|
// writeName writes a string as-is if it complies with the legacy naming
|
||||||
// scheme, or escapes it in double quotes if not.
|
// scheme, or escapes it in double quotes if not.
|
||||||
func writeName(w enhancedWriter, name string) (int, error) {
|
func writeName(w enhancedWriter, name string) (int, error) {
|
||||||
if model.IsValidLegacyMetricName(model.LabelValue(name)) {
|
if model.IsValidLegacyMetricName(name) {
|
||||||
return w.WriteString(name)
|
return w.WriteString(name)
|
||||||
}
|
}
|
||||||
var written int
|
var written int
|
||||||
|
164
vendor/github.com/prometheus/common/expfmt/text_parse.go
generated
vendored
164
vendor/github.com/prometheus/common/expfmt/text_parse.go
generated
vendored
@ -22,9 +22,9 @@ import (
|
|||||||
"math"
|
"math"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
"unicode/utf8"
|
||||||
|
|
||||||
dto "github.com/prometheus/client_model/go"
|
dto "github.com/prometheus/client_model/go"
|
||||||
|
|
||||||
"google.golang.org/protobuf/proto"
|
"google.golang.org/protobuf/proto"
|
||||||
|
|
||||||
"github.com/prometheus/common/model"
|
"github.com/prometheus/common/model"
|
||||||
@ -60,6 +60,7 @@ type TextParser struct {
|
|||||||
currentMF *dto.MetricFamily
|
currentMF *dto.MetricFamily
|
||||||
currentMetric *dto.Metric
|
currentMetric *dto.Metric
|
||||||
currentLabelPair *dto.LabelPair
|
currentLabelPair *dto.LabelPair
|
||||||
|
currentLabelPairs []*dto.LabelPair // Temporarily stores label pairs while parsing a metric line.
|
||||||
|
|
||||||
// The remaining member variables are only used for summaries/histograms.
|
// The remaining member variables are only used for summaries/histograms.
|
||||||
currentLabels map[string]string // All labels including '__name__' but excluding 'quantile'/'le'
|
currentLabels map[string]string // All labels including '__name__' but excluding 'quantile'/'le'
|
||||||
@ -74,6 +75,9 @@ type TextParser struct {
|
|||||||
// count and sum of that summary/histogram.
|
// count and sum of that summary/histogram.
|
||||||
currentIsSummaryCount, currentIsSummarySum bool
|
currentIsSummaryCount, currentIsSummarySum bool
|
||||||
currentIsHistogramCount, currentIsHistogramSum bool
|
currentIsHistogramCount, currentIsHistogramSum bool
|
||||||
|
// These indicate if the metric name from the current line being parsed is inside
|
||||||
|
// braces and if that metric name was found respectively.
|
||||||
|
currentMetricIsInsideBraces, currentMetricInsideBracesIsPresent bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// TextToMetricFamilies reads 'in' as the simple and flat text-based exchange
|
// TextToMetricFamilies reads 'in' as the simple and flat text-based exchange
|
||||||
@ -137,12 +141,15 @@ func (p *TextParser) reset(in io.Reader) {
|
|||||||
}
|
}
|
||||||
p.currentQuantile = math.NaN()
|
p.currentQuantile = math.NaN()
|
||||||
p.currentBucket = math.NaN()
|
p.currentBucket = math.NaN()
|
||||||
|
p.currentMF = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// startOfLine represents the state where the next byte read from p.buf is the
|
// startOfLine represents the state where the next byte read from p.buf is the
|
||||||
// start of a line (or whitespace leading up to it).
|
// start of a line (or whitespace leading up to it).
|
||||||
func (p *TextParser) startOfLine() stateFn {
|
func (p *TextParser) startOfLine() stateFn {
|
||||||
p.lineCount++
|
p.lineCount++
|
||||||
|
p.currentMetricIsInsideBraces = false
|
||||||
|
p.currentMetricInsideBracesIsPresent = false
|
||||||
if p.skipBlankTab(); p.err != nil {
|
if p.skipBlankTab(); p.err != nil {
|
||||||
// This is the only place that we expect to see io.EOF,
|
// This is the only place that we expect to see io.EOF,
|
||||||
// which is not an error but the signal that we are done.
|
// which is not an error but the signal that we are done.
|
||||||
@ -158,6 +165,9 @@ func (p *TextParser) startOfLine() stateFn {
|
|||||||
return p.startComment
|
return p.startComment
|
||||||
case '\n':
|
case '\n':
|
||||||
return p.startOfLine // Empty line, start the next one.
|
return p.startOfLine // Empty line, start the next one.
|
||||||
|
case '{':
|
||||||
|
p.currentMetricIsInsideBraces = true
|
||||||
|
return p.readingLabels
|
||||||
}
|
}
|
||||||
return p.readingMetricName
|
return p.readingMetricName
|
||||||
}
|
}
|
||||||
@ -275,6 +285,8 @@ func (p *TextParser) startLabelName() stateFn {
|
|||||||
return nil // Unexpected end of input.
|
return nil // Unexpected end of input.
|
||||||
}
|
}
|
||||||
if p.currentByte == '}' {
|
if p.currentByte == '}' {
|
||||||
|
p.currentMetric.Label = append(p.currentMetric.Label, p.currentLabelPairs...)
|
||||||
|
p.currentLabelPairs = nil
|
||||||
if p.skipBlankTab(); p.err != nil {
|
if p.skipBlankTab(); p.err != nil {
|
||||||
return nil // Unexpected end of input.
|
return nil // Unexpected end of input.
|
||||||
}
|
}
|
||||||
@ -287,6 +299,45 @@ func (p *TextParser) startLabelName() stateFn {
|
|||||||
p.parseError(fmt.Sprintf("invalid label name for metric %q", p.currentMF.GetName()))
|
p.parseError(fmt.Sprintf("invalid label name for metric %q", p.currentMF.GetName()))
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
if p.skipBlankTabIfCurrentBlankTab(); p.err != nil {
|
||||||
|
return nil // Unexpected end of input.
|
||||||
|
}
|
||||||
|
if p.currentByte != '=' {
|
||||||
|
if p.currentMetricIsInsideBraces {
|
||||||
|
if p.currentMetricInsideBracesIsPresent {
|
||||||
|
p.parseError(fmt.Sprintf("multiple metric names for metric %q", p.currentMF.GetName()))
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
switch p.currentByte {
|
||||||
|
case ',':
|
||||||
|
p.setOrCreateCurrentMF()
|
||||||
|
if p.currentMF.Type == nil {
|
||||||
|
p.currentMF.Type = dto.MetricType_UNTYPED.Enum()
|
||||||
|
}
|
||||||
|
p.currentMetric = &dto.Metric{}
|
||||||
|
p.currentMetricInsideBracesIsPresent = true
|
||||||
|
return p.startLabelName
|
||||||
|
case '}':
|
||||||
|
p.setOrCreateCurrentMF()
|
||||||
|
if p.currentMF.Type == nil {
|
||||||
|
p.currentMF.Type = dto.MetricType_UNTYPED.Enum()
|
||||||
|
}
|
||||||
|
p.currentMetric = &dto.Metric{}
|
||||||
|
p.currentMetric.Label = append(p.currentMetric.Label, p.currentLabelPairs...)
|
||||||
|
p.currentLabelPairs = nil
|
||||||
|
if p.skipBlankTab(); p.err != nil {
|
||||||
|
return nil // Unexpected end of input.
|
||||||
|
}
|
||||||
|
return p.readingValue
|
||||||
|
default:
|
||||||
|
p.parseError(fmt.Sprintf("unexpected end of metric name %q", p.currentByte))
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
p.parseError(fmt.Sprintf("expected '=' after label name, found %q", p.currentByte))
|
||||||
|
p.currentLabelPairs = nil
|
||||||
|
return nil
|
||||||
|
}
|
||||||
p.currentLabelPair = &dto.LabelPair{Name: proto.String(p.currentToken.String())}
|
p.currentLabelPair = &dto.LabelPair{Name: proto.String(p.currentToken.String())}
|
||||||
if p.currentLabelPair.GetName() == string(model.MetricNameLabel) {
|
if p.currentLabelPair.GetName() == string(model.MetricNameLabel) {
|
||||||
p.parseError(fmt.Sprintf("label name %q is reserved", model.MetricNameLabel))
|
p.parseError(fmt.Sprintf("label name %q is reserved", model.MetricNameLabel))
|
||||||
@ -296,23 +347,17 @@ func (p *TextParser) startLabelName() stateFn {
|
|||||||
// labels to 'real' labels.
|
// labels to 'real' labels.
|
||||||
if !(p.currentMF.GetType() == dto.MetricType_SUMMARY && p.currentLabelPair.GetName() == model.QuantileLabel) &&
|
if !(p.currentMF.GetType() == dto.MetricType_SUMMARY && p.currentLabelPair.GetName() == model.QuantileLabel) &&
|
||||||
!(p.currentMF.GetType() == dto.MetricType_HISTOGRAM && p.currentLabelPair.GetName() == model.BucketLabel) {
|
!(p.currentMF.GetType() == dto.MetricType_HISTOGRAM && p.currentLabelPair.GetName() == model.BucketLabel) {
|
||||||
p.currentMetric.Label = append(p.currentMetric.Label, p.currentLabelPair)
|
p.currentLabelPairs = append(p.currentLabelPairs, p.currentLabelPair)
|
||||||
}
|
|
||||||
if p.skipBlankTabIfCurrentBlankTab(); p.err != nil {
|
|
||||||
return nil // Unexpected end of input.
|
|
||||||
}
|
|
||||||
if p.currentByte != '=' {
|
|
||||||
p.parseError(fmt.Sprintf("expected '=' after label name, found %q", p.currentByte))
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
// Check for duplicate label names.
|
// Check for duplicate label names.
|
||||||
labels := make(map[string]struct{})
|
labels := make(map[string]struct{})
|
||||||
for _, l := range p.currentMetric.Label {
|
for _, l := range p.currentLabelPairs {
|
||||||
lName := l.GetName()
|
lName := l.GetName()
|
||||||
if _, exists := labels[lName]; !exists {
|
if _, exists := labels[lName]; !exists {
|
||||||
labels[lName] = struct{}{}
|
labels[lName] = struct{}{}
|
||||||
} else {
|
} else {
|
||||||
p.parseError(fmt.Sprintf("duplicate label names for metric %q", p.currentMF.GetName()))
|
p.parseError(fmt.Sprintf("duplicate label names for metric %q", p.currentMF.GetName()))
|
||||||
|
p.currentLabelPairs = nil
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -345,6 +390,7 @@ func (p *TextParser) startLabelValue() stateFn {
|
|||||||
if p.currentQuantile, p.err = parseFloat(p.currentLabelPair.GetValue()); p.err != nil {
|
if p.currentQuantile, p.err = parseFloat(p.currentLabelPair.GetValue()); p.err != nil {
|
||||||
// Create a more helpful error message.
|
// Create a more helpful error message.
|
||||||
p.parseError(fmt.Sprintf("expected float as value for 'quantile' label, got %q", p.currentLabelPair.GetValue()))
|
p.parseError(fmt.Sprintf("expected float as value for 'quantile' label, got %q", p.currentLabelPair.GetValue()))
|
||||||
|
p.currentLabelPairs = nil
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -371,12 +417,19 @@ func (p *TextParser) startLabelValue() stateFn {
|
|||||||
return p.startLabelName
|
return p.startLabelName
|
||||||
|
|
||||||
case '}':
|
case '}':
|
||||||
|
if p.currentMF == nil {
|
||||||
|
p.parseError("invalid metric name")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
p.currentMetric.Label = append(p.currentMetric.Label, p.currentLabelPairs...)
|
||||||
|
p.currentLabelPairs = nil
|
||||||
if p.skipBlankTab(); p.err != nil {
|
if p.skipBlankTab(); p.err != nil {
|
||||||
return nil // Unexpected end of input.
|
return nil // Unexpected end of input.
|
||||||
}
|
}
|
||||||
return p.readingValue
|
return p.readingValue
|
||||||
default:
|
default:
|
||||||
p.parseError(fmt.Sprintf("unexpected end of label value %q", p.currentLabelPair.GetValue()))
|
p.parseError(fmt.Sprintf("unexpected end of label value %q", p.currentLabelPair.GetValue()))
|
||||||
|
p.currentLabelPairs = nil
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -585,6 +638,8 @@ func (p *TextParser) readTokenUntilNewline(recognizeEscapeSequence bool) {
|
|||||||
p.currentToken.WriteByte(p.currentByte)
|
p.currentToken.WriteByte(p.currentByte)
|
||||||
case 'n':
|
case 'n':
|
||||||
p.currentToken.WriteByte('\n')
|
p.currentToken.WriteByte('\n')
|
||||||
|
case '"':
|
||||||
|
p.currentToken.WriteByte('"')
|
||||||
default:
|
default:
|
||||||
p.parseError(fmt.Sprintf("invalid escape sequence '\\%c'", p.currentByte))
|
p.parseError(fmt.Sprintf("invalid escape sequence '\\%c'", p.currentByte))
|
||||||
return
|
return
|
||||||
@ -610,13 +665,45 @@ func (p *TextParser) readTokenUntilNewline(recognizeEscapeSequence bool) {
|
|||||||
// but not into p.currentToken.
|
// but not into p.currentToken.
|
||||||
func (p *TextParser) readTokenAsMetricName() {
|
func (p *TextParser) readTokenAsMetricName() {
|
||||||
p.currentToken.Reset()
|
p.currentToken.Reset()
|
||||||
|
// A UTF-8 metric name must be quoted and may have escaped characters.
|
||||||
|
quoted := false
|
||||||
|
escaped := false
|
||||||
if !isValidMetricNameStart(p.currentByte) {
|
if !isValidMetricNameStart(p.currentByte) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
for {
|
for p.err == nil {
|
||||||
p.currentToken.WriteByte(p.currentByte)
|
if escaped {
|
||||||
|
switch p.currentByte {
|
||||||
|
case '\\':
|
||||||
|
p.currentToken.WriteByte(p.currentByte)
|
||||||
|
case 'n':
|
||||||
|
p.currentToken.WriteByte('\n')
|
||||||
|
case '"':
|
||||||
|
p.currentToken.WriteByte('"')
|
||||||
|
default:
|
||||||
|
p.parseError(fmt.Sprintf("invalid escape sequence '\\%c'", p.currentByte))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
escaped = false
|
||||||
|
} else {
|
||||||
|
switch p.currentByte {
|
||||||
|
case '"':
|
||||||
|
quoted = !quoted
|
||||||
|
if !quoted {
|
||||||
|
p.currentByte, p.err = p.buf.ReadByte()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
case '\n':
|
||||||
|
p.parseError(fmt.Sprintf("metric name %q contains unescaped new-line", p.currentToken.String()))
|
||||||
|
return
|
||||||
|
case '\\':
|
||||||
|
escaped = true
|
||||||
|
default:
|
||||||
|
p.currentToken.WriteByte(p.currentByte)
|
||||||
|
}
|
||||||
|
}
|
||||||
p.currentByte, p.err = p.buf.ReadByte()
|
p.currentByte, p.err = p.buf.ReadByte()
|
||||||
if p.err != nil || !isValidMetricNameContinuation(p.currentByte) {
|
if !isValidMetricNameContinuation(p.currentByte, quoted) || (!quoted && p.currentByte == ' ') {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -628,13 +715,45 @@ func (p *TextParser) readTokenAsMetricName() {
|
|||||||
// but not into p.currentToken.
|
// but not into p.currentToken.
|
||||||
func (p *TextParser) readTokenAsLabelName() {
|
func (p *TextParser) readTokenAsLabelName() {
|
||||||
p.currentToken.Reset()
|
p.currentToken.Reset()
|
||||||
|
// A UTF-8 label name must be quoted and may have escaped characters.
|
||||||
|
quoted := false
|
||||||
|
escaped := false
|
||||||
if !isValidLabelNameStart(p.currentByte) {
|
if !isValidLabelNameStart(p.currentByte) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
for {
|
for p.err == nil {
|
||||||
p.currentToken.WriteByte(p.currentByte)
|
if escaped {
|
||||||
|
switch p.currentByte {
|
||||||
|
case '\\':
|
||||||
|
p.currentToken.WriteByte(p.currentByte)
|
||||||
|
case 'n':
|
||||||
|
p.currentToken.WriteByte('\n')
|
||||||
|
case '"':
|
||||||
|
p.currentToken.WriteByte('"')
|
||||||
|
default:
|
||||||
|
p.parseError(fmt.Sprintf("invalid escape sequence '\\%c'", p.currentByte))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
escaped = false
|
||||||
|
} else {
|
||||||
|
switch p.currentByte {
|
||||||
|
case '"':
|
||||||
|
quoted = !quoted
|
||||||
|
if !quoted {
|
||||||
|
p.currentByte, p.err = p.buf.ReadByte()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
case '\n':
|
||||||
|
p.parseError(fmt.Sprintf("label name %q contains unescaped new-line", p.currentToken.String()))
|
||||||
|
return
|
||||||
|
case '\\':
|
||||||
|
escaped = true
|
||||||
|
default:
|
||||||
|
p.currentToken.WriteByte(p.currentByte)
|
||||||
|
}
|
||||||
|
}
|
||||||
p.currentByte, p.err = p.buf.ReadByte()
|
p.currentByte, p.err = p.buf.ReadByte()
|
||||||
if p.err != nil || !isValidLabelNameContinuation(p.currentByte) {
|
if !isValidLabelNameContinuation(p.currentByte, quoted) || (!quoted && p.currentByte == '=') {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -660,6 +779,7 @@ func (p *TextParser) readTokenAsLabelValue() {
|
|||||||
p.currentToken.WriteByte('\n')
|
p.currentToken.WriteByte('\n')
|
||||||
default:
|
default:
|
||||||
p.parseError(fmt.Sprintf("invalid escape sequence '\\%c'", p.currentByte))
|
p.parseError(fmt.Sprintf("invalid escape sequence '\\%c'", p.currentByte))
|
||||||
|
p.currentLabelPairs = nil
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
escaped = false
|
escaped = false
|
||||||
@ -718,19 +838,19 @@ func (p *TextParser) setOrCreateCurrentMF() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func isValidLabelNameStart(b byte) bool {
|
func isValidLabelNameStart(b byte) bool {
|
||||||
return (b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_'
|
return (b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' || b == '"'
|
||||||
}
|
}
|
||||||
|
|
||||||
func isValidLabelNameContinuation(b byte) bool {
|
func isValidLabelNameContinuation(b byte, quoted bool) bool {
|
||||||
return isValidLabelNameStart(b) || (b >= '0' && b <= '9')
|
return isValidLabelNameStart(b) || (b >= '0' && b <= '9') || (quoted && utf8.ValidString(string(b)))
|
||||||
}
|
}
|
||||||
|
|
||||||
func isValidMetricNameStart(b byte) bool {
|
func isValidMetricNameStart(b byte) bool {
|
||||||
return isValidLabelNameStart(b) || b == ':'
|
return isValidLabelNameStart(b) || b == ':'
|
||||||
}
|
}
|
||||||
|
|
||||||
func isValidMetricNameContinuation(b byte) bool {
|
func isValidMetricNameContinuation(b byte, quoted bool) bool {
|
||||||
return isValidLabelNameContinuation(b) || b == ':'
|
return isValidLabelNameContinuation(b, quoted) || b == ':'
|
||||||
}
|
}
|
||||||
|
|
||||||
func isBlankOrTab(b byte) bool {
|
func isBlankOrTab(b byte) bool {
|
||||||
@ -775,7 +895,7 @@ func histogramMetricName(name string) string {
|
|||||||
|
|
||||||
func parseFloat(s string) (float64, error) {
|
func parseFloat(s string) (float64, error) {
|
||||||
if strings.ContainsAny(s, "pP_") {
|
if strings.ContainsAny(s, "pP_") {
|
||||||
return 0, fmt.Errorf("unsupported character in float")
|
return 0, errors.New("unsupported character in float")
|
||||||
}
|
}
|
||||||
return strconv.ParseFloat(s, 64)
|
return strconv.ParseFloat(s, 64)
|
||||||
}
|
}
|
||||||
|
7
vendor/github.com/prometheus/common/model/alert.go
generated
vendored
7
vendor/github.com/prometheus/common/model/alert.go
generated
vendored
@ -14,6 +14,7 @@
|
|||||||
package model
|
package model
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
@ -89,16 +90,16 @@ func (a *Alert) StatusAt(ts time.Time) AlertStatus {
|
|||||||
// Validate checks whether the alert data is inconsistent.
|
// Validate checks whether the alert data is inconsistent.
|
||||||
func (a *Alert) Validate() error {
|
func (a *Alert) Validate() error {
|
||||||
if a.StartsAt.IsZero() {
|
if a.StartsAt.IsZero() {
|
||||||
return fmt.Errorf("start time missing")
|
return errors.New("start time missing")
|
||||||
}
|
}
|
||||||
if !a.EndsAt.IsZero() && a.EndsAt.Before(a.StartsAt) {
|
if !a.EndsAt.IsZero() && a.EndsAt.Before(a.StartsAt) {
|
||||||
return fmt.Errorf("start time must be before end time")
|
return errors.New("start time must be before end time")
|
||||||
}
|
}
|
||||||
if err := a.Labels.Validate(); err != nil {
|
if err := a.Labels.Validate(); err != nil {
|
||||||
return fmt.Errorf("invalid label set: %w", err)
|
return fmt.Errorf("invalid label set: %w", err)
|
||||||
}
|
}
|
||||||
if len(a.Labels) == 0 {
|
if len(a.Labels) == 0 {
|
||||||
return fmt.Errorf("at least one label pair required")
|
return errors.New("at least one label pair required")
|
||||||
}
|
}
|
||||||
if err := a.Annotations.Validate(); err != nil {
|
if err := a.Annotations.Validate(); err != nil {
|
||||||
return fmt.Errorf("invalid annotations: %w", err)
|
return fmt.Errorf("invalid annotations: %w", err)
|
||||||
|
27
vendor/github.com/prometheus/common/model/labels.go
generated
vendored
27
vendor/github.com/prometheus/common/model/labels.go
generated
vendored
@ -97,26 +97,35 @@ var LabelNameRE = regexp.MustCompile("^[a-zA-Z_][a-zA-Z0-9_]*$")
|
|||||||
// therewith.
|
// therewith.
|
||||||
type LabelName string
|
type LabelName string
|
||||||
|
|
||||||
// IsValid returns true iff name matches the pattern of LabelNameRE for legacy
|
// IsValid returns true iff the name matches the pattern of LabelNameRE when
|
||||||
// names, and iff it's valid UTF-8 if NameValidationScheme is set to
|
// NameValidationScheme is set to LegacyValidation, or valid UTF-8 if
|
||||||
// UTF8Validation. For the legacy matching, it does not use LabelNameRE for the
|
// NameValidationScheme is set to UTF8Validation.
|
||||||
// check but a much faster hardcoded implementation.
|
|
||||||
func (ln LabelName) IsValid() bool {
|
func (ln LabelName) IsValid() bool {
|
||||||
if len(ln) == 0 {
|
if len(ln) == 0 {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
switch NameValidationScheme {
|
switch NameValidationScheme {
|
||||||
case LegacyValidation:
|
case LegacyValidation:
|
||||||
for i, b := range ln {
|
return ln.IsValidLegacy()
|
||||||
if !((b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' || (b >= '0' && b <= '9' && i > 0)) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case UTF8Validation:
|
case UTF8Validation:
|
||||||
return utf8.ValidString(string(ln))
|
return utf8.ValidString(string(ln))
|
||||||
default:
|
default:
|
||||||
panic(fmt.Sprintf("Invalid name validation scheme requested: %d", NameValidationScheme))
|
panic(fmt.Sprintf("Invalid name validation scheme requested: %d", NameValidationScheme))
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsValidLegacy returns true iff name matches the pattern of LabelNameRE for
|
||||||
|
// legacy names. It does not use LabelNameRE for the check but a much faster
|
||||||
|
// hardcoded implementation.
|
||||||
|
func (ln LabelName) IsValidLegacy() bool {
|
||||||
|
if len(ln) == 0 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
for i, b := range ln {
|
||||||
|
if !((b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' || (b >= '0' && b <= '9' && i > 0)) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
2
vendor/github.com/prometheus/common/model/labelset_string.go
generated
vendored
2
vendor/github.com/prometheus/common/model/labelset_string.go
generated
vendored
@ -11,8 +11,6 @@
|
|||||||
// 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.
|
||||||
|
|
||||||
//go:build go1.21
|
|
||||||
|
|
||||||
package model
|
package model
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
39
vendor/github.com/prometheus/common/model/labelset_string_go120.go
generated
vendored
39
vendor/github.com/prometheus/common/model/labelset_string_go120.go
generated
vendored
@ -1,39 +0,0 @@
|
|||||||
// Copyright 2024 The Prometheus Authors
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
//go:build !go1.21
|
|
||||||
|
|
||||||
package model
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"sort"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// String was optimized using functions not available for go 1.20
|
|
||||||
// or lower. We keep the old implementation for compatibility with client_golang.
|
|
||||||
// Once client golang drops support for go 1.20 (scheduled for August 2024), this
|
|
||||||
// file can be removed.
|
|
||||||
func (l LabelSet) String() string {
|
|
||||||
labelNames := make([]string, 0, len(l))
|
|
||||||
for name := range l {
|
|
||||||
labelNames = append(labelNames, string(name))
|
|
||||||
}
|
|
||||||
sort.Strings(labelNames)
|
|
||||||
lstrs := make([]string, 0, len(l))
|
|
||||||
for _, name := range labelNames {
|
|
||||||
lstrs = append(lstrs, fmt.Sprintf("%s=%q", name, l[LabelName(name)]))
|
|
||||||
}
|
|
||||||
return fmt.Sprintf("{%s}", strings.Join(lstrs, ", "))
|
|
||||||
}
|
|
76
vendor/github.com/prometheus/common/model/metric.go
generated
vendored
76
vendor/github.com/prometheus/common/model/metric.go
generated
vendored
@ -14,9 +14,11 @@
|
|||||||
package model
|
package model
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"regexp"
|
"regexp"
|
||||||
"sort"
|
"sort"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"unicode/utf8"
|
"unicode/utf8"
|
||||||
|
|
||||||
@ -26,18 +28,21 @@ import (
|
|||||||
|
|
||||||
var (
|
var (
|
||||||
// NameValidationScheme determines the method of name validation to be used by
|
// NameValidationScheme determines the method of name validation to be used by
|
||||||
// all calls to IsValidMetricName() and LabelName IsValid(). Setting UTF-8 mode
|
// all calls to IsValidMetricName() and LabelName IsValid(). Setting UTF-8
|
||||||
// in isolation from other components that don't support UTF-8 may result in
|
// mode in isolation from other components that don't support UTF-8 may result
|
||||||
// bugs or other undefined behavior. This value is intended to be set by
|
// in bugs or other undefined behavior. This value can be set to
|
||||||
// UTF-8-aware binaries as part of their startup. To avoid need for locking,
|
// LegacyValidation during startup if a binary is not UTF-8-aware binaries. To
|
||||||
// this value should be set once, ideally in an init(), before multiple
|
// avoid need for locking, this value should be set once, ideally in an
|
||||||
// goroutines are started.
|
// init(), before multiple goroutines are started.
|
||||||
NameValidationScheme = LegacyValidation
|
NameValidationScheme = UTF8Validation
|
||||||
|
|
||||||
// NameEscapingScheme defines the default way that names will be
|
// NameEscapingScheme defines the default way that names will be escaped when
|
||||||
// escaped when presented to systems that do not support UTF-8 names. If the
|
// presented to systems that do not support UTF-8 names. If the Content-Type
|
||||||
// Content-Type "escaping" term is specified, that will override this value.
|
// "escaping" term is specified, that will override this value.
|
||||||
NameEscapingScheme = ValueEncodingEscaping
|
// NameEscapingScheme should not be set to the NoEscaping value. That string
|
||||||
|
// is used in content negotiation to indicate that a system supports UTF-8 and
|
||||||
|
// has that feature enabled.
|
||||||
|
NameEscapingScheme = UnderscoreEscaping
|
||||||
)
|
)
|
||||||
|
|
||||||
// ValidationScheme is a Go enum for determining how metric and label names will
|
// ValidationScheme is a Go enum for determining how metric and label names will
|
||||||
@ -161,7 +166,7 @@ func (m Metric) FastFingerprint() Fingerprint {
|
|||||||
func IsValidMetricName(n LabelValue) bool {
|
func IsValidMetricName(n LabelValue) bool {
|
||||||
switch NameValidationScheme {
|
switch NameValidationScheme {
|
||||||
case LegacyValidation:
|
case LegacyValidation:
|
||||||
return IsValidLegacyMetricName(n)
|
return IsValidLegacyMetricName(string(n))
|
||||||
case UTF8Validation:
|
case UTF8Validation:
|
||||||
if len(n) == 0 {
|
if len(n) == 0 {
|
||||||
return false
|
return false
|
||||||
@ -176,7 +181,7 @@ func IsValidMetricName(n LabelValue) bool {
|
|||||||
// legacy validation scheme regardless of the value of NameValidationScheme.
|
// legacy validation scheme regardless of the value of NameValidationScheme.
|
||||||
// This function, however, does not use MetricNameRE for the check but a much
|
// This function, however, does not use MetricNameRE for the check but a much
|
||||||
// faster hardcoded implementation.
|
// faster hardcoded implementation.
|
||||||
func IsValidLegacyMetricName(n LabelValue) bool {
|
func IsValidLegacyMetricName(n string) bool {
|
||||||
if len(n) == 0 {
|
if len(n) == 0 {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@ -208,7 +213,7 @@ func EscapeMetricFamily(v *dto.MetricFamily, scheme EscapingScheme) *dto.MetricF
|
|||||||
}
|
}
|
||||||
|
|
||||||
// If the name is nil, copy as-is, don't try to escape.
|
// If the name is nil, copy as-is, don't try to escape.
|
||||||
if v.Name == nil || IsValidLegacyMetricName(LabelValue(v.GetName())) {
|
if v.Name == nil || IsValidLegacyMetricName(v.GetName()) {
|
||||||
out.Name = v.Name
|
out.Name = v.Name
|
||||||
} else {
|
} else {
|
||||||
out.Name = proto.String(EscapeName(v.GetName(), scheme))
|
out.Name = proto.String(EscapeName(v.GetName(), scheme))
|
||||||
@ -230,7 +235,7 @@ func EscapeMetricFamily(v *dto.MetricFamily, scheme EscapingScheme) *dto.MetricF
|
|||||||
|
|
||||||
for _, l := range m.Label {
|
for _, l := range m.Label {
|
||||||
if l.GetName() == MetricNameLabel {
|
if l.GetName() == MetricNameLabel {
|
||||||
if l.Value == nil || IsValidLegacyMetricName(LabelValue(l.GetValue())) {
|
if l.Value == nil || IsValidLegacyMetricName(l.GetValue()) {
|
||||||
escaped.Label = append(escaped.Label, l)
|
escaped.Label = append(escaped.Label, l)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@ -240,7 +245,7 @@ func EscapeMetricFamily(v *dto.MetricFamily, scheme EscapingScheme) *dto.MetricF
|
|||||||
})
|
})
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if l.Name == nil || IsValidLegacyMetricName(LabelValue(l.GetName())) {
|
if l.Name == nil || IsValidLegacyMetricName(l.GetName()) {
|
||||||
escaped.Label = append(escaped.Label, l)
|
escaped.Label = append(escaped.Label, l)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@ -256,20 +261,16 @@ func EscapeMetricFamily(v *dto.MetricFamily, scheme EscapingScheme) *dto.MetricF
|
|||||||
|
|
||||||
func metricNeedsEscaping(m *dto.Metric) bool {
|
func metricNeedsEscaping(m *dto.Metric) bool {
|
||||||
for _, l := range m.Label {
|
for _, l := range m.Label {
|
||||||
if l.GetName() == MetricNameLabel && !IsValidLegacyMetricName(LabelValue(l.GetValue())) {
|
if l.GetName() == MetricNameLabel && !IsValidLegacyMetricName(l.GetValue()) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
if !IsValidLegacyMetricName(LabelValue(l.GetName())) {
|
if !IsValidLegacyMetricName(l.GetName()) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
|
||||||
lowerhex = "0123456789abcdef"
|
|
||||||
)
|
|
||||||
|
|
||||||
// EscapeName escapes the incoming name according to the provided escaping
|
// EscapeName escapes the incoming name according to the provided escaping
|
||||||
// scheme. Depending on the rules of escaping, this may cause no change in the
|
// scheme. Depending on the rules of escaping, this may cause no change in the
|
||||||
// string that is returned. (Especially NoEscaping, which by definition is a
|
// string that is returned. (Especially NoEscaping, which by definition is a
|
||||||
@ -283,7 +284,7 @@ func EscapeName(name string, scheme EscapingScheme) string {
|
|||||||
case NoEscaping:
|
case NoEscaping:
|
||||||
return name
|
return name
|
||||||
case UnderscoreEscaping:
|
case UnderscoreEscaping:
|
||||||
if IsValidLegacyMetricName(LabelValue(name)) {
|
if IsValidLegacyMetricName(name) {
|
||||||
return name
|
return name
|
||||||
}
|
}
|
||||||
for i, b := range name {
|
for i, b := range name {
|
||||||
@ -304,31 +305,25 @@ func EscapeName(name string, scheme EscapingScheme) string {
|
|||||||
} else if isValidLegacyRune(b, i) {
|
} else if isValidLegacyRune(b, i) {
|
||||||
escaped.WriteRune(b)
|
escaped.WriteRune(b)
|
||||||
} else {
|
} else {
|
||||||
escaped.WriteRune('_')
|
escaped.WriteString("__")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return escaped.String()
|
return escaped.String()
|
||||||
case ValueEncodingEscaping:
|
case ValueEncodingEscaping:
|
||||||
if IsValidLegacyMetricName(LabelValue(name)) {
|
if IsValidLegacyMetricName(name) {
|
||||||
return name
|
return name
|
||||||
}
|
}
|
||||||
escaped.WriteString("U__")
|
escaped.WriteString("U__")
|
||||||
for i, b := range name {
|
for i, b := range name {
|
||||||
if isValidLegacyRune(b, i) {
|
if b == '_' {
|
||||||
|
escaped.WriteString("__")
|
||||||
|
} else if isValidLegacyRune(b, i) {
|
||||||
escaped.WriteRune(b)
|
escaped.WriteRune(b)
|
||||||
} else if !utf8.ValidRune(b) {
|
} else if !utf8.ValidRune(b) {
|
||||||
escaped.WriteString("_FFFD_")
|
escaped.WriteString("_FFFD_")
|
||||||
} else if b < 0x100 {
|
} else {
|
||||||
escaped.WriteRune('_')
|
escaped.WriteRune('_')
|
||||||
for s := 4; s >= 0; s -= 4 {
|
escaped.WriteString(strconv.FormatInt(int64(b), 16))
|
||||||
escaped.WriteByte(lowerhex[b>>uint(s)&0xF])
|
|
||||||
}
|
|
||||||
escaped.WriteRune('_')
|
|
||||||
} else if b < 0x10000 {
|
|
||||||
escaped.WriteRune('_')
|
|
||||||
for s := 12; s >= 0; s -= 4 {
|
|
||||||
escaped.WriteByte(lowerhex[b>>uint(s)&0xF])
|
|
||||||
}
|
|
||||||
escaped.WriteRune('_')
|
escaped.WriteRune('_')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -386,8 +381,9 @@ func UnescapeName(name string, scheme EscapingScheme) string {
|
|||||||
// We think we are in a UTF-8 code, process it.
|
// We think we are in a UTF-8 code, process it.
|
||||||
var utf8Val uint
|
var utf8Val uint
|
||||||
for j := 0; i < len(escapedName); j++ {
|
for j := 0; i < len(escapedName); j++ {
|
||||||
// This is too many characters for a utf8 value.
|
// This is too many characters for a utf8 value based on the MaxRune
|
||||||
if j > 4 {
|
// value of '\U0010FFFF'.
|
||||||
|
if j >= 6 {
|
||||||
return name
|
return name
|
||||||
}
|
}
|
||||||
// Found a closing underscore, convert to a rune, check validity, and append.
|
// Found a closing underscore, convert to a rune, check validity, and append.
|
||||||
@ -440,7 +436,7 @@ func (e EscapingScheme) String() string {
|
|||||||
|
|
||||||
func ToEscapingScheme(s string) (EscapingScheme, error) {
|
func ToEscapingScheme(s string) (EscapingScheme, error) {
|
||||||
if s == "" {
|
if s == "" {
|
||||||
return NoEscaping, fmt.Errorf("got empty string instead of escaping scheme")
|
return NoEscaping, errors.New("got empty string instead of escaping scheme")
|
||||||
}
|
}
|
||||||
switch s {
|
switch s {
|
||||||
case AllowUTF8:
|
case AllowUTF8:
|
||||||
@ -452,6 +448,6 @@ func ToEscapingScheme(s string) (EscapingScheme, error) {
|
|||||||
case EscapeValues:
|
case EscapeValues:
|
||||||
return ValueEncodingEscaping, nil
|
return ValueEncodingEscaping, nil
|
||||||
default:
|
default:
|
||||||
return NoEscaping, fmt.Errorf("unknown format scheme " + s)
|
return NoEscaping, fmt.Errorf("unknown format scheme %s", s)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
17
vendor/github.com/prometheus/common/model/silence.go
generated
vendored
17
vendor/github.com/prometheus/common/model/silence.go
generated
vendored
@ -15,6 +15,7 @@ package model
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"regexp"
|
"regexp"
|
||||||
"time"
|
"time"
|
||||||
@ -34,7 +35,7 @@ func (m *Matcher) UnmarshalJSON(b []byte) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if len(m.Name) == 0 {
|
if len(m.Name) == 0 {
|
||||||
return fmt.Errorf("label name in matcher must not be empty")
|
return errors.New("label name in matcher must not be empty")
|
||||||
}
|
}
|
||||||
if m.IsRegex {
|
if m.IsRegex {
|
||||||
if _, err := regexp.Compile(m.Value); err != nil {
|
if _, err := regexp.Compile(m.Value); err != nil {
|
||||||
@ -77,7 +78,7 @@ type Silence struct {
|
|||||||
// Validate returns true iff all fields of the silence have valid values.
|
// Validate returns true iff all fields of the silence have valid values.
|
||||||
func (s *Silence) Validate() error {
|
func (s *Silence) Validate() error {
|
||||||
if len(s.Matchers) == 0 {
|
if len(s.Matchers) == 0 {
|
||||||
return fmt.Errorf("at least one matcher required")
|
return errors.New("at least one matcher required")
|
||||||
}
|
}
|
||||||
for _, m := range s.Matchers {
|
for _, m := range s.Matchers {
|
||||||
if err := m.Validate(); err != nil {
|
if err := m.Validate(); err != nil {
|
||||||
@ -85,22 +86,22 @@ func (s *Silence) Validate() error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if s.StartsAt.IsZero() {
|
if s.StartsAt.IsZero() {
|
||||||
return fmt.Errorf("start time missing")
|
return errors.New("start time missing")
|
||||||
}
|
}
|
||||||
if s.EndsAt.IsZero() {
|
if s.EndsAt.IsZero() {
|
||||||
return fmt.Errorf("end time missing")
|
return errors.New("end time missing")
|
||||||
}
|
}
|
||||||
if s.EndsAt.Before(s.StartsAt) {
|
if s.EndsAt.Before(s.StartsAt) {
|
||||||
return fmt.Errorf("start time must be before end time")
|
return errors.New("start time must be before end time")
|
||||||
}
|
}
|
||||||
if s.CreatedBy == "" {
|
if s.CreatedBy == "" {
|
||||||
return fmt.Errorf("creator information missing")
|
return errors.New("creator information missing")
|
||||||
}
|
}
|
||||||
if s.Comment == "" {
|
if s.Comment == "" {
|
||||||
return fmt.Errorf("comment missing")
|
return errors.New("comment missing")
|
||||||
}
|
}
|
||||||
if s.CreatedAt.IsZero() {
|
if s.CreatedAt.IsZero() {
|
||||||
return fmt.Errorf("creation timestamp missing")
|
return errors.New("creation timestamp missing")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
3
vendor/github.com/prometheus/common/model/value_float.go
generated
vendored
3
vendor/github.com/prometheus/common/model/value_float.go
generated
vendored
@ -15,6 +15,7 @@ package model
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
"strconv"
|
"strconv"
|
||||||
@ -39,7 +40,7 @@ func (v SampleValue) MarshalJSON() ([]byte, error) {
|
|||||||
// UnmarshalJSON implements json.Unmarshaler.
|
// UnmarshalJSON implements json.Unmarshaler.
|
||||||
func (v *SampleValue) UnmarshalJSON(b []byte) error {
|
func (v *SampleValue) UnmarshalJSON(b []byte) error {
|
||||||
if len(b) < 2 || b[0] != '"' || b[len(b)-1] != '"' {
|
if len(b) < 2 || b[0] != '"' || b[len(b)-1] != '"' {
|
||||||
return fmt.Errorf("sample value must be a quoted string")
|
return errors.New("sample value must be a quoted string")
|
||||||
}
|
}
|
||||||
f, err := strconv.ParseFloat(string(b[1:len(b)-1]), 64)
|
f, err := strconv.ParseFloat(string(b[1:len(b)-1]), 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
7
vendor/github.com/prometheus/common/model/value_histogram.go
generated
vendored
7
vendor/github.com/prometheus/common/model/value_histogram.go
generated
vendored
@ -15,6 +15,7 @@ package model
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
@ -32,7 +33,7 @@ func (v FloatString) MarshalJSON() ([]byte, error) {
|
|||||||
|
|
||||||
func (v *FloatString) UnmarshalJSON(b []byte) error {
|
func (v *FloatString) UnmarshalJSON(b []byte) error {
|
||||||
if len(b) < 2 || b[0] != '"' || b[len(b)-1] != '"' {
|
if len(b) < 2 || b[0] != '"' || b[len(b)-1] != '"' {
|
||||||
return fmt.Errorf("float value must be a quoted string")
|
return errors.New("float value must be a quoted string")
|
||||||
}
|
}
|
||||||
f, err := strconv.ParseFloat(string(b[1:len(b)-1]), 64)
|
f, err := strconv.ParseFloat(string(b[1:len(b)-1]), 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -141,7 +142,7 @@ type SampleHistogramPair struct {
|
|||||||
|
|
||||||
func (s SampleHistogramPair) MarshalJSON() ([]byte, error) {
|
func (s SampleHistogramPair) MarshalJSON() ([]byte, error) {
|
||||||
if s.Histogram == nil {
|
if s.Histogram == nil {
|
||||||
return nil, fmt.Errorf("histogram is nil")
|
return nil, errors.New("histogram is nil")
|
||||||
}
|
}
|
||||||
t, err := json.Marshal(s.Timestamp)
|
t, err := json.Marshal(s.Timestamp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -164,7 +165,7 @@ func (s *SampleHistogramPair) UnmarshalJSON(buf []byte) error {
|
|||||||
return fmt.Errorf("wrong number of fields: %d != %d", gotLen, wantLen)
|
return fmt.Errorf("wrong number of fields: %d != %d", gotLen, wantLen)
|
||||||
}
|
}
|
||||||
if s.Histogram == nil {
|
if s.Histogram == nil {
|
||||||
return fmt.Errorf("histogram is null")
|
return errors.New("histogram is null")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
27
vendor/go.opentelemetry.io/auto/sdk/CONTRIBUTING.md
generated
vendored
Normal file
27
vendor/go.opentelemetry.io/auto/sdk/CONTRIBUTING.md
generated
vendored
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
# Contributing to go.opentelemetry.io/auto/sdk
|
||||||
|
|
||||||
|
The `go.opentelemetry.io/auto/sdk` module is a purpose built OpenTelemetry SDK.
|
||||||
|
It is designed to be:
|
||||||
|
|
||||||
|
0. An OpenTelemetry compliant SDK
|
||||||
|
1. Instrumented by auto-instrumentation (serializable into OTLP JSON)
|
||||||
|
2. Lightweight
|
||||||
|
3. User-friendly
|
||||||
|
|
||||||
|
These design choices are listed in the order of their importance.
|
||||||
|
|
||||||
|
The primary design goal of this module is to be an OpenTelemetry SDK.
|
||||||
|
This means that it needs to implement the Go APIs found in `go.opentelemetry.io/otel`.
|
||||||
|
|
||||||
|
Having met the requirement of SDK compliance, this module needs to provide code that the `go.opentelemetry.io/auto` module can instrument.
|
||||||
|
The chosen approach to meet this goal is to ensure the telemetry from the SDK is serializable into JSON encoded OTLP.
|
||||||
|
This ensures then that the serialized form is compatible with other OpenTelemetry systems, and the auto-instrumentation can use these systems to deserialize any telemetry it is sent.
|
||||||
|
|
||||||
|
Outside of these first two goals, the intended use becomes relevant.
|
||||||
|
This package is intended to be used in the `go.opentelemetry.io/otel` global API as a default when the auto-instrumentation is running.
|
||||||
|
Because of this, this package needs to not add unnecessary dependencies to that API.
|
||||||
|
Ideally, it adds none.
|
||||||
|
It also needs to operate efficiently.
|
||||||
|
|
||||||
|
Finally, this module is designed to be user-friendly to Go development.
|
||||||
|
It hides complexity in order to provide simpler APIs when the previous goals can all still be met.
|
201
vendor/go.opentelemetry.io/auto/sdk/LICENSE
generated
vendored
Normal file
201
vendor/go.opentelemetry.io/auto/sdk/LICENSE
generated
vendored
Normal file
@ -0,0 +1,201 @@
|
|||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
15
vendor/go.opentelemetry.io/auto/sdk/VERSIONING.md
generated
vendored
Normal file
15
vendor/go.opentelemetry.io/auto/sdk/VERSIONING.md
generated
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
# Versioning
|
||||||
|
|
||||||
|
This document describes the versioning policy for this module.
|
||||||
|
This policy is designed so the following goals can be achieved.
|
||||||
|
|
||||||
|
**Users are provided a codebase of value that is stable and secure.**
|
||||||
|
|
||||||
|
## Policy
|
||||||
|
|
||||||
|
* Versioning of this module will be idiomatic of a Go project using [Go modules](https://github.com/golang/go/wiki/Modules).
|
||||||
|
* [Semantic import versioning](https://github.com/golang/go/wiki/Modules#semantic-import-versioning) will be used.
|
||||||
|
* Versions will comply with [semver 2.0](https://semver.org/spec/v2.0.0.html).
|
||||||
|
* Any `v2` or higher version of this module will be included as a `/vN` at the end of the module path used in `go.mod` files and in the package import path.
|
||||||
|
|
||||||
|
* GitHub releases will be made for all releases.
|
14
vendor/go.opentelemetry.io/auto/sdk/doc.go
generated
vendored
Normal file
14
vendor/go.opentelemetry.io/auto/sdk/doc.go
generated
vendored
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
/*
|
||||||
|
Package sdk provides an auto-instrumentable OpenTelemetry SDK.
|
||||||
|
|
||||||
|
An [go.opentelemetry.io/auto.Instrumentation] can be configured to target the
|
||||||
|
process running this SDK. In that case, all telemetry the SDK produces will be
|
||||||
|
processed and handled by that [go.opentelemetry.io/auto.Instrumentation].
|
||||||
|
|
||||||
|
By default, if there is no [go.opentelemetry.io/auto.Instrumentation] set to
|
||||||
|
auto-instrument the SDK, the SDK will not generate any telemetry.
|
||||||
|
*/
|
||||||
|
package sdk
|
58
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/attr.go
generated
vendored
Normal file
58
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/attr.go
generated
vendored
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package telemetry
|
||||||
|
|
||||||
|
// Attr is a key-value pair.
|
||||||
|
type Attr struct {
|
||||||
|
Key string `json:"key,omitempty"`
|
||||||
|
Value Value `json:"value,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// String returns an Attr for a string value.
|
||||||
|
func String(key, value string) Attr {
|
||||||
|
return Attr{key, StringValue(value)}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64 returns an Attr for an int64 value.
|
||||||
|
func Int64(key string, value int64) Attr {
|
||||||
|
return Attr{key, Int64Value(value)}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int returns an Attr for an int value.
|
||||||
|
func Int(key string, value int) Attr {
|
||||||
|
return Int64(key, int64(value))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64 returns an Attr for a float64 value.
|
||||||
|
func Float64(key string, value float64) Attr {
|
||||||
|
return Attr{key, Float64Value(value)}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bool returns an Attr for a bool value.
|
||||||
|
func Bool(key string, value bool) Attr {
|
||||||
|
return Attr{key, BoolValue(value)}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bytes returns an Attr for a []byte value.
|
||||||
|
// The passed slice must not be changed after it is passed.
|
||||||
|
func Bytes(key string, value []byte) Attr {
|
||||||
|
return Attr{key, BytesValue(value)}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Slice returns an Attr for a []Value value.
|
||||||
|
// The passed slice must not be changed after it is passed.
|
||||||
|
func Slice(key string, value ...Value) Attr {
|
||||||
|
return Attr{key, SliceValue(value...)}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Map returns an Attr for a map value.
|
||||||
|
// The passed slice must not be changed after it is passed.
|
||||||
|
func Map(key string, value ...Attr) Attr {
|
||||||
|
return Attr{key, MapValue(value...)}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Equal returns if a is equal to b.
|
||||||
|
func (a Attr) Equal(b Attr) bool {
|
||||||
|
return a.Key == b.Key && a.Value.Equal(b.Value)
|
||||||
|
}
|
8
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/doc.go
generated
vendored
Normal file
8
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/doc.go
generated
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
/*
|
||||||
|
Package telemetry provides a lightweight representations of OpenTelemetry
|
||||||
|
telemetry that is compatible with the OTLP JSON protobuf encoding.
|
||||||
|
*/
|
||||||
|
package telemetry
|
103
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/id.go
generated
vendored
Normal file
103
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/id.go
generated
vendored
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package telemetry
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/hex"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
traceIDSize = 16
|
||||||
|
spanIDSize = 8
|
||||||
|
)
|
||||||
|
|
||||||
|
// TraceID is a custom data type that is used for all trace IDs.
|
||||||
|
type TraceID [traceIDSize]byte
|
||||||
|
|
||||||
|
// String returns the hex string representation form of a TraceID.
|
||||||
|
func (tid TraceID) String() string {
|
||||||
|
return hex.EncodeToString(tid[:])
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsEmpty returns false if id contains at least one non-zero byte.
|
||||||
|
func (tid TraceID) IsEmpty() bool {
|
||||||
|
return tid == [traceIDSize]byte{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalJSON converts the trace ID into a hex string enclosed in quotes.
|
||||||
|
func (tid TraceID) MarshalJSON() ([]byte, error) {
|
||||||
|
if tid.IsEmpty() {
|
||||||
|
return []byte(`""`), nil
|
||||||
|
}
|
||||||
|
return marshalJSON(tid[:])
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON inflates the trace ID from hex string, possibly enclosed in
|
||||||
|
// quotes.
|
||||||
|
func (tid *TraceID) UnmarshalJSON(data []byte) error {
|
||||||
|
*tid = [traceIDSize]byte{}
|
||||||
|
return unmarshalJSON(tid[:], data)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SpanID is a custom data type that is used for all span IDs.
|
||||||
|
type SpanID [spanIDSize]byte
|
||||||
|
|
||||||
|
// String returns the hex string representation form of a SpanID.
|
||||||
|
func (sid SpanID) String() string {
|
||||||
|
return hex.EncodeToString(sid[:])
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsEmpty returns true if the span ID contains at least one non-zero byte.
|
||||||
|
func (sid SpanID) IsEmpty() bool {
|
||||||
|
return sid == [spanIDSize]byte{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalJSON converts span ID into a hex string enclosed in quotes.
|
||||||
|
func (sid SpanID) MarshalJSON() ([]byte, error) {
|
||||||
|
if sid.IsEmpty() {
|
||||||
|
return []byte(`""`), nil
|
||||||
|
}
|
||||||
|
return marshalJSON(sid[:])
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON decodes span ID from hex string, possibly enclosed in quotes.
|
||||||
|
func (sid *SpanID) UnmarshalJSON(data []byte) error {
|
||||||
|
*sid = [spanIDSize]byte{}
|
||||||
|
return unmarshalJSON(sid[:], data)
|
||||||
|
}
|
||||||
|
|
||||||
|
// marshalJSON converts id into a hex string enclosed in quotes.
|
||||||
|
func marshalJSON(id []byte) ([]byte, error) {
|
||||||
|
// Plus 2 quote chars at the start and end.
|
||||||
|
hexLen := hex.EncodedLen(len(id)) + 2
|
||||||
|
|
||||||
|
b := make([]byte, hexLen)
|
||||||
|
hex.Encode(b[1:hexLen-1], id)
|
||||||
|
b[0], b[hexLen-1] = '"', '"'
|
||||||
|
|
||||||
|
return b, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// unmarshalJSON inflates trace id from hex string, possibly enclosed in quotes.
|
||||||
|
func unmarshalJSON(dst []byte, src []byte) error {
|
||||||
|
if l := len(src); l >= 2 && src[0] == '"' && src[l-1] == '"' {
|
||||||
|
src = src[1 : l-1]
|
||||||
|
}
|
||||||
|
nLen := len(src)
|
||||||
|
if nLen == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(dst) != hex.DecodedLen(nLen) {
|
||||||
|
return errors.New("invalid length for ID")
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := hex.Decode(dst, src)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("cannot unmarshal ID from string '%s': %w", string(src), err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
67
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/number.go
generated
vendored
Normal file
67
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/number.go
generated
vendored
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package telemetry
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"strconv"
|
||||||
|
)
|
||||||
|
|
||||||
|
// protoInt64 represents the protobuf encoding of integers which can be either
|
||||||
|
// strings or integers.
|
||||||
|
type protoInt64 int64
|
||||||
|
|
||||||
|
// Int64 returns the protoInt64 as an int64.
|
||||||
|
func (i *protoInt64) Int64() int64 { return int64(*i) }
|
||||||
|
|
||||||
|
// UnmarshalJSON decodes both strings and integers.
|
||||||
|
func (i *protoInt64) UnmarshalJSON(data []byte) error {
|
||||||
|
if data[0] == '"' {
|
||||||
|
var str string
|
||||||
|
if err := json.Unmarshal(data, &str); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
parsedInt, err := strconv.ParseInt(str, 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
*i = protoInt64(parsedInt)
|
||||||
|
} else {
|
||||||
|
var parsedInt int64
|
||||||
|
if err := json.Unmarshal(data, &parsedInt); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
*i = protoInt64(parsedInt)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// protoUint64 represents the protobuf encoding of integers which can be either
|
||||||
|
// strings or integers.
|
||||||
|
type protoUint64 uint64
|
||||||
|
|
||||||
|
// Int64 returns the protoUint64 as a uint64.
|
||||||
|
func (i *protoUint64) Uint64() uint64 { return uint64(*i) }
|
||||||
|
|
||||||
|
// UnmarshalJSON decodes both strings and integers.
|
||||||
|
func (i *protoUint64) UnmarshalJSON(data []byte) error {
|
||||||
|
if data[0] == '"' {
|
||||||
|
var str string
|
||||||
|
if err := json.Unmarshal(data, &str); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
parsedUint, err := strconv.ParseUint(str, 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
*i = protoUint64(parsedUint)
|
||||||
|
} else {
|
||||||
|
var parsedUint uint64
|
||||||
|
if err := json.Unmarshal(data, &parsedUint); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
*i = protoUint64(parsedUint)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
66
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/resource.go
generated
vendored
Normal file
66
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/resource.go
generated
vendored
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package telemetry
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Resource information.
|
||||||
|
type Resource struct {
|
||||||
|
// Attrs are the set of attributes that describe the resource. Attribute
|
||||||
|
// keys MUST be unique (it is not allowed to have more than one attribute
|
||||||
|
// with the same key).
|
||||||
|
Attrs []Attr `json:"attributes,omitempty"`
|
||||||
|
// DroppedAttrs is the number of dropped attributes. If the value
|
||||||
|
// is 0, then no attributes were dropped.
|
||||||
|
DroppedAttrs uint32 `json:"droppedAttributesCount,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON decodes the OTLP formatted JSON contained in data into r.
|
||||||
|
func (r *Resource) UnmarshalJSON(data []byte) error {
|
||||||
|
decoder := json.NewDecoder(bytes.NewReader(data))
|
||||||
|
|
||||||
|
t, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if t != json.Delim('{') {
|
||||||
|
return errors.New("invalid Resource type")
|
||||||
|
}
|
||||||
|
|
||||||
|
for decoder.More() {
|
||||||
|
keyIface, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, io.EOF) {
|
||||||
|
// Empty.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
key, ok := keyIface.(string)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("invalid Resource field: %#v", keyIface)
|
||||||
|
}
|
||||||
|
|
||||||
|
switch key {
|
||||||
|
case "attributes":
|
||||||
|
err = decoder.Decode(&r.Attrs)
|
||||||
|
case "droppedAttributesCount", "dropped_attributes_count":
|
||||||
|
err = decoder.Decode(&r.DroppedAttrs)
|
||||||
|
default:
|
||||||
|
// Skip unknown.
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
67
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/scope.go
generated
vendored
Normal file
67
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/scope.go
generated
vendored
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package telemetry
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Scope is the identifying values of the instrumentation scope.
|
||||||
|
type Scope struct {
|
||||||
|
Name string `json:"name,omitempty"`
|
||||||
|
Version string `json:"version,omitempty"`
|
||||||
|
Attrs []Attr `json:"attributes,omitempty"`
|
||||||
|
DroppedAttrs uint32 `json:"droppedAttributesCount,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON decodes the OTLP formatted JSON contained in data into r.
|
||||||
|
func (s *Scope) UnmarshalJSON(data []byte) error {
|
||||||
|
decoder := json.NewDecoder(bytes.NewReader(data))
|
||||||
|
|
||||||
|
t, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if t != json.Delim('{') {
|
||||||
|
return errors.New("invalid Scope type")
|
||||||
|
}
|
||||||
|
|
||||||
|
for decoder.More() {
|
||||||
|
keyIface, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, io.EOF) {
|
||||||
|
// Empty.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
key, ok := keyIface.(string)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("invalid Scope field: %#v", keyIface)
|
||||||
|
}
|
||||||
|
|
||||||
|
switch key {
|
||||||
|
case "name":
|
||||||
|
err = decoder.Decode(&s.Name)
|
||||||
|
case "version":
|
||||||
|
err = decoder.Decode(&s.Version)
|
||||||
|
case "attributes":
|
||||||
|
err = decoder.Decode(&s.Attrs)
|
||||||
|
case "droppedAttributesCount", "dropped_attributes_count":
|
||||||
|
err = decoder.Decode(&s.DroppedAttrs)
|
||||||
|
default:
|
||||||
|
// Skip unknown.
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
456
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/span.go
generated
vendored
Normal file
456
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/span.go
generated
vendored
Normal file
@ -0,0 +1,456 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package telemetry
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/hex"
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// A Span represents a single operation performed by a single component of the
|
||||||
|
// system.
|
||||||
|
type Span struct {
|
||||||
|
// A unique identifier for a trace. All spans from the same trace share
|
||||||
|
// the same `trace_id`. The ID is a 16-byte array. An ID with all zeroes OR
|
||||||
|
// of length other than 16 bytes is considered invalid (empty string in OTLP/JSON
|
||||||
|
// is zero-length and thus is also invalid).
|
||||||
|
//
|
||||||
|
// This field is required.
|
||||||
|
TraceID TraceID `json:"traceId,omitempty"`
|
||||||
|
// A unique identifier for a span within a trace, assigned when the span
|
||||||
|
// is created. The ID is an 8-byte array. An ID with all zeroes OR of length
|
||||||
|
// other than 8 bytes is considered invalid (empty string in OTLP/JSON
|
||||||
|
// is zero-length and thus is also invalid).
|
||||||
|
//
|
||||||
|
// This field is required.
|
||||||
|
SpanID SpanID `json:"spanId,omitempty"`
|
||||||
|
// trace_state conveys information about request position in multiple distributed tracing graphs.
|
||||||
|
// It is a trace_state in w3c-trace-context format: https://www.w3.org/TR/trace-context/#tracestate-header
|
||||||
|
// See also https://github.com/w3c/distributed-tracing for more details about this field.
|
||||||
|
TraceState string `json:"traceState,omitempty"`
|
||||||
|
// The `span_id` of this span's parent span. If this is a root span, then this
|
||||||
|
// field must be empty. The ID is an 8-byte array.
|
||||||
|
ParentSpanID SpanID `json:"parentSpanId,omitempty"`
|
||||||
|
// Flags, a bit field.
|
||||||
|
//
|
||||||
|
// Bits 0-7 (8 least significant bits) are the trace flags as defined in W3C Trace
|
||||||
|
// Context specification. To read the 8-bit W3C trace flag, use
|
||||||
|
// `flags & SPAN_FLAGS_TRACE_FLAGS_MASK`.
|
||||||
|
//
|
||||||
|
// See https://www.w3.org/TR/trace-context-2/#trace-flags for the flag definitions.
|
||||||
|
//
|
||||||
|
// Bits 8 and 9 represent the 3 states of whether a span's parent
|
||||||
|
// is remote. The states are (unknown, is not remote, is remote).
|
||||||
|
// To read whether the value is known, use `(flags & SPAN_FLAGS_CONTEXT_HAS_IS_REMOTE_MASK) != 0`.
|
||||||
|
// To read whether the span is remote, use `(flags & SPAN_FLAGS_CONTEXT_IS_REMOTE_MASK) != 0`.
|
||||||
|
//
|
||||||
|
// When creating span messages, if the message is logically forwarded from another source
|
||||||
|
// with an equivalent flags fields (i.e., usually another OTLP span message), the field SHOULD
|
||||||
|
// be copied as-is. If creating from a source that does not have an equivalent flags field
|
||||||
|
// (such as a runtime representation of an OpenTelemetry span), the high 22 bits MUST
|
||||||
|
// be set to zero.
|
||||||
|
// Readers MUST NOT assume that bits 10-31 (22 most significant bits) will be zero.
|
||||||
|
//
|
||||||
|
// [Optional].
|
||||||
|
Flags uint32 `json:"flags,omitempty"`
|
||||||
|
// A description of the span's operation.
|
||||||
|
//
|
||||||
|
// For example, the name can be a qualified method name or a file name
|
||||||
|
// and a line number where the operation is called. A best practice is to use
|
||||||
|
// the same display name at the same call point in an application.
|
||||||
|
// This makes it easier to correlate spans in different traces.
|
||||||
|
//
|
||||||
|
// This field is semantically required to be set to non-empty string.
|
||||||
|
// Empty value is equivalent to an unknown span name.
|
||||||
|
//
|
||||||
|
// This field is required.
|
||||||
|
Name string `json:"name"`
|
||||||
|
// Distinguishes between spans generated in a particular context. For example,
|
||||||
|
// two spans with the same name may be distinguished using `CLIENT` (caller)
|
||||||
|
// and `SERVER` (callee) to identify queueing latency associated with the span.
|
||||||
|
Kind SpanKind `json:"kind,omitempty"`
|
||||||
|
// start_time_unix_nano is the start time of the span. On the client side, this is the time
|
||||||
|
// kept by the local machine where the span execution starts. On the server side, this
|
||||||
|
// is the time when the server's application handler starts running.
|
||||||
|
// Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January 1970.
|
||||||
|
//
|
||||||
|
// This field is semantically required and it is expected that end_time >= start_time.
|
||||||
|
StartTime time.Time `json:"startTimeUnixNano,omitempty"`
|
||||||
|
// end_time_unix_nano is the end time of the span. On the client side, this is the time
|
||||||
|
// kept by the local machine where the span execution ends. On the server side, this
|
||||||
|
// is the time when the server application handler stops running.
|
||||||
|
// Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January 1970.
|
||||||
|
//
|
||||||
|
// This field is semantically required and it is expected that end_time >= start_time.
|
||||||
|
EndTime time.Time `json:"endTimeUnixNano,omitempty"`
|
||||||
|
// attributes is a collection of key/value pairs. Note, global attributes
|
||||||
|
// like server name can be set using the resource API. Examples of attributes:
|
||||||
|
//
|
||||||
|
// "/http/user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
|
||||||
|
// "/http/server_latency": 300
|
||||||
|
// "example.com/myattribute": true
|
||||||
|
// "example.com/score": 10.239
|
||||||
|
//
|
||||||
|
// The OpenTelemetry API specification further restricts the allowed value types:
|
||||||
|
// https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/common/README.md#attribute
|
||||||
|
// Attribute keys MUST be unique (it is not allowed to have more than one
|
||||||
|
// attribute with the same key).
|
||||||
|
Attrs []Attr `json:"attributes,omitempty"`
|
||||||
|
// dropped_attributes_count is the number of attributes that were discarded. Attributes
|
||||||
|
// can be discarded because their keys are too long or because there are too many
|
||||||
|
// attributes. If this value is 0, then no attributes were dropped.
|
||||||
|
DroppedAttrs uint32 `json:"droppedAttributesCount,omitempty"`
|
||||||
|
// events is a collection of Event items.
|
||||||
|
Events []*SpanEvent `json:"events,omitempty"`
|
||||||
|
// dropped_events_count is the number of dropped events. If the value is 0, then no
|
||||||
|
// events were dropped.
|
||||||
|
DroppedEvents uint32 `json:"droppedEventsCount,omitempty"`
|
||||||
|
// links is a collection of Links, which are references from this span to a span
|
||||||
|
// in the same or different trace.
|
||||||
|
Links []*SpanLink `json:"links,omitempty"`
|
||||||
|
// dropped_links_count is the number of dropped links after the maximum size was
|
||||||
|
// enforced. If this value is 0, then no links were dropped.
|
||||||
|
DroppedLinks uint32 `json:"droppedLinksCount,omitempty"`
|
||||||
|
// An optional final status for this span. Semantically when Status isn't set, it means
|
||||||
|
// span's status code is unset, i.e. assume STATUS_CODE_UNSET (code = 0).
|
||||||
|
Status *Status `json:"status,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalJSON encodes s into OTLP formatted JSON.
|
||||||
|
func (s Span) MarshalJSON() ([]byte, error) {
|
||||||
|
startT := s.StartTime.UnixNano()
|
||||||
|
if s.StartTime.IsZero() || startT < 0 {
|
||||||
|
startT = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
endT := s.EndTime.UnixNano()
|
||||||
|
if s.EndTime.IsZero() || endT < 0 {
|
||||||
|
endT = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// Override non-empty default SpanID marshal and omitempty.
|
||||||
|
var parentSpanId string
|
||||||
|
if !s.ParentSpanID.IsEmpty() {
|
||||||
|
b := make([]byte, hex.EncodedLen(spanIDSize))
|
||||||
|
hex.Encode(b, s.ParentSpanID[:])
|
||||||
|
parentSpanId = string(b)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Alias Span
|
||||||
|
return json.Marshal(struct {
|
||||||
|
Alias
|
||||||
|
ParentSpanID string `json:"parentSpanId,omitempty"`
|
||||||
|
StartTime uint64 `json:"startTimeUnixNano,omitempty"`
|
||||||
|
EndTime uint64 `json:"endTimeUnixNano,omitempty"`
|
||||||
|
}{
|
||||||
|
Alias: Alias(s),
|
||||||
|
ParentSpanID: parentSpanId,
|
||||||
|
StartTime: uint64(startT),
|
||||||
|
EndTime: uint64(endT),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON decodes the OTLP formatted JSON contained in data into s.
|
||||||
|
func (s *Span) UnmarshalJSON(data []byte) error {
|
||||||
|
decoder := json.NewDecoder(bytes.NewReader(data))
|
||||||
|
|
||||||
|
t, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if t != json.Delim('{') {
|
||||||
|
return errors.New("invalid Span type")
|
||||||
|
}
|
||||||
|
|
||||||
|
for decoder.More() {
|
||||||
|
keyIface, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, io.EOF) {
|
||||||
|
// Empty.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
key, ok := keyIface.(string)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("invalid Span field: %#v", keyIface)
|
||||||
|
}
|
||||||
|
|
||||||
|
switch key {
|
||||||
|
case "traceId", "trace_id":
|
||||||
|
err = decoder.Decode(&s.TraceID)
|
||||||
|
case "spanId", "span_id":
|
||||||
|
err = decoder.Decode(&s.SpanID)
|
||||||
|
case "traceState", "trace_state":
|
||||||
|
err = decoder.Decode(&s.TraceState)
|
||||||
|
case "parentSpanId", "parent_span_id":
|
||||||
|
err = decoder.Decode(&s.ParentSpanID)
|
||||||
|
case "flags":
|
||||||
|
err = decoder.Decode(&s.Flags)
|
||||||
|
case "name":
|
||||||
|
err = decoder.Decode(&s.Name)
|
||||||
|
case "kind":
|
||||||
|
err = decoder.Decode(&s.Kind)
|
||||||
|
case "startTimeUnixNano", "start_time_unix_nano":
|
||||||
|
var val protoUint64
|
||||||
|
err = decoder.Decode(&val)
|
||||||
|
s.StartTime = time.Unix(0, int64(val.Uint64()))
|
||||||
|
case "endTimeUnixNano", "end_time_unix_nano":
|
||||||
|
var val protoUint64
|
||||||
|
err = decoder.Decode(&val)
|
||||||
|
s.EndTime = time.Unix(0, int64(val.Uint64()))
|
||||||
|
case "attributes":
|
||||||
|
err = decoder.Decode(&s.Attrs)
|
||||||
|
case "droppedAttributesCount", "dropped_attributes_count":
|
||||||
|
err = decoder.Decode(&s.DroppedAttrs)
|
||||||
|
case "events":
|
||||||
|
err = decoder.Decode(&s.Events)
|
||||||
|
case "droppedEventsCount", "dropped_events_count":
|
||||||
|
err = decoder.Decode(&s.DroppedEvents)
|
||||||
|
case "links":
|
||||||
|
err = decoder.Decode(&s.Links)
|
||||||
|
case "droppedLinksCount", "dropped_links_count":
|
||||||
|
err = decoder.Decode(&s.DroppedLinks)
|
||||||
|
case "status":
|
||||||
|
err = decoder.Decode(&s.Status)
|
||||||
|
default:
|
||||||
|
// Skip unknown.
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// SpanFlags represents constants used to interpret the
|
||||||
|
// Span.flags field, which is protobuf 'fixed32' type and is to
|
||||||
|
// be used as bit-fields. Each non-zero value defined in this enum is
|
||||||
|
// a bit-mask. To extract the bit-field, for example, use an
|
||||||
|
// expression like:
|
||||||
|
//
|
||||||
|
// (span.flags & SPAN_FLAGS_TRACE_FLAGS_MASK)
|
||||||
|
//
|
||||||
|
// See https://www.w3.org/TR/trace-context-2/#trace-flags for the flag definitions.
|
||||||
|
//
|
||||||
|
// Note that Span flags were introduced in version 1.1 of the
|
||||||
|
// OpenTelemetry protocol. Older Span producers do not set this
|
||||||
|
// field, consequently consumers should not rely on the absence of a
|
||||||
|
// particular flag bit to indicate the presence of a particular feature.
|
||||||
|
type SpanFlags int32
|
||||||
|
|
||||||
|
const (
|
||||||
|
// Bits 0-7 are used for trace flags.
|
||||||
|
SpanFlagsTraceFlagsMask SpanFlags = 255
|
||||||
|
// Bits 8 and 9 are used to indicate that the parent span or link span is remote.
|
||||||
|
// Bit 8 (`HAS_IS_REMOTE`) indicates whether the value is known.
|
||||||
|
// Bit 9 (`IS_REMOTE`) indicates whether the span or link is remote.
|
||||||
|
SpanFlagsContextHasIsRemoteMask SpanFlags = 256
|
||||||
|
// SpanFlagsContextHasIsRemoteMask indicates the Span is remote.
|
||||||
|
SpanFlagsContextIsRemoteMask SpanFlags = 512
|
||||||
|
)
|
||||||
|
|
||||||
|
// SpanKind is the type of span. Can be used to specify additional relationships between spans
|
||||||
|
// in addition to a parent/child relationship.
|
||||||
|
type SpanKind int32
|
||||||
|
|
||||||
|
const (
|
||||||
|
// Indicates that the span represents an internal operation within an application,
|
||||||
|
// as opposed to an operation happening at the boundaries. Default value.
|
||||||
|
SpanKindInternal SpanKind = 1
|
||||||
|
// Indicates that the span covers server-side handling of an RPC or other
|
||||||
|
// remote network request.
|
||||||
|
SpanKindServer SpanKind = 2
|
||||||
|
// Indicates that the span describes a request to some remote service.
|
||||||
|
SpanKindClient SpanKind = 3
|
||||||
|
// Indicates that the span describes a producer sending a message to a broker.
|
||||||
|
// Unlike CLIENT and SERVER, there is often no direct critical path latency relationship
|
||||||
|
// between producer and consumer spans. A PRODUCER span ends when the message was accepted
|
||||||
|
// by the broker while the logical processing of the message might span a much longer time.
|
||||||
|
SpanKindProducer SpanKind = 4
|
||||||
|
// Indicates that the span describes consumer receiving a message from a broker.
|
||||||
|
// Like the PRODUCER kind, there is often no direct critical path latency relationship
|
||||||
|
// between producer and consumer spans.
|
||||||
|
SpanKindConsumer SpanKind = 5
|
||||||
|
)
|
||||||
|
|
||||||
|
// Event is a time-stamped annotation of the span, consisting of user-supplied
|
||||||
|
// text description and key-value pairs.
|
||||||
|
type SpanEvent struct {
|
||||||
|
// time_unix_nano is the time the event occurred.
|
||||||
|
Time time.Time `json:"timeUnixNano,omitempty"`
|
||||||
|
// name of the event.
|
||||||
|
// This field is semantically required to be set to non-empty string.
|
||||||
|
Name string `json:"name,omitempty"`
|
||||||
|
// attributes is a collection of attribute key/value pairs on the event.
|
||||||
|
// Attribute keys MUST be unique (it is not allowed to have more than one
|
||||||
|
// attribute with the same key).
|
||||||
|
Attrs []Attr `json:"attributes,omitempty"`
|
||||||
|
// dropped_attributes_count is the number of dropped attributes. If the value is 0,
|
||||||
|
// then no attributes were dropped.
|
||||||
|
DroppedAttrs uint32 `json:"droppedAttributesCount,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalJSON encodes e into OTLP formatted JSON.
|
||||||
|
func (e SpanEvent) MarshalJSON() ([]byte, error) {
|
||||||
|
t := e.Time.UnixNano()
|
||||||
|
if e.Time.IsZero() || t < 0 {
|
||||||
|
t = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
type Alias SpanEvent
|
||||||
|
return json.Marshal(struct {
|
||||||
|
Alias
|
||||||
|
Time uint64 `json:"timeUnixNano,omitempty"`
|
||||||
|
}{
|
||||||
|
Alias: Alias(e),
|
||||||
|
Time: uint64(t),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON decodes the OTLP formatted JSON contained in data into se.
|
||||||
|
func (se *SpanEvent) UnmarshalJSON(data []byte) error {
|
||||||
|
decoder := json.NewDecoder(bytes.NewReader(data))
|
||||||
|
|
||||||
|
t, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if t != json.Delim('{') {
|
||||||
|
return errors.New("invalid SpanEvent type")
|
||||||
|
}
|
||||||
|
|
||||||
|
for decoder.More() {
|
||||||
|
keyIface, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, io.EOF) {
|
||||||
|
// Empty.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
key, ok := keyIface.(string)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("invalid SpanEvent field: %#v", keyIface)
|
||||||
|
}
|
||||||
|
|
||||||
|
switch key {
|
||||||
|
case "timeUnixNano", "time_unix_nano":
|
||||||
|
var val protoUint64
|
||||||
|
err = decoder.Decode(&val)
|
||||||
|
se.Time = time.Unix(0, int64(val.Uint64()))
|
||||||
|
case "name":
|
||||||
|
err = decoder.Decode(&se.Name)
|
||||||
|
case "attributes":
|
||||||
|
err = decoder.Decode(&se.Attrs)
|
||||||
|
case "droppedAttributesCount", "dropped_attributes_count":
|
||||||
|
err = decoder.Decode(&se.DroppedAttrs)
|
||||||
|
default:
|
||||||
|
// Skip unknown.
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// A pointer from the current span to another span in the same trace or in a
|
||||||
|
// different trace. For example, this can be used in batching operations,
|
||||||
|
// where a single batch handler processes multiple requests from different
|
||||||
|
// traces or when the handler receives a request from a different project.
|
||||||
|
type SpanLink struct {
|
||||||
|
// A unique identifier of a trace that this linked span is part of. The ID is a
|
||||||
|
// 16-byte array.
|
||||||
|
TraceID TraceID `json:"traceId,omitempty"`
|
||||||
|
// A unique identifier for the linked span. The ID is an 8-byte array.
|
||||||
|
SpanID SpanID `json:"spanId,omitempty"`
|
||||||
|
// The trace_state associated with the link.
|
||||||
|
TraceState string `json:"traceState,omitempty"`
|
||||||
|
// attributes is a collection of attribute key/value pairs on the link.
|
||||||
|
// Attribute keys MUST be unique (it is not allowed to have more than one
|
||||||
|
// attribute with the same key).
|
||||||
|
Attrs []Attr `json:"attributes,omitempty"`
|
||||||
|
// dropped_attributes_count is the number of dropped attributes. If the value is 0,
|
||||||
|
// then no attributes were dropped.
|
||||||
|
DroppedAttrs uint32 `json:"droppedAttributesCount,omitempty"`
|
||||||
|
// Flags, a bit field.
|
||||||
|
//
|
||||||
|
// Bits 0-7 (8 least significant bits) are the trace flags as defined in W3C Trace
|
||||||
|
// Context specification. To read the 8-bit W3C trace flag, use
|
||||||
|
// `flags & SPAN_FLAGS_TRACE_FLAGS_MASK`.
|
||||||
|
//
|
||||||
|
// See https://www.w3.org/TR/trace-context-2/#trace-flags for the flag definitions.
|
||||||
|
//
|
||||||
|
// Bits 8 and 9 represent the 3 states of whether the link is remote.
|
||||||
|
// The states are (unknown, is not remote, is remote).
|
||||||
|
// To read whether the value is known, use `(flags & SPAN_FLAGS_CONTEXT_HAS_IS_REMOTE_MASK) != 0`.
|
||||||
|
// To read whether the link is remote, use `(flags & SPAN_FLAGS_CONTEXT_IS_REMOTE_MASK) != 0`.
|
||||||
|
//
|
||||||
|
// Readers MUST NOT assume that bits 10-31 (22 most significant bits) will be zero.
|
||||||
|
// When creating new spans, bits 10-31 (most-significant 22-bits) MUST be zero.
|
||||||
|
//
|
||||||
|
// [Optional].
|
||||||
|
Flags uint32 `json:"flags,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON decodes the OTLP formatted JSON contained in data into sl.
|
||||||
|
func (sl *SpanLink) UnmarshalJSON(data []byte) error {
|
||||||
|
decoder := json.NewDecoder(bytes.NewReader(data))
|
||||||
|
|
||||||
|
t, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if t != json.Delim('{') {
|
||||||
|
return errors.New("invalid SpanLink type")
|
||||||
|
}
|
||||||
|
|
||||||
|
for decoder.More() {
|
||||||
|
keyIface, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, io.EOF) {
|
||||||
|
// Empty.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
key, ok := keyIface.(string)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("invalid SpanLink field: %#v", keyIface)
|
||||||
|
}
|
||||||
|
|
||||||
|
switch key {
|
||||||
|
case "traceId", "trace_id":
|
||||||
|
err = decoder.Decode(&sl.TraceID)
|
||||||
|
case "spanId", "span_id":
|
||||||
|
err = decoder.Decode(&sl.SpanID)
|
||||||
|
case "traceState", "trace_state":
|
||||||
|
err = decoder.Decode(&sl.TraceState)
|
||||||
|
case "attributes":
|
||||||
|
err = decoder.Decode(&sl.Attrs)
|
||||||
|
case "droppedAttributesCount", "dropped_attributes_count":
|
||||||
|
err = decoder.Decode(&sl.DroppedAttrs)
|
||||||
|
case "flags":
|
||||||
|
err = decoder.Decode(&sl.Flags)
|
||||||
|
default:
|
||||||
|
// Skip unknown.
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
40
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/status.go
generated
vendored
Normal file
40
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/status.go
generated
vendored
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package telemetry
|
||||||
|
|
||||||
|
// For the semantics of status codes see
|
||||||
|
// https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/api.md#set-status
|
||||||
|
type StatusCode int32
|
||||||
|
|
||||||
|
const (
|
||||||
|
// The default status.
|
||||||
|
StatusCodeUnset StatusCode = 0
|
||||||
|
// The Span has been validated by an Application developer or Operator to
|
||||||
|
// have completed successfully.
|
||||||
|
StatusCodeOK StatusCode = 1
|
||||||
|
// The Span contains an error.
|
||||||
|
StatusCodeError StatusCode = 2
|
||||||
|
)
|
||||||
|
|
||||||
|
var statusCodeStrings = []string{
|
||||||
|
"Unset",
|
||||||
|
"OK",
|
||||||
|
"Error",
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s StatusCode) String() string {
|
||||||
|
if s >= 0 && int(s) < len(statusCodeStrings) {
|
||||||
|
return statusCodeStrings[s]
|
||||||
|
}
|
||||||
|
return "<unknown telemetry.StatusCode>"
|
||||||
|
}
|
||||||
|
|
||||||
|
// The Status type defines a logical error model that is suitable for different
|
||||||
|
// programming environments, including REST APIs and RPC APIs.
|
||||||
|
type Status struct {
|
||||||
|
// A developer-facing human readable error message.
|
||||||
|
Message string `json:"message,omitempty"`
|
||||||
|
// The status code.
|
||||||
|
Code StatusCode `json:"code,omitempty"`
|
||||||
|
}
|
189
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/traces.go
generated
vendored
Normal file
189
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/traces.go
generated
vendored
Normal file
@ -0,0 +1,189 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package telemetry
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Traces represents the traces data that can be stored in a persistent storage,
|
||||||
|
// OR can be embedded by other protocols that transfer OTLP traces data but do
|
||||||
|
// not implement the OTLP protocol.
|
||||||
|
//
|
||||||
|
// The main difference between this message and collector protocol is that
|
||||||
|
// in this message there will not be any "control" or "metadata" specific to
|
||||||
|
// OTLP protocol.
|
||||||
|
//
|
||||||
|
// When new fields are added into this message, the OTLP request MUST be updated
|
||||||
|
// as well.
|
||||||
|
type Traces struct {
|
||||||
|
// An array of ResourceSpans.
|
||||||
|
// For data coming from a single resource this array will typically contain
|
||||||
|
// one element. Intermediary nodes that receive data from multiple origins
|
||||||
|
// typically batch the data before forwarding further and in that case this
|
||||||
|
// array will contain multiple elements.
|
||||||
|
ResourceSpans []*ResourceSpans `json:"resourceSpans,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON decodes the OTLP formatted JSON contained in data into td.
|
||||||
|
func (td *Traces) UnmarshalJSON(data []byte) error {
|
||||||
|
decoder := json.NewDecoder(bytes.NewReader(data))
|
||||||
|
|
||||||
|
t, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if t != json.Delim('{') {
|
||||||
|
return errors.New("invalid TracesData type")
|
||||||
|
}
|
||||||
|
|
||||||
|
for decoder.More() {
|
||||||
|
keyIface, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, io.EOF) {
|
||||||
|
// Empty.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
key, ok := keyIface.(string)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("invalid TracesData field: %#v", keyIface)
|
||||||
|
}
|
||||||
|
|
||||||
|
switch key {
|
||||||
|
case "resourceSpans", "resource_spans":
|
||||||
|
err = decoder.Decode(&td.ResourceSpans)
|
||||||
|
default:
|
||||||
|
// Skip unknown.
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// A collection of ScopeSpans from a Resource.
|
||||||
|
type ResourceSpans struct {
|
||||||
|
// The resource for the spans in this message.
|
||||||
|
// If this field is not set then no resource info is known.
|
||||||
|
Resource Resource `json:"resource"`
|
||||||
|
// A list of ScopeSpans that originate from a resource.
|
||||||
|
ScopeSpans []*ScopeSpans `json:"scopeSpans,omitempty"`
|
||||||
|
// This schema_url applies to the data in the "resource" field. It does not apply
|
||||||
|
// to the data in the "scope_spans" field which have their own schema_url field.
|
||||||
|
SchemaURL string `json:"schemaUrl,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON decodes the OTLP formatted JSON contained in data into rs.
|
||||||
|
func (rs *ResourceSpans) UnmarshalJSON(data []byte) error {
|
||||||
|
decoder := json.NewDecoder(bytes.NewReader(data))
|
||||||
|
|
||||||
|
t, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if t != json.Delim('{') {
|
||||||
|
return errors.New("invalid ResourceSpans type")
|
||||||
|
}
|
||||||
|
|
||||||
|
for decoder.More() {
|
||||||
|
keyIface, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, io.EOF) {
|
||||||
|
// Empty.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
key, ok := keyIface.(string)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("invalid ResourceSpans field: %#v", keyIface)
|
||||||
|
}
|
||||||
|
|
||||||
|
switch key {
|
||||||
|
case "resource":
|
||||||
|
err = decoder.Decode(&rs.Resource)
|
||||||
|
case "scopeSpans", "scope_spans":
|
||||||
|
err = decoder.Decode(&rs.ScopeSpans)
|
||||||
|
case "schemaUrl", "schema_url":
|
||||||
|
err = decoder.Decode(&rs.SchemaURL)
|
||||||
|
default:
|
||||||
|
// Skip unknown.
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// A collection of Spans produced by an InstrumentationScope.
|
||||||
|
type ScopeSpans struct {
|
||||||
|
// The instrumentation scope information for the spans in this message.
|
||||||
|
// Semantically when InstrumentationScope isn't set, it is equivalent with
|
||||||
|
// an empty instrumentation scope name (unknown).
|
||||||
|
Scope *Scope `json:"scope"`
|
||||||
|
// A list of Spans that originate from an instrumentation scope.
|
||||||
|
Spans []*Span `json:"spans,omitempty"`
|
||||||
|
// The Schema URL, if known. This is the identifier of the Schema that the span data
|
||||||
|
// is recorded in. To learn more about Schema URL see
|
||||||
|
// https://opentelemetry.io/docs/specs/otel/schemas/#schema-url
|
||||||
|
// This schema_url applies to all spans and span events in the "spans" field.
|
||||||
|
SchemaURL string `json:"schemaUrl,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON decodes the OTLP formatted JSON contained in data into ss.
|
||||||
|
func (ss *ScopeSpans) UnmarshalJSON(data []byte) error {
|
||||||
|
decoder := json.NewDecoder(bytes.NewReader(data))
|
||||||
|
|
||||||
|
t, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if t != json.Delim('{') {
|
||||||
|
return errors.New("invalid ScopeSpans type")
|
||||||
|
}
|
||||||
|
|
||||||
|
for decoder.More() {
|
||||||
|
keyIface, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, io.EOF) {
|
||||||
|
// Empty.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
key, ok := keyIface.(string)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("invalid ScopeSpans field: %#v", keyIface)
|
||||||
|
}
|
||||||
|
|
||||||
|
switch key {
|
||||||
|
case "scope":
|
||||||
|
err = decoder.Decode(&ss.Scope)
|
||||||
|
case "spans":
|
||||||
|
err = decoder.Decode(&ss.Spans)
|
||||||
|
case "schemaUrl", "schema_url":
|
||||||
|
err = decoder.Decode(&ss.SchemaURL)
|
||||||
|
default:
|
||||||
|
// Skip unknown.
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
452
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/value.go
generated
vendored
Normal file
452
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/value.go
generated
vendored
Normal file
@ -0,0 +1,452 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
//go:generate stringer -type=ValueKind -trimprefix=ValueKind
|
||||||
|
|
||||||
|
package telemetry
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"cmp"
|
||||||
|
"encoding/base64"
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"math"
|
||||||
|
"slices"
|
||||||
|
"strconv"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
// A Value represents a structured value.
|
||||||
|
// A zero value is valid and represents an empty value.
|
||||||
|
type Value struct {
|
||||||
|
// Ensure forward compatibility by explicitly making this not comparable.
|
||||||
|
noCmp [0]func() //nolint: unused // This is indeed used.
|
||||||
|
|
||||||
|
// num holds the value for Int64, Float64, and Bool. It holds the length
|
||||||
|
// for String, Bytes, Slice, Map.
|
||||||
|
num uint64
|
||||||
|
// any holds either the KindBool, KindInt64, KindFloat64, stringptr,
|
||||||
|
// bytesptr, sliceptr, or mapptr. If KindBool, KindInt64, or KindFloat64
|
||||||
|
// then the value of Value is in num as described above. Otherwise, it
|
||||||
|
// contains the value wrapped in the appropriate type.
|
||||||
|
any any
|
||||||
|
}
|
||||||
|
|
||||||
|
type (
|
||||||
|
// sliceptr represents a value in Value.any for KindString Values.
|
||||||
|
stringptr *byte
|
||||||
|
// bytesptr represents a value in Value.any for KindBytes Values.
|
||||||
|
bytesptr *byte
|
||||||
|
// sliceptr represents a value in Value.any for KindSlice Values.
|
||||||
|
sliceptr *Value
|
||||||
|
// mapptr represents a value in Value.any for KindMap Values.
|
||||||
|
mapptr *Attr
|
||||||
|
)
|
||||||
|
|
||||||
|
// ValueKind is the kind of a [Value].
|
||||||
|
type ValueKind int
|
||||||
|
|
||||||
|
// ValueKind values.
|
||||||
|
const (
|
||||||
|
ValueKindEmpty ValueKind = iota
|
||||||
|
ValueKindBool
|
||||||
|
ValueKindFloat64
|
||||||
|
ValueKindInt64
|
||||||
|
ValueKindString
|
||||||
|
ValueKindBytes
|
||||||
|
ValueKindSlice
|
||||||
|
ValueKindMap
|
||||||
|
)
|
||||||
|
|
||||||
|
var valueKindStrings = []string{
|
||||||
|
"Empty",
|
||||||
|
"Bool",
|
||||||
|
"Float64",
|
||||||
|
"Int64",
|
||||||
|
"String",
|
||||||
|
"Bytes",
|
||||||
|
"Slice",
|
||||||
|
"Map",
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k ValueKind) String() string {
|
||||||
|
if k >= 0 && int(k) < len(valueKindStrings) {
|
||||||
|
return valueKindStrings[k]
|
||||||
|
}
|
||||||
|
return "<unknown telemetry.ValueKind>"
|
||||||
|
}
|
||||||
|
|
||||||
|
// StringValue returns a new [Value] for a string.
|
||||||
|
func StringValue(v string) Value {
|
||||||
|
return Value{
|
||||||
|
num: uint64(len(v)),
|
||||||
|
any: stringptr(unsafe.StringData(v)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// IntValue returns a [Value] for an int.
|
||||||
|
func IntValue(v int) Value { return Int64Value(int64(v)) }
|
||||||
|
|
||||||
|
// Int64Value returns a [Value] for an int64.
|
||||||
|
func Int64Value(v int64) Value {
|
||||||
|
return Value{num: uint64(v), any: ValueKindInt64}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64Value returns a [Value] for a float64.
|
||||||
|
func Float64Value(v float64) Value {
|
||||||
|
return Value{num: math.Float64bits(v), any: ValueKindFloat64}
|
||||||
|
}
|
||||||
|
|
||||||
|
// BoolValue returns a [Value] for a bool.
|
||||||
|
func BoolValue(v bool) Value { //nolint:revive // Not a control flag.
|
||||||
|
var n uint64
|
||||||
|
if v {
|
||||||
|
n = 1
|
||||||
|
}
|
||||||
|
return Value{num: n, any: ValueKindBool}
|
||||||
|
}
|
||||||
|
|
||||||
|
// BytesValue returns a [Value] for a byte slice. The passed slice must not be
|
||||||
|
// changed after it is passed.
|
||||||
|
func BytesValue(v []byte) Value {
|
||||||
|
return Value{
|
||||||
|
num: uint64(len(v)),
|
||||||
|
any: bytesptr(unsafe.SliceData(v)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// SliceValue returns a [Value] for a slice of [Value]. The passed slice must
|
||||||
|
// not be changed after it is passed.
|
||||||
|
func SliceValue(vs ...Value) Value {
|
||||||
|
return Value{
|
||||||
|
num: uint64(len(vs)),
|
||||||
|
any: sliceptr(unsafe.SliceData(vs)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MapValue returns a new [Value] for a slice of key-value pairs. The passed
|
||||||
|
// slice must not be changed after it is passed.
|
||||||
|
func MapValue(kvs ...Attr) Value {
|
||||||
|
return Value{
|
||||||
|
num: uint64(len(kvs)),
|
||||||
|
any: mapptr(unsafe.SliceData(kvs)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// AsString returns the value held by v as a string.
|
||||||
|
func (v Value) AsString() string {
|
||||||
|
if sp, ok := v.any.(stringptr); ok {
|
||||||
|
return unsafe.String(sp, v.num)
|
||||||
|
}
|
||||||
|
// TODO: error handle
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// asString returns the value held by v as a string. It will panic if the Value
|
||||||
|
// is not KindString.
|
||||||
|
func (v Value) asString() string {
|
||||||
|
return unsafe.String(v.any.(stringptr), v.num)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AsInt64 returns the value held by v as an int64.
|
||||||
|
func (v Value) AsInt64() int64 {
|
||||||
|
if v.Kind() != ValueKindInt64 {
|
||||||
|
// TODO: error handle
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return v.asInt64()
|
||||||
|
}
|
||||||
|
|
||||||
|
// asInt64 returns the value held by v as an int64. If v is not of KindInt64,
|
||||||
|
// this will return garbage.
|
||||||
|
func (v Value) asInt64() int64 {
|
||||||
|
// Assumes v.num was a valid int64 (overflow not checked).
|
||||||
|
return int64(v.num) // nolint: gosec
|
||||||
|
}
|
||||||
|
|
||||||
|
// AsBool returns the value held by v as a bool.
|
||||||
|
func (v Value) AsBool() bool {
|
||||||
|
if v.Kind() != ValueKindBool {
|
||||||
|
// TODO: error handle
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return v.asBool()
|
||||||
|
}
|
||||||
|
|
||||||
|
// asBool returns the value held by v as a bool. If v is not of KindBool, this
|
||||||
|
// will return garbage.
|
||||||
|
func (v Value) asBool() bool { return v.num == 1 }
|
||||||
|
|
||||||
|
// AsFloat64 returns the value held by v as a float64.
|
||||||
|
func (v Value) AsFloat64() float64 {
|
||||||
|
if v.Kind() != ValueKindFloat64 {
|
||||||
|
// TODO: error handle
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return v.asFloat64()
|
||||||
|
}
|
||||||
|
|
||||||
|
// asFloat64 returns the value held by v as a float64. If v is not of
|
||||||
|
// KindFloat64, this will return garbage.
|
||||||
|
func (v Value) asFloat64() float64 { return math.Float64frombits(v.num) }
|
||||||
|
|
||||||
|
// AsBytes returns the value held by v as a []byte.
|
||||||
|
func (v Value) AsBytes() []byte {
|
||||||
|
if sp, ok := v.any.(bytesptr); ok {
|
||||||
|
return unsafe.Slice((*byte)(sp), v.num)
|
||||||
|
}
|
||||||
|
// TODO: error handle
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// asBytes returns the value held by v as a []byte. It will panic if the Value
|
||||||
|
// is not KindBytes.
|
||||||
|
func (v Value) asBytes() []byte {
|
||||||
|
return unsafe.Slice((*byte)(v.any.(bytesptr)), v.num)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AsSlice returns the value held by v as a []Value.
|
||||||
|
func (v Value) AsSlice() []Value {
|
||||||
|
if sp, ok := v.any.(sliceptr); ok {
|
||||||
|
return unsafe.Slice((*Value)(sp), v.num)
|
||||||
|
}
|
||||||
|
// TODO: error handle
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// asSlice returns the value held by v as a []Value. It will panic if the Value
|
||||||
|
// is not KindSlice.
|
||||||
|
func (v Value) asSlice() []Value {
|
||||||
|
return unsafe.Slice((*Value)(v.any.(sliceptr)), v.num)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AsMap returns the value held by v as a []Attr.
|
||||||
|
func (v Value) AsMap() []Attr {
|
||||||
|
if sp, ok := v.any.(mapptr); ok {
|
||||||
|
return unsafe.Slice((*Attr)(sp), v.num)
|
||||||
|
}
|
||||||
|
// TODO: error handle
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// asMap returns the value held by v as a []Attr. It will panic if the
|
||||||
|
// Value is not KindMap.
|
||||||
|
func (v Value) asMap() []Attr {
|
||||||
|
return unsafe.Slice((*Attr)(v.any.(mapptr)), v.num)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Kind returns the Kind of v.
|
||||||
|
func (v Value) Kind() ValueKind {
|
||||||
|
switch x := v.any.(type) {
|
||||||
|
case ValueKind:
|
||||||
|
return x
|
||||||
|
case stringptr:
|
||||||
|
return ValueKindString
|
||||||
|
case bytesptr:
|
||||||
|
return ValueKindBytes
|
||||||
|
case sliceptr:
|
||||||
|
return ValueKindSlice
|
||||||
|
case mapptr:
|
||||||
|
return ValueKindMap
|
||||||
|
default:
|
||||||
|
return ValueKindEmpty
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Empty returns if v does not hold any value.
|
||||||
|
func (v Value) Empty() bool { return v.Kind() == ValueKindEmpty }
|
||||||
|
|
||||||
|
// Equal returns if v is equal to w.
|
||||||
|
func (v Value) Equal(w Value) bool {
|
||||||
|
k1 := v.Kind()
|
||||||
|
k2 := w.Kind()
|
||||||
|
if k1 != k2 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
switch k1 {
|
||||||
|
case ValueKindInt64, ValueKindBool:
|
||||||
|
return v.num == w.num
|
||||||
|
case ValueKindString:
|
||||||
|
return v.asString() == w.asString()
|
||||||
|
case ValueKindFloat64:
|
||||||
|
return v.asFloat64() == w.asFloat64()
|
||||||
|
case ValueKindSlice:
|
||||||
|
return slices.EqualFunc(v.asSlice(), w.asSlice(), Value.Equal)
|
||||||
|
case ValueKindMap:
|
||||||
|
sv := sortMap(v.asMap())
|
||||||
|
sw := sortMap(w.asMap())
|
||||||
|
return slices.EqualFunc(sv, sw, Attr.Equal)
|
||||||
|
case ValueKindBytes:
|
||||||
|
return bytes.Equal(v.asBytes(), w.asBytes())
|
||||||
|
case ValueKindEmpty:
|
||||||
|
return true
|
||||||
|
default:
|
||||||
|
// TODO: error handle
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func sortMap(m []Attr) []Attr {
|
||||||
|
sm := make([]Attr, len(m))
|
||||||
|
copy(sm, m)
|
||||||
|
slices.SortFunc(sm, func(a, b Attr) int {
|
||||||
|
return cmp.Compare(a.Key, b.Key)
|
||||||
|
})
|
||||||
|
|
||||||
|
return sm
|
||||||
|
}
|
||||||
|
|
||||||
|
// String returns Value's value as a string, formatted like [fmt.Sprint].
|
||||||
|
//
|
||||||
|
// The returned string is meant for debugging;
|
||||||
|
// the string representation is not stable.
|
||||||
|
func (v Value) String() string {
|
||||||
|
switch v.Kind() {
|
||||||
|
case ValueKindString:
|
||||||
|
return v.asString()
|
||||||
|
case ValueKindInt64:
|
||||||
|
// Assumes v.num was a valid int64 (overflow not checked).
|
||||||
|
return strconv.FormatInt(int64(v.num), 10) // nolint: gosec
|
||||||
|
case ValueKindFloat64:
|
||||||
|
return strconv.FormatFloat(v.asFloat64(), 'g', -1, 64)
|
||||||
|
case ValueKindBool:
|
||||||
|
return strconv.FormatBool(v.asBool())
|
||||||
|
case ValueKindBytes:
|
||||||
|
return fmt.Sprint(v.asBytes())
|
||||||
|
case ValueKindMap:
|
||||||
|
return fmt.Sprint(v.asMap())
|
||||||
|
case ValueKindSlice:
|
||||||
|
return fmt.Sprint(v.asSlice())
|
||||||
|
case ValueKindEmpty:
|
||||||
|
return "<nil>"
|
||||||
|
default:
|
||||||
|
// Try to handle this as gracefully as possible.
|
||||||
|
//
|
||||||
|
// Don't panic here. The goal here is to have developers find this
|
||||||
|
// first if a slog.Kind is is not handled. It is
|
||||||
|
// preferable to have user's open issue asking why their attributes
|
||||||
|
// have a "unhandled: " prefix than say that their code is panicking.
|
||||||
|
return fmt.Sprintf("<unhandled telemetry.ValueKind: %s>", v.Kind())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalJSON encodes v into OTLP formatted JSON.
|
||||||
|
func (v *Value) MarshalJSON() ([]byte, error) {
|
||||||
|
switch v.Kind() {
|
||||||
|
case ValueKindString:
|
||||||
|
return json.Marshal(struct {
|
||||||
|
Value string `json:"stringValue"`
|
||||||
|
}{v.asString()})
|
||||||
|
case ValueKindInt64:
|
||||||
|
return json.Marshal(struct {
|
||||||
|
Value string `json:"intValue"`
|
||||||
|
}{strconv.FormatInt(int64(v.num), 10)})
|
||||||
|
case ValueKindFloat64:
|
||||||
|
return json.Marshal(struct {
|
||||||
|
Value float64 `json:"doubleValue"`
|
||||||
|
}{v.asFloat64()})
|
||||||
|
case ValueKindBool:
|
||||||
|
return json.Marshal(struct {
|
||||||
|
Value bool `json:"boolValue"`
|
||||||
|
}{v.asBool()})
|
||||||
|
case ValueKindBytes:
|
||||||
|
return json.Marshal(struct {
|
||||||
|
Value []byte `json:"bytesValue"`
|
||||||
|
}{v.asBytes()})
|
||||||
|
case ValueKindMap:
|
||||||
|
return json.Marshal(struct {
|
||||||
|
Value struct {
|
||||||
|
Values []Attr `json:"values"`
|
||||||
|
} `json:"kvlistValue"`
|
||||||
|
}{struct {
|
||||||
|
Values []Attr `json:"values"`
|
||||||
|
}{v.asMap()}})
|
||||||
|
case ValueKindSlice:
|
||||||
|
return json.Marshal(struct {
|
||||||
|
Value struct {
|
||||||
|
Values []Value `json:"values"`
|
||||||
|
} `json:"arrayValue"`
|
||||||
|
}{struct {
|
||||||
|
Values []Value `json:"values"`
|
||||||
|
}{v.asSlice()}})
|
||||||
|
case ValueKindEmpty:
|
||||||
|
return nil, nil
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("unknown Value kind: %s", v.Kind().String())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON decodes the OTLP formatted JSON contained in data into v.
|
||||||
|
func (v *Value) UnmarshalJSON(data []byte) error {
|
||||||
|
decoder := json.NewDecoder(bytes.NewReader(data))
|
||||||
|
|
||||||
|
t, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if t != json.Delim('{') {
|
||||||
|
return errors.New("invalid Value type")
|
||||||
|
}
|
||||||
|
|
||||||
|
for decoder.More() {
|
||||||
|
keyIface, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, io.EOF) {
|
||||||
|
// Empty.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
key, ok := keyIface.(string)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("invalid Value key: %#v", keyIface)
|
||||||
|
}
|
||||||
|
|
||||||
|
switch key {
|
||||||
|
case "stringValue", "string_value":
|
||||||
|
var val string
|
||||||
|
err = decoder.Decode(&val)
|
||||||
|
*v = StringValue(val)
|
||||||
|
case "boolValue", "bool_value":
|
||||||
|
var val bool
|
||||||
|
err = decoder.Decode(&val)
|
||||||
|
*v = BoolValue(val)
|
||||||
|
case "intValue", "int_value":
|
||||||
|
var val protoInt64
|
||||||
|
err = decoder.Decode(&val)
|
||||||
|
*v = Int64Value(val.Int64())
|
||||||
|
case "doubleValue", "double_value":
|
||||||
|
var val float64
|
||||||
|
err = decoder.Decode(&val)
|
||||||
|
*v = Float64Value(val)
|
||||||
|
case "bytesValue", "bytes_value":
|
||||||
|
var val64 string
|
||||||
|
if err := decoder.Decode(&val64); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var val []byte
|
||||||
|
val, err = base64.StdEncoding.DecodeString(val64)
|
||||||
|
*v = BytesValue(val)
|
||||||
|
case "arrayValue", "array_value":
|
||||||
|
var val struct{ Values []Value }
|
||||||
|
err = decoder.Decode(&val)
|
||||||
|
*v = SliceValue(val.Values...)
|
||||||
|
case "kvlistValue", "kvlist_value":
|
||||||
|
var val struct{ Values []Attr }
|
||||||
|
err = decoder.Decode(&val)
|
||||||
|
*v = MapValue(val.Values...)
|
||||||
|
default:
|
||||||
|
// Skip unknown.
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// Use first valid. Ignore the rest.
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only unknown fields. Return nil without unmarshaling any value.
|
||||||
|
return nil
|
||||||
|
}
|
94
vendor/go.opentelemetry.io/auto/sdk/limit.go
generated
vendored
Normal file
94
vendor/go.opentelemetry.io/auto/sdk/limit.go
generated
vendored
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package sdk
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log/slog"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
)
|
||||||
|
|
||||||
|
// maxSpan are the span limits resolved during startup.
|
||||||
|
var maxSpan = newSpanLimits()
|
||||||
|
|
||||||
|
type spanLimits struct {
|
||||||
|
// Attrs is the number of allowed attributes for a span.
|
||||||
|
//
|
||||||
|
// This is resolved from the environment variable value for the
|
||||||
|
// OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT key if it exists. Otherwise, the
|
||||||
|
// environment variable value for OTEL_ATTRIBUTE_COUNT_LIMIT, or 128 if
|
||||||
|
// that is not set, is used.
|
||||||
|
Attrs int
|
||||||
|
// AttrValueLen is the maximum attribute value length allowed for a span.
|
||||||
|
//
|
||||||
|
// This is resolved from the environment variable value for the
|
||||||
|
// OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT key if it exists. Otherwise, the
|
||||||
|
// environment variable value for OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT, or -1
|
||||||
|
// if that is not set, is used.
|
||||||
|
AttrValueLen int
|
||||||
|
// Events is the number of allowed events for a span.
|
||||||
|
//
|
||||||
|
// This is resolved from the environment variable value for the
|
||||||
|
// OTEL_SPAN_EVENT_COUNT_LIMIT key, or 128 is used if that is not set.
|
||||||
|
Events int
|
||||||
|
// EventAttrs is the number of allowed attributes for a span event.
|
||||||
|
//
|
||||||
|
// The is resolved from the environment variable value for the
|
||||||
|
// OTEL_EVENT_ATTRIBUTE_COUNT_LIMIT key, or 128 is used if that is not set.
|
||||||
|
EventAttrs int
|
||||||
|
// Links is the number of allowed Links for a span.
|
||||||
|
//
|
||||||
|
// This is resolved from the environment variable value for the
|
||||||
|
// OTEL_SPAN_LINK_COUNT_LIMIT, or 128 is used if that is not set.
|
||||||
|
Links int
|
||||||
|
// LinkAttrs is the number of allowed attributes for a span link.
|
||||||
|
//
|
||||||
|
// This is resolved from the environment variable value for the
|
||||||
|
// OTEL_LINK_ATTRIBUTE_COUNT_LIMIT, or 128 is used if that is not set.
|
||||||
|
LinkAttrs int
|
||||||
|
}
|
||||||
|
|
||||||
|
func newSpanLimits() spanLimits {
|
||||||
|
return spanLimits{
|
||||||
|
Attrs: firstEnv(
|
||||||
|
128,
|
||||||
|
"OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT",
|
||||||
|
"OTEL_ATTRIBUTE_COUNT_LIMIT",
|
||||||
|
),
|
||||||
|
AttrValueLen: firstEnv(
|
||||||
|
-1, // Unlimited.
|
||||||
|
"OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT",
|
||||||
|
"OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT",
|
||||||
|
),
|
||||||
|
Events: firstEnv(128, "OTEL_SPAN_EVENT_COUNT_LIMIT"),
|
||||||
|
EventAttrs: firstEnv(128, "OTEL_EVENT_ATTRIBUTE_COUNT_LIMIT"),
|
||||||
|
Links: firstEnv(128, "OTEL_SPAN_LINK_COUNT_LIMIT"),
|
||||||
|
LinkAttrs: firstEnv(128, "OTEL_LINK_ATTRIBUTE_COUNT_LIMIT"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// firstEnv returns the parsed integer value of the first matching environment
|
||||||
|
// variable from keys. The defaultVal is returned if the value is not an
|
||||||
|
// integer or no match is found.
|
||||||
|
func firstEnv(defaultVal int, keys ...string) int {
|
||||||
|
for _, key := range keys {
|
||||||
|
strV := os.Getenv(key)
|
||||||
|
if strV == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
v, err := strconv.Atoi(strV)
|
||||||
|
if err == nil {
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
slog.Warn(
|
||||||
|
"invalid limit environment variable",
|
||||||
|
"error", err,
|
||||||
|
"key", key,
|
||||||
|
"value", strV,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return defaultVal
|
||||||
|
}
|
432
vendor/go.opentelemetry.io/auto/sdk/span.go
generated
vendored
Normal file
432
vendor/go.opentelemetry.io/auto/sdk/span.go
generated
vendored
Normal file
@ -0,0 +1,432 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package sdk
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"reflect"
|
||||||
|
"runtime"
|
||||||
|
"strings"
|
||||||
|
"sync"
|
||||||
|
"sync/atomic"
|
||||||
|
"time"
|
||||||
|
"unicode/utf8"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/attribute"
|
||||||
|
"go.opentelemetry.io/otel/codes"
|
||||||
|
semconv "go.opentelemetry.io/otel/semconv/v1.26.0"
|
||||||
|
"go.opentelemetry.io/otel/trace"
|
||||||
|
"go.opentelemetry.io/otel/trace/noop"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/auto/sdk/internal/telemetry"
|
||||||
|
)
|
||||||
|
|
||||||
|
type span struct {
|
||||||
|
noop.Span
|
||||||
|
|
||||||
|
spanContext trace.SpanContext
|
||||||
|
sampled atomic.Bool
|
||||||
|
|
||||||
|
mu sync.Mutex
|
||||||
|
traces *telemetry.Traces
|
||||||
|
span *telemetry.Span
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *span) SpanContext() trace.SpanContext {
|
||||||
|
if s == nil {
|
||||||
|
return trace.SpanContext{}
|
||||||
|
}
|
||||||
|
// s.spanContext is immutable, do not acquire lock s.mu.
|
||||||
|
return s.spanContext
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *span) IsRecording() bool {
|
||||||
|
if s == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return s.sampled.Load()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *span) SetStatus(c codes.Code, msg string) {
|
||||||
|
if s == nil || !s.sampled.Load() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
s.mu.Lock()
|
||||||
|
defer s.mu.Unlock()
|
||||||
|
|
||||||
|
if s.span.Status == nil {
|
||||||
|
s.span.Status = new(telemetry.Status)
|
||||||
|
}
|
||||||
|
|
||||||
|
s.span.Status.Message = msg
|
||||||
|
|
||||||
|
switch c {
|
||||||
|
case codes.Unset:
|
||||||
|
s.span.Status.Code = telemetry.StatusCodeUnset
|
||||||
|
case codes.Error:
|
||||||
|
s.span.Status.Code = telemetry.StatusCodeError
|
||||||
|
case codes.Ok:
|
||||||
|
s.span.Status.Code = telemetry.StatusCodeOK
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *span) SetAttributes(attrs ...attribute.KeyValue) {
|
||||||
|
if s == nil || !s.sampled.Load() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
s.mu.Lock()
|
||||||
|
defer s.mu.Unlock()
|
||||||
|
|
||||||
|
limit := maxSpan.Attrs
|
||||||
|
if limit == 0 {
|
||||||
|
// No attributes allowed.
|
||||||
|
s.span.DroppedAttrs += uint32(len(attrs))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
m := make(map[string]int)
|
||||||
|
for i, a := range s.span.Attrs {
|
||||||
|
m[a.Key] = i
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, a := range attrs {
|
||||||
|
val := convAttrValue(a.Value)
|
||||||
|
if val.Empty() {
|
||||||
|
s.span.DroppedAttrs++
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if idx, ok := m[string(a.Key)]; ok {
|
||||||
|
s.span.Attrs[idx] = telemetry.Attr{
|
||||||
|
Key: string(a.Key),
|
||||||
|
Value: val,
|
||||||
|
}
|
||||||
|
} else if limit < 0 || len(s.span.Attrs) < limit {
|
||||||
|
s.span.Attrs = append(s.span.Attrs, telemetry.Attr{
|
||||||
|
Key: string(a.Key),
|
||||||
|
Value: val,
|
||||||
|
})
|
||||||
|
m[string(a.Key)] = len(s.span.Attrs) - 1
|
||||||
|
} else {
|
||||||
|
s.span.DroppedAttrs++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// convCappedAttrs converts up to limit attrs into a []telemetry.Attr. The
|
||||||
|
// number of dropped attributes is also returned.
|
||||||
|
func convCappedAttrs(limit int, attrs []attribute.KeyValue) ([]telemetry.Attr, uint32) {
|
||||||
|
if limit == 0 {
|
||||||
|
return nil, uint32(len(attrs))
|
||||||
|
}
|
||||||
|
|
||||||
|
if limit < 0 {
|
||||||
|
// Unlimited.
|
||||||
|
return convAttrs(attrs), 0
|
||||||
|
}
|
||||||
|
|
||||||
|
limit = min(len(attrs), limit)
|
||||||
|
return convAttrs(attrs[:limit]), uint32(len(attrs) - limit)
|
||||||
|
}
|
||||||
|
|
||||||
|
func convAttrs(attrs []attribute.KeyValue) []telemetry.Attr {
|
||||||
|
if len(attrs) == 0 {
|
||||||
|
// Avoid allocations if not necessary.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
out := make([]telemetry.Attr, 0, len(attrs))
|
||||||
|
for _, attr := range attrs {
|
||||||
|
key := string(attr.Key)
|
||||||
|
val := convAttrValue(attr.Value)
|
||||||
|
if val.Empty() {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
out = append(out, telemetry.Attr{Key: key, Value: val})
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
func convAttrValue(value attribute.Value) telemetry.Value {
|
||||||
|
switch value.Type() {
|
||||||
|
case attribute.BOOL:
|
||||||
|
return telemetry.BoolValue(value.AsBool())
|
||||||
|
case attribute.INT64:
|
||||||
|
return telemetry.Int64Value(value.AsInt64())
|
||||||
|
case attribute.FLOAT64:
|
||||||
|
return telemetry.Float64Value(value.AsFloat64())
|
||||||
|
case attribute.STRING:
|
||||||
|
v := truncate(maxSpan.AttrValueLen, value.AsString())
|
||||||
|
return telemetry.StringValue(v)
|
||||||
|
case attribute.BOOLSLICE:
|
||||||
|
slice := value.AsBoolSlice()
|
||||||
|
out := make([]telemetry.Value, 0, len(slice))
|
||||||
|
for _, v := range slice {
|
||||||
|
out = append(out, telemetry.BoolValue(v))
|
||||||
|
}
|
||||||
|
return telemetry.SliceValue(out...)
|
||||||
|
case attribute.INT64SLICE:
|
||||||
|
slice := value.AsInt64Slice()
|
||||||
|
out := make([]telemetry.Value, 0, len(slice))
|
||||||
|
for _, v := range slice {
|
||||||
|
out = append(out, telemetry.Int64Value(v))
|
||||||
|
}
|
||||||
|
return telemetry.SliceValue(out...)
|
||||||
|
case attribute.FLOAT64SLICE:
|
||||||
|
slice := value.AsFloat64Slice()
|
||||||
|
out := make([]telemetry.Value, 0, len(slice))
|
||||||
|
for _, v := range slice {
|
||||||
|
out = append(out, telemetry.Float64Value(v))
|
||||||
|
}
|
||||||
|
return telemetry.SliceValue(out...)
|
||||||
|
case attribute.STRINGSLICE:
|
||||||
|
slice := value.AsStringSlice()
|
||||||
|
out := make([]telemetry.Value, 0, len(slice))
|
||||||
|
for _, v := range slice {
|
||||||
|
v = truncate(maxSpan.AttrValueLen, v)
|
||||||
|
out = append(out, telemetry.StringValue(v))
|
||||||
|
}
|
||||||
|
return telemetry.SliceValue(out...)
|
||||||
|
}
|
||||||
|
return telemetry.Value{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// truncate returns a truncated version of s such that it contains less than
|
||||||
|
// the limit number of characters. Truncation is applied by returning the limit
|
||||||
|
// number of valid characters contained in s.
|
||||||
|
//
|
||||||
|
// If limit is negative, it returns the original string.
|
||||||
|
//
|
||||||
|
// UTF-8 is supported. When truncating, all invalid characters are dropped
|
||||||
|
// before applying truncation.
|
||||||
|
//
|
||||||
|
// If s already contains less than the limit number of bytes, it is returned
|
||||||
|
// unchanged. No invalid characters are removed.
|
||||||
|
func truncate(limit int, s string) string {
|
||||||
|
// This prioritize performance in the following order based on the most
|
||||||
|
// common expected use-cases.
|
||||||
|
//
|
||||||
|
// - Short values less than the default limit (128).
|
||||||
|
// - Strings with valid encodings that exceed the limit.
|
||||||
|
// - No limit.
|
||||||
|
// - Strings with invalid encodings that exceed the limit.
|
||||||
|
if limit < 0 || len(s) <= limit {
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optimistically, assume all valid UTF-8.
|
||||||
|
var b strings.Builder
|
||||||
|
count := 0
|
||||||
|
for i, c := range s {
|
||||||
|
if c != utf8.RuneError {
|
||||||
|
count++
|
||||||
|
if count > limit {
|
||||||
|
return s[:i]
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
_, size := utf8.DecodeRuneInString(s[i:])
|
||||||
|
if size == 1 {
|
||||||
|
// Invalid encoding.
|
||||||
|
b.Grow(len(s) - 1)
|
||||||
|
_, _ = b.WriteString(s[:i])
|
||||||
|
s = s[i:]
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fast-path, no invalid input.
|
||||||
|
if b.Cap() == 0 {
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
// Truncate while validating UTF-8.
|
||||||
|
for i := 0; i < len(s) && count < limit; {
|
||||||
|
c := s[i]
|
||||||
|
if c < utf8.RuneSelf {
|
||||||
|
// Optimization for single byte runes (common case).
|
||||||
|
_ = b.WriteByte(c)
|
||||||
|
i++
|
||||||
|
count++
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
_, size := utf8.DecodeRuneInString(s[i:])
|
||||||
|
if size == 1 {
|
||||||
|
// We checked for all 1-byte runes above, this is a RuneError.
|
||||||
|
i++
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
_, _ = b.WriteString(s[i : i+size])
|
||||||
|
i += size
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
|
||||||
|
return b.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *span) End(opts ...trace.SpanEndOption) {
|
||||||
|
if s == nil || !s.sampled.Swap(false) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// s.end exists so the lock (s.mu) is not held while s.ended is called.
|
||||||
|
s.ended(s.end(opts))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *span) end(opts []trace.SpanEndOption) []byte {
|
||||||
|
s.mu.Lock()
|
||||||
|
defer s.mu.Unlock()
|
||||||
|
|
||||||
|
cfg := trace.NewSpanEndConfig(opts...)
|
||||||
|
if t := cfg.Timestamp(); !t.IsZero() {
|
||||||
|
s.span.EndTime = cfg.Timestamp()
|
||||||
|
} else {
|
||||||
|
s.span.EndTime = time.Now()
|
||||||
|
}
|
||||||
|
|
||||||
|
b, _ := json.Marshal(s.traces) // TODO: do not ignore this error.
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// Expected to be implemented in eBPF.
|
||||||
|
//
|
||||||
|
//go:noinline
|
||||||
|
func (*span) ended(buf []byte) { ended(buf) }
|
||||||
|
|
||||||
|
// ended is used for testing.
|
||||||
|
var ended = func([]byte) {}
|
||||||
|
|
||||||
|
func (s *span) RecordError(err error, opts ...trace.EventOption) {
|
||||||
|
if s == nil || err == nil || !s.sampled.Load() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg := trace.NewEventConfig(opts...)
|
||||||
|
|
||||||
|
attrs := cfg.Attributes()
|
||||||
|
attrs = append(attrs,
|
||||||
|
semconv.ExceptionType(typeStr(err)),
|
||||||
|
semconv.ExceptionMessage(err.Error()),
|
||||||
|
)
|
||||||
|
if cfg.StackTrace() {
|
||||||
|
buf := make([]byte, 2048)
|
||||||
|
n := runtime.Stack(buf, false)
|
||||||
|
attrs = append(attrs, semconv.ExceptionStacktrace(string(buf[0:n])))
|
||||||
|
}
|
||||||
|
|
||||||
|
s.mu.Lock()
|
||||||
|
defer s.mu.Unlock()
|
||||||
|
|
||||||
|
s.addEvent(semconv.ExceptionEventName, cfg.Timestamp(), attrs)
|
||||||
|
}
|
||||||
|
|
||||||
|
func typeStr(i any) string {
|
||||||
|
t := reflect.TypeOf(i)
|
||||||
|
if t.PkgPath() == "" && t.Name() == "" {
|
||||||
|
// Likely a builtin type.
|
||||||
|
return t.String()
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("%s.%s", t.PkgPath(), t.Name())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *span) AddEvent(name string, opts ...trace.EventOption) {
|
||||||
|
if s == nil || !s.sampled.Load() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg := trace.NewEventConfig(opts...)
|
||||||
|
|
||||||
|
s.mu.Lock()
|
||||||
|
defer s.mu.Unlock()
|
||||||
|
|
||||||
|
s.addEvent(name, cfg.Timestamp(), cfg.Attributes())
|
||||||
|
}
|
||||||
|
|
||||||
|
// addEvent adds an event with name and attrs at tStamp to the span. The span
|
||||||
|
// lock (s.mu) needs to be held by the caller.
|
||||||
|
func (s *span) addEvent(name string, tStamp time.Time, attrs []attribute.KeyValue) {
|
||||||
|
limit := maxSpan.Events
|
||||||
|
|
||||||
|
if limit == 0 {
|
||||||
|
s.span.DroppedEvents++
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if limit > 0 && len(s.span.Events) == limit {
|
||||||
|
// Drop head while avoiding allocation of more capacity.
|
||||||
|
copy(s.span.Events[:limit-1], s.span.Events[1:])
|
||||||
|
s.span.Events = s.span.Events[:limit-1]
|
||||||
|
s.span.DroppedEvents++
|
||||||
|
}
|
||||||
|
|
||||||
|
e := &telemetry.SpanEvent{Time: tStamp, Name: name}
|
||||||
|
e.Attrs, e.DroppedAttrs = convCappedAttrs(maxSpan.EventAttrs, attrs)
|
||||||
|
|
||||||
|
s.span.Events = append(s.span.Events, e)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *span) AddLink(link trace.Link) {
|
||||||
|
if s == nil || !s.sampled.Load() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
l := maxSpan.Links
|
||||||
|
|
||||||
|
s.mu.Lock()
|
||||||
|
defer s.mu.Unlock()
|
||||||
|
|
||||||
|
if l == 0 {
|
||||||
|
s.span.DroppedLinks++
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if l > 0 && len(s.span.Links) == l {
|
||||||
|
// Drop head while avoiding allocation of more capacity.
|
||||||
|
copy(s.span.Links[:l-1], s.span.Links[1:])
|
||||||
|
s.span.Links = s.span.Links[:l-1]
|
||||||
|
s.span.DroppedLinks++
|
||||||
|
}
|
||||||
|
|
||||||
|
s.span.Links = append(s.span.Links, convLink(link))
|
||||||
|
}
|
||||||
|
|
||||||
|
func convLinks(links []trace.Link) []*telemetry.SpanLink {
|
||||||
|
out := make([]*telemetry.SpanLink, 0, len(links))
|
||||||
|
for _, link := range links {
|
||||||
|
out = append(out, convLink(link))
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
func convLink(link trace.Link) *telemetry.SpanLink {
|
||||||
|
l := &telemetry.SpanLink{
|
||||||
|
TraceID: telemetry.TraceID(link.SpanContext.TraceID()),
|
||||||
|
SpanID: telemetry.SpanID(link.SpanContext.SpanID()),
|
||||||
|
TraceState: link.SpanContext.TraceState().String(),
|
||||||
|
Flags: uint32(link.SpanContext.TraceFlags()),
|
||||||
|
}
|
||||||
|
l.Attrs, l.DroppedAttrs = convCappedAttrs(maxSpan.LinkAttrs, link.Attributes)
|
||||||
|
|
||||||
|
return l
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *span) SetName(name string) {
|
||||||
|
if s == nil || !s.sampled.Load() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
s.mu.Lock()
|
||||||
|
defer s.mu.Unlock()
|
||||||
|
|
||||||
|
s.span.Name = name
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*span) TracerProvider() trace.TracerProvider { return TracerProvider() }
|
124
vendor/go.opentelemetry.io/auto/sdk/tracer.go
generated
vendored
Normal file
124
vendor/go.opentelemetry.io/auto/sdk/tracer.go
generated
vendored
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package sdk
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/trace"
|
||||||
|
"go.opentelemetry.io/otel/trace/noop"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/auto/sdk/internal/telemetry"
|
||||||
|
)
|
||||||
|
|
||||||
|
type tracer struct {
|
||||||
|
noop.Tracer
|
||||||
|
|
||||||
|
name, schemaURL, version string
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ trace.Tracer = tracer{}
|
||||||
|
|
||||||
|
func (t tracer) Start(ctx context.Context, name string, opts ...trace.SpanStartOption) (context.Context, trace.Span) {
|
||||||
|
var psc trace.SpanContext
|
||||||
|
sampled := true
|
||||||
|
span := new(span)
|
||||||
|
|
||||||
|
// Ask eBPF for sampling decision and span context info.
|
||||||
|
t.start(ctx, span, &psc, &sampled, &span.spanContext)
|
||||||
|
|
||||||
|
span.sampled.Store(sampled)
|
||||||
|
|
||||||
|
ctx = trace.ContextWithSpan(ctx, span)
|
||||||
|
|
||||||
|
if sampled {
|
||||||
|
// Only build traces if sampled.
|
||||||
|
cfg := trace.NewSpanStartConfig(opts...)
|
||||||
|
span.traces, span.span = t.traces(name, cfg, span.spanContext, psc)
|
||||||
|
}
|
||||||
|
|
||||||
|
return ctx, span
|
||||||
|
}
|
||||||
|
|
||||||
|
// Expected to be implemented in eBPF.
|
||||||
|
//
|
||||||
|
//go:noinline
|
||||||
|
func (t *tracer) start(
|
||||||
|
ctx context.Context,
|
||||||
|
spanPtr *span,
|
||||||
|
psc *trace.SpanContext,
|
||||||
|
sampled *bool,
|
||||||
|
sc *trace.SpanContext,
|
||||||
|
) {
|
||||||
|
start(ctx, spanPtr, psc, sampled, sc)
|
||||||
|
}
|
||||||
|
|
||||||
|
// start is used for testing.
|
||||||
|
var start = func(context.Context, *span, *trace.SpanContext, *bool, *trace.SpanContext) {}
|
||||||
|
|
||||||
|
func (t tracer) traces(name string, cfg trace.SpanConfig, sc, psc trace.SpanContext) (*telemetry.Traces, *telemetry.Span) {
|
||||||
|
span := &telemetry.Span{
|
||||||
|
TraceID: telemetry.TraceID(sc.TraceID()),
|
||||||
|
SpanID: telemetry.SpanID(sc.SpanID()),
|
||||||
|
Flags: uint32(sc.TraceFlags()),
|
||||||
|
TraceState: sc.TraceState().String(),
|
||||||
|
ParentSpanID: telemetry.SpanID(psc.SpanID()),
|
||||||
|
Name: name,
|
||||||
|
Kind: spanKind(cfg.SpanKind()),
|
||||||
|
}
|
||||||
|
|
||||||
|
span.Attrs, span.DroppedAttrs = convCappedAttrs(maxSpan.Attrs, cfg.Attributes())
|
||||||
|
|
||||||
|
links := cfg.Links()
|
||||||
|
if limit := maxSpan.Links; limit == 0 {
|
||||||
|
span.DroppedLinks = uint32(len(links))
|
||||||
|
} else {
|
||||||
|
if limit > 0 {
|
||||||
|
n := max(len(links)-limit, 0)
|
||||||
|
span.DroppedLinks = uint32(n)
|
||||||
|
links = links[n:]
|
||||||
|
}
|
||||||
|
span.Links = convLinks(links)
|
||||||
|
}
|
||||||
|
|
||||||
|
if t := cfg.Timestamp(); !t.IsZero() {
|
||||||
|
span.StartTime = cfg.Timestamp()
|
||||||
|
} else {
|
||||||
|
span.StartTime = time.Now()
|
||||||
|
}
|
||||||
|
|
||||||
|
return &telemetry.Traces{
|
||||||
|
ResourceSpans: []*telemetry.ResourceSpans{
|
||||||
|
{
|
||||||
|
ScopeSpans: []*telemetry.ScopeSpans{
|
||||||
|
{
|
||||||
|
Scope: &telemetry.Scope{
|
||||||
|
Name: t.name,
|
||||||
|
Version: t.version,
|
||||||
|
},
|
||||||
|
Spans: []*telemetry.Span{span},
|
||||||
|
SchemaURL: t.schemaURL,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}, span
|
||||||
|
}
|
||||||
|
|
||||||
|
func spanKind(kind trace.SpanKind) telemetry.SpanKind {
|
||||||
|
switch kind {
|
||||||
|
case trace.SpanKindInternal:
|
||||||
|
return telemetry.SpanKindInternal
|
||||||
|
case trace.SpanKindServer:
|
||||||
|
return telemetry.SpanKindServer
|
||||||
|
case trace.SpanKindClient:
|
||||||
|
return telemetry.SpanKindClient
|
||||||
|
case trace.SpanKindProducer:
|
||||||
|
return telemetry.SpanKindProducer
|
||||||
|
case trace.SpanKindConsumer:
|
||||||
|
return telemetry.SpanKindConsumer
|
||||||
|
}
|
||||||
|
return telemetry.SpanKind(0) // undefined.
|
||||||
|
}
|
33
vendor/go.opentelemetry.io/auto/sdk/tracer_provider.go
generated
vendored
Normal file
33
vendor/go.opentelemetry.io/auto/sdk/tracer_provider.go
generated
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package sdk
|
||||||
|
|
||||||
|
import (
|
||||||
|
"go.opentelemetry.io/otel/trace"
|
||||||
|
"go.opentelemetry.io/otel/trace/noop"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TracerProvider returns an auto-instrumentable [trace.TracerProvider].
|
||||||
|
//
|
||||||
|
// If an [go.opentelemetry.io/auto.Instrumentation] is configured to instrument
|
||||||
|
// the process using the returned TracerProvider, all of the telemetry it
|
||||||
|
// produces will be processed and handled by that Instrumentation. By default,
|
||||||
|
// if no Instrumentation instruments the TracerProvider it will not generate
|
||||||
|
// any trace telemetry.
|
||||||
|
func TracerProvider() trace.TracerProvider { return tracerProviderInstance }
|
||||||
|
|
||||||
|
var tracerProviderInstance = new(tracerProvider)
|
||||||
|
|
||||||
|
type tracerProvider struct{ noop.TracerProvider }
|
||||||
|
|
||||||
|
var _ trace.TracerProvider = tracerProvider{}
|
||||||
|
|
||||||
|
func (p tracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer {
|
||||||
|
cfg := trace.NewTracerConfig(opts...)
|
||||||
|
return tracer{
|
||||||
|
name: name,
|
||||||
|
version: cfg.InstrumentationVersion(),
|
||||||
|
schemaURL: cfg.SchemaURL(),
|
||||||
|
}
|
||||||
|
}
|
6
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/client.go
generated
vendored
6
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/client.go
generated
vendored
@ -18,7 +18,7 @@ var DefaultClient = &http.Client{Transport: NewTransport(http.DefaultTransport)}
|
|||||||
|
|
||||||
// Get is a convenient replacement for http.Get that adds a span around the request.
|
// Get is a convenient replacement for http.Get that adds a span around the request.
|
||||||
func Get(ctx context.Context, targetURL string) (resp *http.Response, err error) {
|
func Get(ctx context.Context, targetURL string) (resp *http.Response, err error) {
|
||||||
req, err := http.NewRequestWithContext(ctx, "GET", targetURL, nil)
|
req, err := http.NewRequestWithContext(ctx, http.MethodGet, targetURL, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -27,7 +27,7 @@ func Get(ctx context.Context, targetURL string) (resp *http.Response, err error)
|
|||||||
|
|
||||||
// Head is a convenient replacement for http.Head that adds a span around the request.
|
// Head is a convenient replacement for http.Head that adds a span around the request.
|
||||||
func Head(ctx context.Context, targetURL string) (resp *http.Response, err error) {
|
func Head(ctx context.Context, targetURL string) (resp *http.Response, err error) {
|
||||||
req, err := http.NewRequestWithContext(ctx, "HEAD", targetURL, nil)
|
req, err := http.NewRequestWithContext(ctx, http.MethodHead, targetURL, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -36,7 +36,7 @@ func Head(ctx context.Context, targetURL string) (resp *http.Response, err error
|
|||||||
|
|
||||||
// Post is a convenient replacement for http.Post that adds a span around the request.
|
// Post is a convenient replacement for http.Post that adds a span around the request.
|
||||||
func Post(ctx context.Context, targetURL, contentType string, body io.Reader) (resp *http.Response, err error) {
|
func Post(ctx context.Context, targetURL, contentType string, body io.Reader) (resp *http.Response, err error) {
|
||||||
req, err := http.NewRequestWithContext(ctx, "POST", targetURL, body)
|
req, err := http.NewRequestWithContext(ctx, http.MethodPost, targetURL, body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
50
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/handler.go
generated
vendored
50
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/handler.go
generated
vendored
@ -12,6 +12,7 @@ import (
|
|||||||
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/request"
|
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/request"
|
||||||
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv"
|
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv"
|
||||||
"go.opentelemetry.io/otel"
|
"go.opentelemetry.io/otel"
|
||||||
|
"go.opentelemetry.io/otel/attribute"
|
||||||
"go.opentelemetry.io/otel/propagation"
|
"go.opentelemetry.io/otel/propagation"
|
||||||
"go.opentelemetry.io/otel/trace"
|
"go.opentelemetry.io/otel/trace"
|
||||||
)
|
)
|
||||||
@ -21,15 +22,16 @@ type middleware struct {
|
|||||||
operation string
|
operation string
|
||||||
server string
|
server string
|
||||||
|
|
||||||
tracer trace.Tracer
|
tracer trace.Tracer
|
||||||
propagators propagation.TextMapPropagator
|
propagators propagation.TextMapPropagator
|
||||||
spanStartOptions []trace.SpanStartOption
|
spanStartOptions []trace.SpanStartOption
|
||||||
readEvent bool
|
readEvent bool
|
||||||
writeEvent bool
|
writeEvent bool
|
||||||
filters []Filter
|
filters []Filter
|
||||||
spanNameFormatter func(string, *http.Request) string
|
spanNameFormatter func(string, *http.Request) string
|
||||||
publicEndpoint bool
|
publicEndpoint bool
|
||||||
publicEndpointFn func(*http.Request) bool
|
publicEndpointFn func(*http.Request) bool
|
||||||
|
metricAttributesFn func(*http.Request) []attribute.KeyValue
|
||||||
|
|
||||||
semconv semconv.HTTPServer
|
semconv semconv.HTTPServer
|
||||||
}
|
}
|
||||||
@ -79,6 +81,7 @@ func (h *middleware) configure(c *config) {
|
|||||||
h.publicEndpointFn = c.PublicEndpointFn
|
h.publicEndpointFn = c.PublicEndpointFn
|
||||||
h.server = c.ServerName
|
h.server = c.ServerName
|
||||||
h.semconv = semconv.NewHTTPServer(c.Meter)
|
h.semconv = semconv.NewHTTPServer(c.Meter)
|
||||||
|
h.metricAttributesFn = c.MetricAttributesFn
|
||||||
}
|
}
|
||||||
|
|
||||||
// serveHTTP sets up tracing and calls the given next http.Handler with the span
|
// serveHTTP sets up tracing and calls the given next http.Handler with the span
|
||||||
@ -117,6 +120,11 @@ func (h *middleware) serveHTTP(w http.ResponseWriter, r *http.Request, next http
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if startTime := StartTimeFromContext(ctx); !startTime.IsZero() {
|
||||||
|
opts = append(opts, trace.WithTimestamp(startTime))
|
||||||
|
requestStartTime = startTime
|
||||||
|
}
|
||||||
|
|
||||||
ctx, span := tracer.Start(ctx, h.spanNameFormatter(h.operation, r), opts...)
|
ctx, span := tracer.Start(ctx, h.spanNameFormatter(h.operation, r), opts...)
|
||||||
defer span.End()
|
defer span.End()
|
||||||
|
|
||||||
@ -184,14 +192,16 @@ func (h *middleware) serveHTTP(w http.ResponseWriter, r *http.Request, next http
|
|||||||
// Use floating point division here for higher precision (instead of Millisecond method).
|
// Use floating point division here for higher precision (instead of Millisecond method).
|
||||||
elapsedTime := float64(time.Since(requestStartTime)) / float64(time.Millisecond)
|
elapsedTime := float64(time.Since(requestStartTime)) / float64(time.Millisecond)
|
||||||
|
|
||||||
|
metricAttributes := semconv.MetricAttributes{
|
||||||
|
Req: r,
|
||||||
|
StatusCode: statusCode,
|
||||||
|
AdditionalAttributes: append(labeler.Get(), h.metricAttributesFromRequest(r)...),
|
||||||
|
}
|
||||||
|
|
||||||
h.semconv.RecordMetrics(ctx, semconv.ServerMetricData{
|
h.semconv.RecordMetrics(ctx, semconv.ServerMetricData{
|
||||||
ServerName: h.server,
|
ServerName: h.server,
|
||||||
ResponseSize: bytesWritten,
|
ResponseSize: bytesWritten,
|
||||||
MetricAttributes: semconv.MetricAttributes{
|
MetricAttributes: metricAttributes,
|
||||||
Req: r,
|
|
||||||
StatusCode: statusCode,
|
|
||||||
AdditionalAttributes: labeler.Get(),
|
|
||||||
},
|
|
||||||
MetricData: semconv.MetricData{
|
MetricData: semconv.MetricData{
|
||||||
RequestSize: bw.BytesRead(),
|
RequestSize: bw.BytesRead(),
|
||||||
ElapsedTime: elapsedTime,
|
ElapsedTime: elapsedTime,
|
||||||
@ -199,6 +209,14 @@ func (h *middleware) serveHTTP(w http.ResponseWriter, r *http.Request, next http
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *middleware) metricAttributesFromRequest(r *http.Request) []attribute.KeyValue {
|
||||||
|
var attributeForRequest []attribute.KeyValue
|
||||||
|
if h.metricAttributesFn != nil {
|
||||||
|
attributeForRequest = h.metricAttributesFn(r)
|
||||||
|
}
|
||||||
|
return attributeForRequest
|
||||||
|
}
|
||||||
|
|
||||||
// WithRouteTag annotates spans and metrics with the provided route name
|
// WithRouteTag annotates spans and metrics with the provided route name
|
||||||
// with HTTP route attribute.
|
// with HTTP route attribute.
|
||||||
func WithRouteTag(route string, h http.Handler) http.Handler {
|
func WithRouteTag(route string, h http.Handler) http.Handler {
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
// Code created by gotmpl. DO NOT MODIFY.
|
||||||
|
// source: internal/shared/request/body_wrapper.go.tmpl
|
||||||
|
|
||||||
// Copyright The OpenTelemetry Authors
|
// Copyright The OpenTelemetry Authors
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
10
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/request/gen.go
generated
vendored
Normal file
10
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/request/gen.go
generated
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package request // import "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/request"
|
||||||
|
|
||||||
|
// Generate request package:
|
||||||
|
//go:generate gotmpl --body=../../../../../../internal/shared/request/body_wrapper.go.tmpl "--data={}" --out=body_wrapper.go
|
||||||
|
//go:generate gotmpl --body=../../../../../../internal/shared/request/body_wrapper_test.go.tmpl "--data={}" --out=body_wrapper_test.go
|
||||||
|
//go:generate gotmpl --body=../../../../../../internal/shared/request/resp_writer_wrapper.go.tmpl "--data={}" --out=resp_writer_wrapper.go
|
||||||
|
//go:generate gotmpl --body=../../../../../../internal/shared/request/resp_writer_wrapper_test.go.tmpl "--data={}" --out=resp_writer_wrapper_test.go
|
@ -1,3 +1,6 @@
|
|||||||
|
// Code created by gotmpl. DO NOT MODIFY.
|
||||||
|
// source: internal/shared/request/resp_writer_wrapper.go.tmpl
|
||||||
|
|
||||||
// Copyright The OpenTelemetry Authors
|
// Copyright The OpenTelemetry Authors
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
158
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/env.go
generated
vendored
158
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/env.go
generated
vendored
@ -1,3 +1,6 @@
|
|||||||
|
// Code created by gotmpl. DO NOT MODIFY.
|
||||||
|
// source: internal/shared/semconv/env.go.tmpl
|
||||||
|
|
||||||
// Copyright The OpenTelemetry Authors
|
// Copyright The OpenTelemetry Authors
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
@ -9,12 +12,17 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
"go.opentelemetry.io/otel/codes"
|
"go.opentelemetry.io/otel/codes"
|
||||||
"go.opentelemetry.io/otel/metric"
|
"go.opentelemetry.io/otel/metric"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// OTelSemConvStabilityOptIn is an environment variable.
|
||||||
|
// That can be set to "old" or "http/dup" to opt into the new HTTP semantic conventions.
|
||||||
|
const OTelSemConvStabilityOptIn = "OTEL_SEMCONV_STABILITY_OPT_IN"
|
||||||
|
|
||||||
type ResponseTelemetry struct {
|
type ResponseTelemetry struct {
|
||||||
StatusCode int
|
StatusCode int
|
||||||
ReadBytes int64
|
ReadBytes int64
|
||||||
@ -30,6 +38,11 @@ type HTTPServer struct {
|
|||||||
requestBytesCounter metric.Int64Counter
|
requestBytesCounter metric.Int64Counter
|
||||||
responseBytesCounter metric.Int64Counter
|
responseBytesCounter metric.Int64Counter
|
||||||
serverLatencyMeasure metric.Float64Histogram
|
serverLatencyMeasure metric.Float64Histogram
|
||||||
|
|
||||||
|
// New metrics
|
||||||
|
requestBodySizeHistogram metric.Int64Histogram
|
||||||
|
responseBodySizeHistogram metric.Int64Histogram
|
||||||
|
requestDurationHistogram metric.Float64Histogram
|
||||||
}
|
}
|
||||||
|
|
||||||
// RequestTraceAttrs returns trace attributes for an HTTP request received by a
|
// RequestTraceAttrs returns trace attributes for an HTTP request received by a
|
||||||
@ -50,9 +63,18 @@ type HTTPServer struct {
|
|||||||
// The req Host will be used to determine the server instead.
|
// The req Host will be used to determine the server instead.
|
||||||
func (s HTTPServer) RequestTraceAttrs(server string, req *http.Request) []attribute.KeyValue {
|
func (s HTTPServer) RequestTraceAttrs(server string, req *http.Request) []attribute.KeyValue {
|
||||||
if s.duplicate {
|
if s.duplicate {
|
||||||
return append(oldHTTPServer{}.RequestTraceAttrs(server, req), newHTTPServer{}.RequestTraceAttrs(server, req)...)
|
return append(OldHTTPServer{}.RequestTraceAttrs(server, req), CurrentHTTPServer{}.RequestTraceAttrs(server, req)...)
|
||||||
|
}
|
||||||
|
return OldHTTPServer{}.RequestTraceAttrs(server, req)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s HTTPServer) NetworkTransportAttr(network string) []attribute.KeyValue {
|
||||||
|
if s.duplicate {
|
||||||
|
return append([]attribute.KeyValue{OldHTTPServer{}.NetworkTransportAttr(network)}, CurrentHTTPServer{}.NetworkTransportAttr(network))
|
||||||
|
}
|
||||||
|
return []attribute.KeyValue{
|
||||||
|
OldHTTPServer{}.NetworkTransportAttr(network),
|
||||||
}
|
}
|
||||||
return oldHTTPServer{}.RequestTraceAttrs(server, req)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ResponseTraceAttrs returns trace attributes for telemetry from an HTTP response.
|
// ResponseTraceAttrs returns trace attributes for telemetry from an HTTP response.
|
||||||
@ -60,14 +82,14 @@ func (s HTTPServer) RequestTraceAttrs(server string, req *http.Request) []attrib
|
|||||||
// If any of the fields in the ResponseTelemetry are not set the attribute will be omitted.
|
// If any of the fields in the ResponseTelemetry are not set the attribute will be omitted.
|
||||||
func (s HTTPServer) ResponseTraceAttrs(resp ResponseTelemetry) []attribute.KeyValue {
|
func (s HTTPServer) ResponseTraceAttrs(resp ResponseTelemetry) []attribute.KeyValue {
|
||||||
if s.duplicate {
|
if s.duplicate {
|
||||||
return append(oldHTTPServer{}.ResponseTraceAttrs(resp), newHTTPServer{}.ResponseTraceAttrs(resp)...)
|
return append(OldHTTPServer{}.ResponseTraceAttrs(resp), CurrentHTTPServer{}.ResponseTraceAttrs(resp)...)
|
||||||
}
|
}
|
||||||
return oldHTTPServer{}.ResponseTraceAttrs(resp)
|
return OldHTTPServer{}.ResponseTraceAttrs(resp)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Route returns the attribute for the route.
|
// Route returns the attribute for the route.
|
||||||
func (s HTTPServer) Route(route string) attribute.KeyValue {
|
func (s HTTPServer) Route(route string) attribute.KeyValue {
|
||||||
return oldHTTPServer{}.Route(route)
|
return OldHTTPServer{}.Route(route)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Status returns a span status code and message for an HTTP status code
|
// Status returns a span status code and message for an HTTP status code
|
||||||
@ -102,29 +124,56 @@ type MetricData struct {
|
|||||||
ElapsedTime float64
|
ElapsedTime float64
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s HTTPServer) RecordMetrics(ctx context.Context, md ServerMetricData) {
|
var (
|
||||||
if s.requestBytesCounter == nil || s.responseBytesCounter == nil || s.serverLatencyMeasure == nil {
|
metricAddOptionPool = &sync.Pool{
|
||||||
// This will happen if an HTTPServer{} is used insted of NewHTTPServer.
|
New: func() interface{} {
|
||||||
return
|
return &[]metric.AddOption{}
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
attributes := oldHTTPServer{}.MetricAttributes(md.ServerName, md.Req, md.StatusCode, md.AdditionalAttributes)
|
metricRecordOptionPool = &sync.Pool{
|
||||||
o := metric.WithAttributeSet(attribute.NewSet(attributes...))
|
New: func() interface{} {
|
||||||
addOpts := []metric.AddOption{o}
|
return &[]metric.RecordOption{}
|
||||||
s.requestBytesCounter.Add(ctx, md.RequestSize, addOpts...)
|
},
|
||||||
s.responseBytesCounter.Add(ctx, md.ResponseSize, addOpts...)
|
}
|
||||||
s.serverLatencyMeasure.Record(ctx, md.ElapsedTime, o)
|
)
|
||||||
|
|
||||||
// TODO: Duplicate Metrics
|
func (s HTTPServer) RecordMetrics(ctx context.Context, md ServerMetricData) {
|
||||||
|
if s.requestBytesCounter != nil && s.responseBytesCounter != nil && s.serverLatencyMeasure != nil {
|
||||||
|
attributes := OldHTTPServer{}.MetricAttributes(md.ServerName, md.Req, md.StatusCode, md.AdditionalAttributes)
|
||||||
|
o := metric.WithAttributeSet(attribute.NewSet(attributes...))
|
||||||
|
addOpts := metricAddOptionPool.Get().(*[]metric.AddOption)
|
||||||
|
*addOpts = append(*addOpts, o)
|
||||||
|
s.requestBytesCounter.Add(ctx, md.RequestSize, *addOpts...)
|
||||||
|
s.responseBytesCounter.Add(ctx, md.ResponseSize, *addOpts...)
|
||||||
|
s.serverLatencyMeasure.Record(ctx, md.ElapsedTime, o)
|
||||||
|
*addOpts = (*addOpts)[:0]
|
||||||
|
metricAddOptionPool.Put(addOpts)
|
||||||
|
}
|
||||||
|
|
||||||
|
if s.duplicate && s.requestDurationHistogram != nil && s.requestBodySizeHistogram != nil && s.responseBodySizeHistogram != nil {
|
||||||
|
attributes := CurrentHTTPServer{}.MetricAttributes(md.ServerName, md.Req, md.StatusCode, md.AdditionalAttributes)
|
||||||
|
o := metric.WithAttributeSet(attribute.NewSet(attributes...))
|
||||||
|
recordOpts := metricRecordOptionPool.Get().(*[]metric.RecordOption)
|
||||||
|
*recordOpts = append(*recordOpts, o)
|
||||||
|
s.requestBodySizeHistogram.Record(ctx, md.RequestSize, *recordOpts...)
|
||||||
|
s.responseBodySizeHistogram.Record(ctx, md.ResponseSize, *recordOpts...)
|
||||||
|
s.requestDurationHistogram.Record(ctx, md.ElapsedTime, o)
|
||||||
|
*recordOpts = (*recordOpts)[:0]
|
||||||
|
metricRecordOptionPool.Put(recordOpts)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewHTTPServer(meter metric.Meter) HTTPServer {
|
func NewHTTPServer(meter metric.Meter) HTTPServer {
|
||||||
env := strings.ToLower(os.Getenv("OTEL_SEMCONV_STABILITY_OPT_IN"))
|
env := strings.ToLower(os.Getenv(OTelSemConvStabilityOptIn))
|
||||||
duplicate := env == "http/dup"
|
duplicate := env == "http/dup"
|
||||||
server := HTTPServer{
|
server := HTTPServer{
|
||||||
duplicate: duplicate,
|
duplicate: duplicate,
|
||||||
}
|
}
|
||||||
server.requestBytesCounter, server.responseBytesCounter, server.serverLatencyMeasure = oldHTTPServer{}.createMeasures(meter)
|
server.requestBytesCounter, server.responseBytesCounter, server.serverLatencyMeasure = OldHTTPServer{}.createMeasures(meter)
|
||||||
|
if duplicate {
|
||||||
|
server.requestBodySizeHistogram, server.responseBodySizeHistogram, server.requestDurationHistogram = CurrentHTTPServer{}.createMeasures(meter)
|
||||||
|
}
|
||||||
return server
|
return server
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,32 +184,41 @@ type HTTPClient struct {
|
|||||||
requestBytesCounter metric.Int64Counter
|
requestBytesCounter metric.Int64Counter
|
||||||
responseBytesCounter metric.Int64Counter
|
responseBytesCounter metric.Int64Counter
|
||||||
latencyMeasure metric.Float64Histogram
|
latencyMeasure metric.Float64Histogram
|
||||||
|
|
||||||
|
// new metrics
|
||||||
|
requestBodySize metric.Int64Histogram
|
||||||
|
requestDuration metric.Float64Histogram
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewHTTPClient(meter metric.Meter) HTTPClient {
|
func NewHTTPClient(meter metric.Meter) HTTPClient {
|
||||||
env := strings.ToLower(os.Getenv("OTEL_SEMCONV_STABILITY_OPT_IN"))
|
env := strings.ToLower(os.Getenv(OTelSemConvStabilityOptIn))
|
||||||
|
duplicate := env == "http/dup"
|
||||||
client := HTTPClient{
|
client := HTTPClient{
|
||||||
duplicate: env == "http/dup",
|
duplicate: duplicate,
|
||||||
}
|
}
|
||||||
client.requestBytesCounter, client.responseBytesCounter, client.latencyMeasure = oldHTTPClient{}.createMeasures(meter)
|
client.requestBytesCounter, client.responseBytesCounter, client.latencyMeasure = OldHTTPClient{}.createMeasures(meter)
|
||||||
|
if duplicate {
|
||||||
|
client.requestBodySize, client.requestDuration = CurrentHTTPClient{}.createMeasures(meter)
|
||||||
|
}
|
||||||
|
|
||||||
return client
|
return client
|
||||||
}
|
}
|
||||||
|
|
||||||
// RequestTraceAttrs returns attributes for an HTTP request made by a client.
|
// RequestTraceAttrs returns attributes for an HTTP request made by a client.
|
||||||
func (c HTTPClient) RequestTraceAttrs(req *http.Request) []attribute.KeyValue {
|
func (c HTTPClient) RequestTraceAttrs(req *http.Request) []attribute.KeyValue {
|
||||||
if c.duplicate {
|
if c.duplicate {
|
||||||
return append(oldHTTPClient{}.RequestTraceAttrs(req), newHTTPClient{}.RequestTraceAttrs(req)...)
|
return append(OldHTTPClient{}.RequestTraceAttrs(req), CurrentHTTPClient{}.RequestTraceAttrs(req)...)
|
||||||
}
|
}
|
||||||
return oldHTTPClient{}.RequestTraceAttrs(req)
|
return OldHTTPClient{}.RequestTraceAttrs(req)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ResponseTraceAttrs returns metric attributes for an HTTP request made by a client.
|
// ResponseTraceAttrs returns metric attributes for an HTTP request made by a client.
|
||||||
func (c HTTPClient) ResponseTraceAttrs(resp *http.Response) []attribute.KeyValue {
|
func (c HTTPClient) ResponseTraceAttrs(resp *http.Response) []attribute.KeyValue {
|
||||||
if c.duplicate {
|
if c.duplicate {
|
||||||
return append(oldHTTPClient{}.ResponseTraceAttrs(resp), newHTTPClient{}.ResponseTraceAttrs(resp)...)
|
return append(OldHTTPClient{}.ResponseTraceAttrs(resp), CurrentHTTPClient{}.ResponseTraceAttrs(resp)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
return oldHTTPClient{}.ResponseTraceAttrs(resp)
|
return OldHTTPClient{}.ResponseTraceAttrs(resp)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c HTTPClient) Status(code int) (codes.Code, string) {
|
func (c HTTPClient) Status(code int) (codes.Code, string) {
|
||||||
@ -175,7 +233,7 @@ func (c HTTPClient) Status(code int) (codes.Code, string) {
|
|||||||
|
|
||||||
func (c HTTPClient) ErrorType(err error) attribute.KeyValue {
|
func (c HTTPClient) ErrorType(err error) attribute.KeyValue {
|
||||||
if c.duplicate {
|
if c.duplicate {
|
||||||
return newHTTPClient{}.ErrorType(err)
|
return CurrentHTTPClient{}.ErrorType(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return attribute.KeyValue{}
|
return attribute.KeyValue{}
|
||||||
@ -194,34 +252,56 @@ func (o MetricOpts) AddOptions() metric.AddOption {
|
|||||||
return o.addOptions
|
return o.addOptions
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c HTTPClient) MetricOptions(ma MetricAttributes) MetricOpts {
|
func (c HTTPClient) MetricOptions(ma MetricAttributes) map[string]MetricOpts {
|
||||||
attributes := oldHTTPClient{}.MetricAttributes(ma.Req, ma.StatusCode, ma.AdditionalAttributes)
|
opts := map[string]MetricOpts{}
|
||||||
// TODO: Duplicate Metrics
|
|
||||||
|
attributes := OldHTTPClient{}.MetricAttributes(ma.Req, ma.StatusCode, ma.AdditionalAttributes)
|
||||||
set := metric.WithAttributeSet(attribute.NewSet(attributes...))
|
set := metric.WithAttributeSet(attribute.NewSet(attributes...))
|
||||||
return MetricOpts{
|
opts["old"] = MetricOpts{
|
||||||
measurement: set,
|
measurement: set,
|
||||||
addOptions: set,
|
addOptions: set,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if c.duplicate {
|
||||||
|
attributes := CurrentHTTPClient{}.MetricAttributes(ma.Req, ma.StatusCode, ma.AdditionalAttributes)
|
||||||
|
set := metric.WithAttributeSet(attribute.NewSet(attributes...))
|
||||||
|
opts["new"] = MetricOpts{
|
||||||
|
measurement: set,
|
||||||
|
addOptions: set,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return opts
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s HTTPClient) RecordMetrics(ctx context.Context, md MetricData, opts MetricOpts) {
|
func (s HTTPClient) RecordMetrics(ctx context.Context, md MetricData, opts map[string]MetricOpts) {
|
||||||
if s.requestBytesCounter == nil || s.latencyMeasure == nil {
|
if s.requestBytesCounter == nil || s.latencyMeasure == nil {
|
||||||
// This will happen if an HTTPClient{} is used insted of NewHTTPClient().
|
// This will happen if an HTTPClient{} is used instead of NewHTTPClient().
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
s.requestBytesCounter.Add(ctx, md.RequestSize, opts.AddOptions())
|
s.requestBytesCounter.Add(ctx, md.RequestSize, opts["old"].AddOptions())
|
||||||
s.latencyMeasure.Record(ctx, md.ElapsedTime, opts.MeasurementOption())
|
s.latencyMeasure.Record(ctx, md.ElapsedTime, opts["old"].MeasurementOption())
|
||||||
|
|
||||||
// TODO: Duplicate Metrics
|
if s.duplicate {
|
||||||
|
s.requestBodySize.Record(ctx, md.RequestSize, opts["new"].MeasurementOption())
|
||||||
|
s.requestDuration.Record(ctx, md.ElapsedTime, opts["new"].MeasurementOption())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s HTTPClient) RecordResponseSize(ctx context.Context, responseData int64, opts metric.AddOption) {
|
func (s HTTPClient) RecordResponseSize(ctx context.Context, responseData int64, opts map[string]MetricOpts) {
|
||||||
if s.responseBytesCounter == nil {
|
if s.responseBytesCounter == nil {
|
||||||
// This will happen if an HTTPClient{} is used insted of NewHTTPClient().
|
// This will happen if an HTTPClient{} is used instead of NewHTTPClient().
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
s.responseBytesCounter.Add(ctx, responseData, opts)
|
s.responseBytesCounter.Add(ctx, responseData, opts["old"].AddOptions())
|
||||||
// TODO: Duplicate Metrics
|
}
|
||||||
|
|
||||||
|
func (s HTTPClient) TraceAttributes(host string) []attribute.KeyValue {
|
||||||
|
if s.duplicate {
|
||||||
|
return append(OldHTTPClient{}.TraceAttributes(host), CurrentHTTPClient{}.TraceAttributes(host)...)
|
||||||
|
}
|
||||||
|
|
||||||
|
return OldHTTPClient{}.TraceAttributes(host)
|
||||||
}
|
}
|
||||||
|
14
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/gen.go
generated
vendored
Normal file
14
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/gen.go
generated
vendored
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package semconv // import "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv"
|
||||||
|
|
||||||
|
// Generate semconv package:
|
||||||
|
//go:generate gotmpl --body=../../../../../../internal/shared/semconv/bench_test.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\" }" --out=bench_test.go
|
||||||
|
//go:generate gotmpl --body=../../../../../../internal/shared/semconv/env.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\" }" --out=env.go
|
||||||
|
//go:generate gotmpl --body=../../../../../../internal/shared/semconv/env_test.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\" }" --out=env_test.go
|
||||||
|
//go:generate gotmpl --body=../../../../../../internal/shared/semconv/httpconv.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\" }" --out=httpconv.go
|
||||||
|
//go:generate gotmpl --body=../../../../../../internal/shared/semconv/httpconv_test.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\" }" --out=httpconv_test.go
|
||||||
|
//go:generate gotmpl --body=../../../../../../internal/shared/semconv/util.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\" }" --out=util.go
|
||||||
|
//go:generate gotmpl --body=../../../../../../internal/shared/semconv/util_test.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\" }" --out=util_test.go
|
||||||
|
//go:generate gotmpl --body=../../../../../../internal/shared/semconv/v1.20.0.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\" }" --out=v1.20.0.go
|
@ -1,3 +1,6 @@
|
|||||||
|
// Code created by gotmpl. DO NOT MODIFY.
|
||||||
|
// source: internal/shared/semconv/httpconv.go.tmpl
|
||||||
|
|
||||||
// Copyright The OpenTelemetry Authors
|
// Copyright The OpenTelemetry Authors
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
@ -7,14 +10,17 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"slices"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
|
"go.opentelemetry.io/otel/metric"
|
||||||
|
"go.opentelemetry.io/otel/metric/noop"
|
||||||
semconvNew "go.opentelemetry.io/otel/semconv/v1.26.0"
|
semconvNew "go.opentelemetry.io/otel/semconv/v1.26.0"
|
||||||
)
|
)
|
||||||
|
|
||||||
type newHTTPServer struct{}
|
type CurrentHTTPServer struct{}
|
||||||
|
|
||||||
// TraceRequest returns trace attributes for an HTTP request received by a
|
// TraceRequest returns trace attributes for an HTTP request received by a
|
||||||
// server.
|
// server.
|
||||||
@ -32,18 +38,18 @@ type newHTTPServer struct{}
|
|||||||
//
|
//
|
||||||
// If the primary server name is not known, server should be an empty string.
|
// If the primary server name is not known, server should be an empty string.
|
||||||
// The req Host will be used to determine the server instead.
|
// The req Host will be used to determine the server instead.
|
||||||
func (n newHTTPServer) RequestTraceAttrs(server string, req *http.Request) []attribute.KeyValue {
|
func (n CurrentHTTPServer) RequestTraceAttrs(server string, req *http.Request) []attribute.KeyValue {
|
||||||
count := 3 // ServerAddress, Method, Scheme
|
count := 3 // ServerAddress, Method, Scheme
|
||||||
|
|
||||||
var host string
|
var host string
|
||||||
var p int
|
var p int
|
||||||
if server == "" {
|
if server == "" {
|
||||||
host, p = splitHostPort(req.Host)
|
host, p = SplitHostPort(req.Host)
|
||||||
} else {
|
} else {
|
||||||
// Prioritize the primary server name.
|
// Prioritize the primary server name.
|
||||||
host, p = splitHostPort(server)
|
host, p = SplitHostPort(server)
|
||||||
if p < 0 {
|
if p < 0 {
|
||||||
_, p = splitHostPort(req.Host)
|
_, p = SplitHostPort(req.Host)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -59,7 +65,7 @@ func (n newHTTPServer) RequestTraceAttrs(server string, req *http.Request) []att
|
|||||||
|
|
||||||
scheme := n.scheme(req.TLS != nil)
|
scheme := n.scheme(req.TLS != nil)
|
||||||
|
|
||||||
if peer, peerPort := splitHostPort(req.RemoteAddr); peer != "" {
|
if peer, peerPort := SplitHostPort(req.RemoteAddr); peer != "" {
|
||||||
// The Go HTTP server sets RemoteAddr to "IP:port", this will not be a
|
// The Go HTTP server sets RemoteAddr to "IP:port", this will not be a
|
||||||
// file-path that would be interpreted with a sock family.
|
// file-path that would be interpreted with a sock family.
|
||||||
count++
|
count++
|
||||||
@ -104,7 +110,7 @@ func (n newHTTPServer) RequestTraceAttrs(server string, req *http.Request) []att
|
|||||||
attrs = append(attrs, methodOriginal)
|
attrs = append(attrs, methodOriginal)
|
||||||
}
|
}
|
||||||
|
|
||||||
if peer, peerPort := splitHostPort(req.RemoteAddr); peer != "" {
|
if peer, peerPort := SplitHostPort(req.RemoteAddr); peer != "" {
|
||||||
// The Go HTTP server sets RemoteAddr to "IP:port", this will not be a
|
// The Go HTTP server sets RemoteAddr to "IP:port", this will not be a
|
||||||
// file-path that would be interpreted with a sock family.
|
// file-path that would be interpreted with a sock family.
|
||||||
attrs = append(attrs, semconvNew.NetworkPeerAddress(peer))
|
attrs = append(attrs, semconvNew.NetworkPeerAddress(peer))
|
||||||
@ -135,7 +141,20 @@ func (n newHTTPServer) RequestTraceAttrs(server string, req *http.Request) []att
|
|||||||
return attrs
|
return attrs
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n newHTTPServer) method(method string) (attribute.KeyValue, attribute.KeyValue) {
|
func (o CurrentHTTPServer) NetworkTransportAttr(network string) attribute.KeyValue {
|
||||||
|
switch network {
|
||||||
|
case "tcp", "tcp4", "tcp6":
|
||||||
|
return semconvNew.NetworkTransportTCP
|
||||||
|
case "udp", "udp4", "udp6":
|
||||||
|
return semconvNew.NetworkTransportUDP
|
||||||
|
case "unix", "unixgram", "unixpacket":
|
||||||
|
return semconvNew.NetworkTransportUnix
|
||||||
|
default:
|
||||||
|
return semconvNew.NetworkTransportPipe
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n CurrentHTTPServer) method(method string) (attribute.KeyValue, attribute.KeyValue) {
|
||||||
if method == "" {
|
if method == "" {
|
||||||
return semconvNew.HTTPRequestMethodGet, attribute.KeyValue{}
|
return semconvNew.HTTPRequestMethodGet, attribute.KeyValue{}
|
||||||
}
|
}
|
||||||
@ -150,7 +169,7 @@ func (n newHTTPServer) method(method string) (attribute.KeyValue, attribute.KeyV
|
|||||||
return semconvNew.HTTPRequestMethodGet, orig
|
return semconvNew.HTTPRequestMethodGet, orig
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n newHTTPServer) scheme(https bool) attribute.KeyValue { // nolint:revive
|
func (n CurrentHTTPServer) scheme(https bool) attribute.KeyValue { // nolint:revive
|
||||||
if https {
|
if https {
|
||||||
return semconvNew.URLScheme("https")
|
return semconvNew.URLScheme("https")
|
||||||
}
|
}
|
||||||
@ -160,7 +179,7 @@ func (n newHTTPServer) scheme(https bool) attribute.KeyValue { // nolint:revive
|
|||||||
// TraceResponse returns trace attributes for telemetry from an HTTP response.
|
// TraceResponse returns trace attributes for telemetry from an HTTP response.
|
||||||
//
|
//
|
||||||
// If any of the fields in the ResponseTelemetry are not set the attribute will be omitted.
|
// If any of the fields in the ResponseTelemetry are not set the attribute will be omitted.
|
||||||
func (n newHTTPServer) ResponseTraceAttrs(resp ResponseTelemetry) []attribute.KeyValue {
|
func (n CurrentHTTPServer) ResponseTraceAttrs(resp ResponseTelemetry) []attribute.KeyValue {
|
||||||
var count int
|
var count int
|
||||||
|
|
||||||
if resp.ReadBytes > 0 {
|
if resp.ReadBytes > 0 {
|
||||||
@ -195,14 +214,94 @@ func (n newHTTPServer) ResponseTraceAttrs(resp ResponseTelemetry) []attribute.Ke
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Route returns the attribute for the route.
|
// Route returns the attribute for the route.
|
||||||
func (n newHTTPServer) Route(route string) attribute.KeyValue {
|
func (n CurrentHTTPServer) Route(route string) attribute.KeyValue {
|
||||||
return semconvNew.HTTPRoute(route)
|
return semconvNew.HTTPRoute(route)
|
||||||
}
|
}
|
||||||
|
|
||||||
type newHTTPClient struct{}
|
func (n CurrentHTTPServer) createMeasures(meter metric.Meter) (metric.Int64Histogram, metric.Int64Histogram, metric.Float64Histogram) {
|
||||||
|
if meter == nil {
|
||||||
|
return noop.Int64Histogram{}, noop.Int64Histogram{}, noop.Float64Histogram{}
|
||||||
|
}
|
||||||
|
|
||||||
|
var err error
|
||||||
|
requestBodySizeHistogram, err := meter.Int64Histogram(
|
||||||
|
semconvNew.HTTPServerRequestBodySizeName,
|
||||||
|
metric.WithUnit(semconvNew.HTTPServerRequestBodySizeUnit),
|
||||||
|
metric.WithDescription(semconvNew.HTTPServerRequestBodySizeDescription),
|
||||||
|
)
|
||||||
|
handleErr(err)
|
||||||
|
|
||||||
|
responseBodySizeHistogram, err := meter.Int64Histogram(
|
||||||
|
semconvNew.HTTPServerResponseBodySizeName,
|
||||||
|
metric.WithUnit(semconvNew.HTTPServerResponseBodySizeUnit),
|
||||||
|
metric.WithDescription(semconvNew.HTTPServerResponseBodySizeDescription),
|
||||||
|
)
|
||||||
|
handleErr(err)
|
||||||
|
requestDurationHistogram, err := meter.Float64Histogram(
|
||||||
|
semconvNew.HTTPServerRequestDurationName,
|
||||||
|
metric.WithUnit(semconvNew.HTTPServerRequestDurationUnit),
|
||||||
|
metric.WithDescription(semconvNew.HTTPServerRequestDurationDescription),
|
||||||
|
)
|
||||||
|
handleErr(err)
|
||||||
|
|
||||||
|
return requestBodySizeHistogram, responseBodySizeHistogram, requestDurationHistogram
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n CurrentHTTPServer) MetricAttributes(server string, req *http.Request, statusCode int, additionalAttributes []attribute.KeyValue) []attribute.KeyValue {
|
||||||
|
num := len(additionalAttributes) + 3
|
||||||
|
var host string
|
||||||
|
var p int
|
||||||
|
if server == "" {
|
||||||
|
host, p = SplitHostPort(req.Host)
|
||||||
|
} else {
|
||||||
|
// Prioritize the primary server name.
|
||||||
|
host, p = SplitHostPort(server)
|
||||||
|
if p < 0 {
|
||||||
|
_, p = SplitHostPort(req.Host)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
hostPort := requiredHTTPPort(req.TLS != nil, p)
|
||||||
|
if hostPort > 0 {
|
||||||
|
num++
|
||||||
|
}
|
||||||
|
protoName, protoVersion := netProtocol(req.Proto)
|
||||||
|
if protoName != "" {
|
||||||
|
num++
|
||||||
|
}
|
||||||
|
if protoVersion != "" {
|
||||||
|
num++
|
||||||
|
}
|
||||||
|
|
||||||
|
if statusCode > 0 {
|
||||||
|
num++
|
||||||
|
}
|
||||||
|
|
||||||
|
attributes := slices.Grow(additionalAttributes, num)
|
||||||
|
attributes = append(attributes,
|
||||||
|
semconvNew.HTTPRequestMethodKey.String(standardizeHTTPMethod(req.Method)),
|
||||||
|
n.scheme(req.TLS != nil),
|
||||||
|
semconvNew.ServerAddress(host))
|
||||||
|
|
||||||
|
if hostPort > 0 {
|
||||||
|
attributes = append(attributes, semconvNew.ServerPort(hostPort))
|
||||||
|
}
|
||||||
|
if protoName != "" {
|
||||||
|
attributes = append(attributes, semconvNew.NetworkProtocolName(protoName))
|
||||||
|
}
|
||||||
|
if protoVersion != "" {
|
||||||
|
attributes = append(attributes, semconvNew.NetworkProtocolVersion(protoVersion))
|
||||||
|
}
|
||||||
|
|
||||||
|
if statusCode > 0 {
|
||||||
|
attributes = append(attributes, semconvNew.HTTPResponseStatusCode(statusCode))
|
||||||
|
}
|
||||||
|
return attributes
|
||||||
|
}
|
||||||
|
|
||||||
|
type CurrentHTTPClient struct{}
|
||||||
|
|
||||||
// RequestTraceAttrs returns trace attributes for an HTTP request made by a client.
|
// RequestTraceAttrs returns trace attributes for an HTTP request made by a client.
|
||||||
func (n newHTTPClient) RequestTraceAttrs(req *http.Request) []attribute.KeyValue {
|
func (n CurrentHTTPClient) RequestTraceAttrs(req *http.Request) []attribute.KeyValue {
|
||||||
/*
|
/*
|
||||||
below attributes are returned:
|
below attributes are returned:
|
||||||
- http.request.method
|
- http.request.method
|
||||||
@ -222,7 +321,7 @@ func (n newHTTPClient) RequestTraceAttrs(req *http.Request) []attribute.KeyValue
|
|||||||
var requestHost string
|
var requestHost string
|
||||||
var requestPort int
|
var requestPort int
|
||||||
for _, hostport := range []string{urlHost, req.Header.Get("Host")} {
|
for _, hostport := range []string{urlHost, req.Header.Get("Host")} {
|
||||||
requestHost, requestPort = splitHostPort(hostport)
|
requestHost, requestPort = SplitHostPort(hostport)
|
||||||
if requestHost != "" || requestPort > 0 {
|
if requestHost != "" || requestPort > 0 {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@ -284,7 +383,7 @@ func (n newHTTPClient) RequestTraceAttrs(req *http.Request) []attribute.KeyValue
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ResponseTraceAttrs returns trace attributes for an HTTP response made by a client.
|
// ResponseTraceAttrs returns trace attributes for an HTTP response made by a client.
|
||||||
func (n newHTTPClient) ResponseTraceAttrs(resp *http.Response) []attribute.KeyValue {
|
func (n CurrentHTTPClient) ResponseTraceAttrs(resp *http.Response) []attribute.KeyValue {
|
||||||
/*
|
/*
|
||||||
below attributes are returned:
|
below attributes are returned:
|
||||||
- http.response.status_code
|
- http.response.status_code
|
||||||
@ -311,7 +410,7 @@ func (n newHTTPClient) ResponseTraceAttrs(resp *http.Response) []attribute.KeyVa
|
|||||||
return attrs
|
return attrs
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n newHTTPClient) ErrorType(err error) attribute.KeyValue {
|
func (n CurrentHTTPClient) ErrorType(err error) attribute.KeyValue {
|
||||||
t := reflect.TypeOf(err)
|
t := reflect.TypeOf(err)
|
||||||
var value string
|
var value string
|
||||||
if t.PkgPath() == "" && t.Name() == "" {
|
if t.PkgPath() == "" && t.Name() == "" {
|
||||||
@ -328,7 +427,7 @@ func (n newHTTPClient) ErrorType(err error) attribute.KeyValue {
|
|||||||
return semconvNew.ErrorTypeKey.String(value)
|
return semconvNew.ErrorTypeKey.String(value)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n newHTTPClient) method(method string) (attribute.KeyValue, attribute.KeyValue) {
|
func (n CurrentHTTPClient) method(method string) (attribute.KeyValue, attribute.KeyValue) {
|
||||||
if method == "" {
|
if method == "" {
|
||||||
return semconvNew.HTTPRequestMethodGet, attribute.KeyValue{}
|
return semconvNew.HTTPRequestMethodGet, attribute.KeyValue{}
|
||||||
}
|
}
|
||||||
@ -343,6 +442,98 @@ func (n newHTTPClient) method(method string) (attribute.KeyValue, attribute.KeyV
|
|||||||
return semconvNew.HTTPRequestMethodGet, orig
|
return semconvNew.HTTPRequestMethodGet, orig
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (n CurrentHTTPClient) createMeasures(meter metric.Meter) (metric.Int64Histogram, metric.Float64Histogram) {
|
||||||
|
if meter == nil {
|
||||||
|
return noop.Int64Histogram{}, noop.Float64Histogram{}
|
||||||
|
}
|
||||||
|
|
||||||
|
var err error
|
||||||
|
requestBodySize, err := meter.Int64Histogram(
|
||||||
|
semconvNew.HTTPClientRequestBodySizeName,
|
||||||
|
metric.WithUnit(semconvNew.HTTPClientRequestBodySizeUnit),
|
||||||
|
metric.WithDescription(semconvNew.HTTPClientRequestBodySizeDescription),
|
||||||
|
)
|
||||||
|
handleErr(err)
|
||||||
|
|
||||||
|
requestDuration, err := meter.Float64Histogram(
|
||||||
|
semconvNew.HTTPClientRequestDurationName,
|
||||||
|
metric.WithUnit(semconvNew.HTTPClientRequestDurationUnit),
|
||||||
|
metric.WithDescription(semconvNew.HTTPClientRequestDurationDescription),
|
||||||
|
)
|
||||||
|
handleErr(err)
|
||||||
|
|
||||||
|
return requestBodySize, requestDuration
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n CurrentHTTPClient) MetricAttributes(req *http.Request, statusCode int, additionalAttributes []attribute.KeyValue) []attribute.KeyValue {
|
||||||
|
num := len(additionalAttributes) + 2
|
||||||
|
var h string
|
||||||
|
if req.URL != nil {
|
||||||
|
h = req.URL.Host
|
||||||
|
}
|
||||||
|
var requestHost string
|
||||||
|
var requestPort int
|
||||||
|
for _, hostport := range []string{h, req.Header.Get("Host")} {
|
||||||
|
requestHost, requestPort = SplitHostPort(hostport)
|
||||||
|
if requestHost != "" || requestPort > 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
port := requiredHTTPPort(req.URL != nil && req.URL.Scheme == "https", requestPort)
|
||||||
|
if port > 0 {
|
||||||
|
num++
|
||||||
|
}
|
||||||
|
|
||||||
|
protoName, protoVersion := netProtocol(req.Proto)
|
||||||
|
if protoName != "" {
|
||||||
|
num++
|
||||||
|
}
|
||||||
|
if protoVersion != "" {
|
||||||
|
num++
|
||||||
|
}
|
||||||
|
|
||||||
|
if statusCode > 0 {
|
||||||
|
num++
|
||||||
|
}
|
||||||
|
|
||||||
|
attributes := slices.Grow(additionalAttributes, num)
|
||||||
|
attributes = append(attributes,
|
||||||
|
semconvNew.HTTPRequestMethodKey.String(standardizeHTTPMethod(req.Method)),
|
||||||
|
semconvNew.ServerAddress(requestHost),
|
||||||
|
n.scheme(req.TLS != nil),
|
||||||
|
)
|
||||||
|
|
||||||
|
if port > 0 {
|
||||||
|
attributes = append(attributes, semconvNew.ServerPort(port))
|
||||||
|
}
|
||||||
|
if protoName != "" {
|
||||||
|
attributes = append(attributes, semconvNew.NetworkProtocolName(protoName))
|
||||||
|
}
|
||||||
|
if protoVersion != "" {
|
||||||
|
attributes = append(attributes, semconvNew.NetworkProtocolVersion(protoVersion))
|
||||||
|
}
|
||||||
|
|
||||||
|
if statusCode > 0 {
|
||||||
|
attributes = append(attributes, semconvNew.HTTPResponseStatusCode(statusCode))
|
||||||
|
}
|
||||||
|
return attributes
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attributes for httptrace.
|
||||||
|
func (n CurrentHTTPClient) TraceAttributes(host string) []attribute.KeyValue {
|
||||||
|
return []attribute.KeyValue{
|
||||||
|
semconvNew.ServerAddress(host),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n CurrentHTTPClient) scheme(https bool) attribute.KeyValue { // nolint:revive
|
||||||
|
if https {
|
||||||
|
return semconvNew.URLScheme("https")
|
||||||
|
}
|
||||||
|
return semconvNew.URLScheme("http")
|
||||||
|
}
|
||||||
|
|
||||||
func isErrorStatusCode(code int) bool {
|
func isErrorStatusCode(code int) bool {
|
||||||
return code >= 400 || code < 100
|
return code >= 400 || code < 100
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
// Code created by gotmpl. DO NOT MODIFY.
|
||||||
|
// source: internal/shared/semconv/util.go.tmpl
|
||||||
|
|
||||||
// Copyright The OpenTelemetry Authors
|
// Copyright The OpenTelemetry Authors
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
@ -14,14 +17,14 @@ import (
|
|||||||
semconvNew "go.opentelemetry.io/otel/semconv/v1.26.0"
|
semconvNew "go.opentelemetry.io/otel/semconv/v1.26.0"
|
||||||
)
|
)
|
||||||
|
|
||||||
// splitHostPort splits a network address hostport of the form "host",
|
// SplitHostPort splits a network address hostport of the form "host",
|
||||||
// "host%zone", "[host]", "[host%zone], "host:port", "host%zone:port",
|
// "host%zone", "[host]", "[host%zone], "host:port", "host%zone:port",
|
||||||
// "[host]:port", "[host%zone]:port", or ":port" into host or host%zone and
|
// "[host]:port", "[host%zone]:port", or ":port" into host or host%zone and
|
||||||
// port.
|
// port.
|
||||||
//
|
//
|
||||||
// An empty host is returned if it is not provided or unparsable. A negative
|
// An empty host is returned if it is not provided or unparsable. A negative
|
||||||
// port is returned if it is not provided or unparsable.
|
// port is returned if it is not provided or unparsable.
|
||||||
func splitHostPort(hostport string) (host string, port int) {
|
func SplitHostPort(hostport string) (host string, port int) {
|
||||||
port = -1
|
port = -1
|
||||||
|
|
||||||
if strings.HasPrefix(hostport, "[") {
|
if strings.HasPrefix(hostport, "[") {
|
||||||
@ -75,7 +78,16 @@ func serverClientIP(xForwardedFor string) string {
|
|||||||
|
|
||||||
func netProtocol(proto string) (name string, version string) {
|
func netProtocol(proto string) (name string, version string) {
|
||||||
name, version, _ = strings.Cut(proto, "/")
|
name, version, _ = strings.Cut(proto, "/")
|
||||||
name = strings.ToLower(name)
|
switch name {
|
||||||
|
case "HTTP":
|
||||||
|
name = "http"
|
||||||
|
case "QUIC":
|
||||||
|
name = "quic"
|
||||||
|
case "SPDY":
|
||||||
|
name = "spdy"
|
||||||
|
default:
|
||||||
|
name = strings.ToLower(name)
|
||||||
|
}
|
||||||
return name, version
|
return name, version
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -96,3 +108,13 @@ func handleErr(err error) {
|
|||||||
otel.Handle(err)
|
otel.Handle(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func standardizeHTTPMethod(method string) string {
|
||||||
|
method = strings.ToUpper(method)
|
||||||
|
switch method {
|
||||||
|
case http.MethodConnect, http.MethodDelete, http.MethodGet, http.MethodHead, http.MethodOptions, http.MethodPatch, http.MethodPost, http.MethodPut, http.MethodTrace:
|
||||||
|
default:
|
||||||
|
method = "_OTHER"
|
||||||
|
}
|
||||||
|
return method
|
||||||
|
}
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
// Code created by gotmpl. DO NOT MODIFY.
|
||||||
|
// source: internal/shared/semconv/v120.0.go.tmpl
|
||||||
|
|
||||||
// Copyright The OpenTelemetry Authors
|
// Copyright The OpenTelemetry Authors
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
@ -8,7 +11,6 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"slices"
|
"slices"
|
||||||
"strings"
|
|
||||||
|
|
||||||
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconvutil"
|
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconvutil"
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
@ -17,7 +19,7 @@ import (
|
|||||||
semconv "go.opentelemetry.io/otel/semconv/v1.20.0"
|
semconv "go.opentelemetry.io/otel/semconv/v1.20.0"
|
||||||
)
|
)
|
||||||
|
|
||||||
type oldHTTPServer struct{}
|
type OldHTTPServer struct{}
|
||||||
|
|
||||||
// RequestTraceAttrs returns trace attributes for an HTTP request received by a
|
// RequestTraceAttrs returns trace attributes for an HTTP request received by a
|
||||||
// server.
|
// server.
|
||||||
@ -35,14 +37,18 @@ type oldHTTPServer struct{}
|
|||||||
//
|
//
|
||||||
// If the primary server name is not known, server should be an empty string.
|
// If the primary server name is not known, server should be an empty string.
|
||||||
// The req Host will be used to determine the server instead.
|
// The req Host will be used to determine the server instead.
|
||||||
func (o oldHTTPServer) RequestTraceAttrs(server string, req *http.Request) []attribute.KeyValue {
|
func (o OldHTTPServer) RequestTraceAttrs(server string, req *http.Request) []attribute.KeyValue {
|
||||||
return semconvutil.HTTPServerRequest(server, req)
|
return semconvutil.HTTPServerRequest(server, req)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (o OldHTTPServer) NetworkTransportAttr(network string) attribute.KeyValue {
|
||||||
|
return semconvutil.NetTransport(network)
|
||||||
|
}
|
||||||
|
|
||||||
// ResponseTraceAttrs returns trace attributes for telemetry from an HTTP response.
|
// ResponseTraceAttrs returns trace attributes for telemetry from an HTTP response.
|
||||||
//
|
//
|
||||||
// If any of the fields in the ResponseTelemetry are not set the attribute will be omitted.
|
// If any of the fields in the ResponseTelemetry are not set the attribute will be omitted.
|
||||||
func (o oldHTTPServer) ResponseTraceAttrs(resp ResponseTelemetry) []attribute.KeyValue {
|
func (o OldHTTPServer) ResponseTraceAttrs(resp ResponseTelemetry) []attribute.KeyValue {
|
||||||
attributes := []attribute.KeyValue{}
|
attributes := []attribute.KeyValue{}
|
||||||
|
|
||||||
if resp.ReadBytes > 0 {
|
if resp.ReadBytes > 0 {
|
||||||
@ -67,7 +73,7 @@ func (o oldHTTPServer) ResponseTraceAttrs(resp ResponseTelemetry) []attribute.Ke
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Route returns the attribute for the route.
|
// Route returns the attribute for the route.
|
||||||
func (o oldHTTPServer) Route(route string) attribute.KeyValue {
|
func (o OldHTTPServer) Route(route string) attribute.KeyValue {
|
||||||
return semconv.HTTPRoute(route)
|
return semconv.HTTPRoute(route)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -84,7 +90,7 @@ const (
|
|||||||
serverDuration = "http.server.duration" // Incoming end to end duration, milliseconds
|
serverDuration = "http.server.duration" // Incoming end to end duration, milliseconds
|
||||||
)
|
)
|
||||||
|
|
||||||
func (h oldHTTPServer) createMeasures(meter metric.Meter) (metric.Int64Counter, metric.Int64Counter, metric.Float64Histogram) {
|
func (h OldHTTPServer) createMeasures(meter metric.Meter) (metric.Int64Counter, metric.Int64Counter, metric.Float64Histogram) {
|
||||||
if meter == nil {
|
if meter == nil {
|
||||||
return noop.Int64Counter{}, noop.Int64Counter{}, noop.Float64Histogram{}
|
return noop.Int64Counter{}, noop.Int64Counter{}, noop.Float64Histogram{}
|
||||||
}
|
}
|
||||||
@ -113,17 +119,17 @@ func (h oldHTTPServer) createMeasures(meter metric.Meter) (metric.Int64Counter,
|
|||||||
return requestBytesCounter, responseBytesCounter, serverLatencyMeasure
|
return requestBytesCounter, responseBytesCounter, serverLatencyMeasure
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o oldHTTPServer) MetricAttributes(server string, req *http.Request, statusCode int, additionalAttributes []attribute.KeyValue) []attribute.KeyValue {
|
func (o OldHTTPServer) MetricAttributes(server string, req *http.Request, statusCode int, additionalAttributes []attribute.KeyValue) []attribute.KeyValue {
|
||||||
n := len(additionalAttributes) + 3
|
n := len(additionalAttributes) + 3
|
||||||
var host string
|
var host string
|
||||||
var p int
|
var p int
|
||||||
if server == "" {
|
if server == "" {
|
||||||
host, p = splitHostPort(req.Host)
|
host, p = SplitHostPort(req.Host)
|
||||||
} else {
|
} else {
|
||||||
// Prioritize the primary server name.
|
// Prioritize the primary server name.
|
||||||
host, p = splitHostPort(server)
|
host, p = SplitHostPort(server)
|
||||||
if p < 0 {
|
if p < 0 {
|
||||||
_, p = splitHostPort(req.Host)
|
_, p = SplitHostPort(req.Host)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
hostPort := requiredHTTPPort(req.TLS != nil, p)
|
hostPort := requiredHTTPPort(req.TLS != nil, p)
|
||||||
@ -144,7 +150,7 @@ func (o oldHTTPServer) MetricAttributes(server string, req *http.Request, status
|
|||||||
|
|
||||||
attributes := slices.Grow(additionalAttributes, n)
|
attributes := slices.Grow(additionalAttributes, n)
|
||||||
attributes = append(attributes,
|
attributes = append(attributes,
|
||||||
standardizeHTTPMethodMetric(req.Method),
|
semconv.HTTPMethod(standardizeHTTPMethod(req.Method)),
|
||||||
o.scheme(req.TLS != nil),
|
o.scheme(req.TLS != nil),
|
||||||
semconv.NetHostName(host))
|
semconv.NetHostName(host))
|
||||||
|
|
||||||
@ -164,24 +170,24 @@ func (o oldHTTPServer) MetricAttributes(server string, req *http.Request, status
|
|||||||
return attributes
|
return attributes
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o oldHTTPServer) scheme(https bool) attribute.KeyValue { // nolint:revive
|
func (o OldHTTPServer) scheme(https bool) attribute.KeyValue { // nolint:revive
|
||||||
if https {
|
if https {
|
||||||
return semconv.HTTPSchemeHTTPS
|
return semconv.HTTPSchemeHTTPS
|
||||||
}
|
}
|
||||||
return semconv.HTTPSchemeHTTP
|
return semconv.HTTPSchemeHTTP
|
||||||
}
|
}
|
||||||
|
|
||||||
type oldHTTPClient struct{}
|
type OldHTTPClient struct{}
|
||||||
|
|
||||||
func (o oldHTTPClient) RequestTraceAttrs(req *http.Request) []attribute.KeyValue {
|
func (o OldHTTPClient) RequestTraceAttrs(req *http.Request) []attribute.KeyValue {
|
||||||
return semconvutil.HTTPClientRequest(req)
|
return semconvutil.HTTPClientRequest(req)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o oldHTTPClient) ResponseTraceAttrs(resp *http.Response) []attribute.KeyValue {
|
func (o OldHTTPClient) ResponseTraceAttrs(resp *http.Response) []attribute.KeyValue {
|
||||||
return semconvutil.HTTPClientResponse(resp)
|
return semconvutil.HTTPClientResponse(resp)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o oldHTTPClient) MetricAttributes(req *http.Request, statusCode int, additionalAttributes []attribute.KeyValue) []attribute.KeyValue {
|
func (o OldHTTPClient) MetricAttributes(req *http.Request, statusCode int, additionalAttributes []attribute.KeyValue) []attribute.KeyValue {
|
||||||
/* The following semantic conventions are returned if present:
|
/* The following semantic conventions are returned if present:
|
||||||
http.method string
|
http.method string
|
||||||
http.status_code int
|
http.status_code int
|
||||||
@ -197,7 +203,7 @@ func (o oldHTTPClient) MetricAttributes(req *http.Request, statusCode int, addit
|
|||||||
var requestHost string
|
var requestHost string
|
||||||
var requestPort int
|
var requestPort int
|
||||||
for _, hostport := range []string{h, req.Header.Get("Host")} {
|
for _, hostport := range []string{h, req.Header.Get("Host")} {
|
||||||
requestHost, requestPort = splitHostPort(hostport)
|
requestHost, requestPort = SplitHostPort(hostport)
|
||||||
if requestHost != "" || requestPort > 0 {
|
if requestHost != "" || requestPort > 0 {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@ -214,7 +220,7 @@ func (o oldHTTPClient) MetricAttributes(req *http.Request, statusCode int, addit
|
|||||||
|
|
||||||
attributes := slices.Grow(additionalAttributes, n)
|
attributes := slices.Grow(additionalAttributes, n)
|
||||||
attributes = append(attributes,
|
attributes = append(attributes,
|
||||||
standardizeHTTPMethodMetric(req.Method),
|
semconv.HTTPMethod(standardizeHTTPMethod(req.Method)),
|
||||||
semconv.NetPeerName(requestHost),
|
semconv.NetPeerName(requestHost),
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -235,7 +241,7 @@ const (
|
|||||||
clientDuration = "http.client.duration" // Incoming end to end duration, milliseconds
|
clientDuration = "http.client.duration" // Incoming end to end duration, milliseconds
|
||||||
)
|
)
|
||||||
|
|
||||||
func (o oldHTTPClient) createMeasures(meter metric.Meter) (metric.Int64Counter, metric.Int64Counter, metric.Float64Histogram) {
|
func (o OldHTTPClient) createMeasures(meter metric.Meter) (metric.Int64Counter, metric.Int64Counter, metric.Float64Histogram) {
|
||||||
if meter == nil {
|
if meter == nil {
|
||||||
return noop.Int64Counter{}, noop.Int64Counter{}, noop.Float64Histogram{}
|
return noop.Int64Counter{}, noop.Int64Counter{}, noop.Float64Histogram{}
|
||||||
}
|
}
|
||||||
@ -263,12 +269,9 @@ func (o oldHTTPClient) createMeasures(meter metric.Meter) (metric.Int64Counter,
|
|||||||
return requestBytesCounter, responseBytesCounter, latencyMeasure
|
return requestBytesCounter, responseBytesCounter, latencyMeasure
|
||||||
}
|
}
|
||||||
|
|
||||||
func standardizeHTTPMethodMetric(method string) attribute.KeyValue {
|
// Attributes for httptrace.
|
||||||
method = strings.ToUpper(method)
|
func (c OldHTTPClient) TraceAttributes(host string) []attribute.KeyValue {
|
||||||
switch method {
|
return []attribute.KeyValue{
|
||||||
case http.MethodConnect, http.MethodDelete, http.MethodGet, http.MethodHead, http.MethodOptions, http.MethodPatch, http.MethodPost, http.MethodPut, http.MethodTrace:
|
semconv.NetHostName(host),
|
||||||
default:
|
|
||||||
method = "_OTHER"
|
|
||||||
}
|
}
|
||||||
return semconv.HTTPMethod(method)
|
|
||||||
}
|
}
|
||||||
|
@ -200,6 +200,15 @@ func splitHostPort(hostport string) (host string, port int) {
|
|||||||
|
|
||||||
func netProtocol(proto string) (name string, version string) {
|
func netProtocol(proto string) (name string, version string) {
|
||||||
name, version, _ = strings.Cut(proto, "/")
|
name, version, _ = strings.Cut(proto, "/")
|
||||||
name = strings.ToLower(name)
|
switch name {
|
||||||
|
case "HTTP":
|
||||||
|
name = "http"
|
||||||
|
case "QUIC":
|
||||||
|
name = "quic"
|
||||||
|
case "SPDY":
|
||||||
|
name = "spdy"
|
||||||
|
default:
|
||||||
|
name = strings.ToLower(name)
|
||||||
|
}
|
||||||
return name, version
|
return name, version
|
||||||
}
|
}
|
||||||
|
29
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/start_time_context.go
generated
vendored
Normal file
29
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/start_time_context.go
generated
vendored
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package otelhttp // import "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type startTimeContextKeyType int
|
||||||
|
|
||||||
|
const startTimeContextKey startTimeContextKeyType = 0
|
||||||
|
|
||||||
|
// ContextWithStartTime returns a new context with the provided start time. The
|
||||||
|
// start time will be used for metrics and traces emitted by the
|
||||||
|
// instrumentation. Only one labeller can be injected into the context.
|
||||||
|
// Injecting it multiple times will override the previous calls.
|
||||||
|
func ContextWithStartTime(parent context.Context, start time.Time) context.Context {
|
||||||
|
return context.WithValue(parent, startTimeContextKey, start)
|
||||||
|
}
|
||||||
|
|
||||||
|
// StartTimeFromContext retrieves a time.Time from the provided context if one
|
||||||
|
// is available. If no start time was found in the provided context, a new,
|
||||||
|
// zero start time is returned and the second return value is false.
|
||||||
|
func StartTimeFromContext(ctx context.Context) time.Time {
|
||||||
|
t, _ := ctx.Value(startTimeContextKey).(time.Time)
|
||||||
|
return t
|
||||||
|
}
|
2
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/transport.go
generated
vendored
2
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/transport.go
generated
vendored
@ -153,7 +153,7 @@ func (t *Transport) RoundTrip(r *http.Request) (*http.Response, error) {
|
|||||||
|
|
||||||
// For handling response bytes we leverage a callback when the client reads the http response
|
// For handling response bytes we leverage a callback when the client reads the http response
|
||||||
readRecordFunc := func(n int64) {
|
readRecordFunc := func(n int64) {
|
||||||
t.semconv.RecordResponseSize(ctx, n, metricOpts.AddOptions())
|
t.semconv.RecordResponseSize(ctx, n, metricOpts)
|
||||||
}
|
}
|
||||||
|
|
||||||
// traces
|
// traces
|
||||||
|
2
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/version.go
generated
vendored
2
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/version.go
generated
vendored
@ -5,7 +5,7 @@ package otelhttp // import "go.opentelemetry.io/contrib/instrumentation/net/http
|
|||||||
|
|
||||||
// Version is the current release version of the otelhttp instrumentation.
|
// Version is the current release version of the otelhttp instrumentation.
|
||||||
func Version() string {
|
func Version() string {
|
||||||
return "0.56.0"
|
return "0.60.0"
|
||||||
// This string is updated by the pre_release.sh script during release
|
// This string is updated by the pre_release.sh script during release
|
||||||
}
|
}
|
||||||
|
|
||||||
|
9
vendor/go.opentelemetry.io/otel/.gitignore
generated
vendored
9
vendor/go.opentelemetry.io/otel/.gitignore
generated
vendored
@ -1,6 +1,7 @@
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
Thumbs.db
|
Thumbs.db
|
||||||
|
|
||||||
|
.cache/
|
||||||
.tools/
|
.tools/
|
||||||
venv/
|
venv/
|
||||||
.idea/
|
.idea/
|
||||||
@ -12,11 +13,3 @@ go.work
|
|||||||
go.work.sum
|
go.work.sum
|
||||||
|
|
||||||
gen/
|
gen/
|
||||||
|
|
||||||
/example/dice/dice
|
|
||||||
/example/namedtracer/namedtracer
|
|
||||||
/example/otel-collector/otel-collector
|
|
||||||
/example/opencensus/opencensus
|
|
||||||
/example/passthrough/passthrough
|
|
||||||
/example/prometheus/prometheus
|
|
||||||
/example/zipkin/zipkin
|
|
||||||
|
125
vendor/go.opentelemetry.io/otel/.golangci.yml
generated
vendored
125
vendor/go.opentelemetry.io/otel/.golangci.yml
generated
vendored
@ -22,14 +22,16 @@ linters:
|
|||||||
- govet
|
- govet
|
||||||
- ineffassign
|
- ineffassign
|
||||||
- misspell
|
- misspell
|
||||||
|
- perfsprint
|
||||||
- revive
|
- revive
|
||||||
- staticcheck
|
- staticcheck
|
||||||
- tenv
|
|
||||||
- testifylint
|
- testifylint
|
||||||
- typecheck
|
- typecheck
|
||||||
- unconvert
|
- unconvert
|
||||||
- unused
|
- unused
|
||||||
- unparam
|
- unparam
|
||||||
|
- usestdlibvars
|
||||||
|
- usetesting
|
||||||
|
|
||||||
issues:
|
issues:
|
||||||
# Maximum issues count per one linter.
|
# Maximum issues count per one linter.
|
||||||
@ -61,10 +63,11 @@ 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.
|
# It's okay to not run gosec and perfsprint in a test.
|
||||||
- path: _test\.go
|
- path: _test\.go
|
||||||
linters:
|
linters:
|
||||||
- gosec
|
- gosec
|
||||||
|
- perfsprint
|
||||||
# Ignoring gosec G404: Use of weak random number generator (math/rand instead of crypto/rand)
|
# Ignoring gosec G404: Use of weak random number generator (math/rand instead of crypto/rand)
|
||||||
# as we commonly use it in tests and examples.
|
# as we commonly use it in tests and examples.
|
||||||
- text: "G404:"
|
- text: "G404:"
|
||||||
@ -95,6 +98,13 @@ linters-settings:
|
|||||||
- pkg: "crypto/md5"
|
- pkg: "crypto/md5"
|
||||||
- pkg: "crypto/sha1"
|
- pkg: "crypto/sha1"
|
||||||
- pkg: "crypto/**/pkix"
|
- pkg: "crypto/**/pkix"
|
||||||
|
auto/sdk:
|
||||||
|
files:
|
||||||
|
- "!internal/global/trace.go"
|
||||||
|
- "~internal/global/trace_test.go"
|
||||||
|
deny:
|
||||||
|
- pkg: "go.opentelemetry.io/auto/sdk"
|
||||||
|
desc: Do not use SDK from automatic instrumentation.
|
||||||
otlp-internal:
|
otlp-internal:
|
||||||
files:
|
files:
|
||||||
- "!**/exporters/otlp/internal/**/*.go"
|
- "!**/exporters/otlp/internal/**/*.go"
|
||||||
@ -127,8 +137,6 @@ linters-settings:
|
|||||||
- "**/metric/**/*.go"
|
- "**/metric/**/*.go"
|
||||||
- "**/bridge/*.go"
|
- "**/bridge/*.go"
|
||||||
- "**/bridge/**/*.go"
|
- "**/bridge/**/*.go"
|
||||||
- "**/example/*.go"
|
|
||||||
- "**/example/**/*.go"
|
|
||||||
- "**/trace/*.go"
|
- "**/trace/*.go"
|
||||||
- "**/trace/**/*.go"
|
- "**/trace/**/*.go"
|
||||||
- "**/log/*.go"
|
- "**/log/*.go"
|
||||||
@ -156,137 +164,71 @@ linters-settings:
|
|||||||
locale: US
|
locale: US
|
||||||
ignore-words:
|
ignore-words:
|
||||||
- cancelled
|
- cancelled
|
||||||
|
perfsprint:
|
||||||
|
err-error: true
|
||||||
|
errorf: true
|
||||||
|
int-conversion: true
|
||||||
|
sprintf1: true
|
||||||
|
strconcat: true
|
||||||
revive:
|
revive:
|
||||||
# Sets the default failure confidence.
|
# Sets the default failure confidence.
|
||||||
# This means that linting errors with less than 0.8 confidence will be ignored.
|
# This means that linting errors with less than 0.8 confidence will be ignored.
|
||||||
# Default: 0.8
|
# Default: 0.8
|
||||||
confidence: 0.01
|
confidence: 0.01
|
||||||
|
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md
|
||||||
rules:
|
rules:
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#blank-imports
|
|
||||||
- name: blank-imports
|
- name: blank-imports
|
||||||
disabled: false
|
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#bool-literal-in-expr
|
|
||||||
- name: bool-literal-in-expr
|
- name: bool-literal-in-expr
|
||||||
disabled: false
|
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#constant-logical-expr
|
|
||||||
- name: constant-logical-expr
|
- name: constant-logical-expr
|
||||||
disabled: false
|
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#context-as-argument
|
|
||||||
# TODO (#3372) re-enable linter when it is compatible. https://github.com/golangci/golangci-lint/issues/3280
|
|
||||||
- name: context-as-argument
|
- name: context-as-argument
|
||||||
disabled: true
|
disabled: true
|
||||||
arguments:
|
arguments:
|
||||||
allowTypesBefore: "*testing.T"
|
- allowTypesBefore: "*testing.T"
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#context-keys-type
|
|
||||||
- name: context-keys-type
|
- name: context-keys-type
|
||||||
disabled: false
|
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#deep-exit
|
|
||||||
- name: deep-exit
|
- name: deep-exit
|
||||||
disabled: false
|
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#defer
|
|
||||||
- name: defer
|
- name: defer
|
||||||
disabled: false
|
|
||||||
arguments:
|
arguments:
|
||||||
- ["call-chain", "loop"]
|
- ["call-chain", "loop"]
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#dot-imports
|
|
||||||
- name: dot-imports
|
- name: dot-imports
|
||||||
disabled: false
|
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#duplicated-imports
|
|
||||||
- name: duplicated-imports
|
- name: duplicated-imports
|
||||||
disabled: false
|
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#early-return
|
|
||||||
- name: early-return
|
- name: early-return
|
||||||
disabled: false
|
arguments:
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#empty-block
|
- "preserveScope"
|
||||||
- name: empty-block
|
- name: empty-block
|
||||||
disabled: false
|
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#empty-lines
|
|
||||||
- name: empty-lines
|
- name: empty-lines
|
||||||
disabled: false
|
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#error-naming
|
|
||||||
- name: error-naming
|
- name: error-naming
|
||||||
disabled: false
|
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#error-return
|
|
||||||
- name: error-return
|
- name: error-return
|
||||||
disabled: false
|
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#error-strings
|
|
||||||
- name: error-strings
|
- name: error-strings
|
||||||
disabled: false
|
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#errorf
|
|
||||||
- name: errorf
|
- name: errorf
|
||||||
disabled: false
|
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#exported
|
|
||||||
- name: exported
|
- name: exported
|
||||||
disabled: false
|
|
||||||
arguments:
|
arguments:
|
||||||
- "sayRepetitiveInsteadOfStutters"
|
- "sayRepetitiveInsteadOfStutters"
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#flag-parameter
|
|
||||||
- name: flag-parameter
|
- name: flag-parameter
|
||||||
disabled: false
|
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#identical-branches
|
|
||||||
- name: identical-branches
|
- name: identical-branches
|
||||||
disabled: false
|
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#if-return
|
|
||||||
- name: if-return
|
- name: if-return
|
||||||
disabled: false
|
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#increment-decrement
|
|
||||||
- name: increment-decrement
|
|
||||||
disabled: false
|
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#indent-error-flow
|
|
||||||
- name: indent-error-flow
|
|
||||||
disabled: false
|
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#import-shadowing
|
|
||||||
- name: import-shadowing
|
- name: import-shadowing
|
||||||
disabled: false
|
- name: increment-decrement
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#package-comments
|
- name: indent-error-flow
|
||||||
|
arguments:
|
||||||
|
- "preserveScope"
|
||||||
- name: package-comments
|
- name: package-comments
|
||||||
disabled: false
|
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#range
|
|
||||||
- name: range
|
- name: range
|
||||||
disabled: false
|
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#range-val-in-closure
|
|
||||||
- name: range-val-in-closure
|
- name: range-val-in-closure
|
||||||
disabled: false
|
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#range-val-address
|
|
||||||
- name: range-val-address
|
- name: range-val-address
|
||||||
disabled: false
|
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#redefines-builtin-id
|
|
||||||
- name: redefines-builtin-id
|
- name: redefines-builtin-id
|
||||||
disabled: false
|
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#string-format
|
|
||||||
- name: string-format
|
- name: string-format
|
||||||
disabled: false
|
|
||||||
arguments:
|
arguments:
|
||||||
- - panic
|
- - panic
|
||||||
- '/^[^\n]*$/'
|
- '/^[^\n]*$/'
|
||||||
- must not contain line breaks
|
- must not contain line breaks
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#struct-tag
|
|
||||||
- name: struct-tag
|
- name: struct-tag
|
||||||
disabled: false
|
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#superfluous-else
|
|
||||||
- name: superfluous-else
|
- name: superfluous-else
|
||||||
disabled: false
|
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#time-equal
|
|
||||||
- name: time-equal
|
|
||||||
disabled: false
|
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#var-naming
|
|
||||||
- name: var-naming
|
|
||||||
disabled: false
|
|
||||||
arguments:
|
arguments:
|
||||||
- ["ID"] # AllowList
|
- "preserveScope"
|
||||||
- ["Otel", "Aws", "Gcp"] # DenyList
|
- name: time-equal
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#var-declaration
|
|
||||||
- name: var-declaration
|
|
||||||
disabled: false
|
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#unconditional-recursion
|
|
||||||
- name: unconditional-recursion
|
- name: unconditional-recursion
|
||||||
disabled: false
|
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#unexported-return
|
|
||||||
- name: unexported-return
|
- name: unexported-return
|
||||||
disabled: false
|
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#unhandled-error
|
|
||||||
- name: unhandled-error
|
- name: unhandled-error
|
||||||
disabled: false
|
|
||||||
arguments:
|
arguments:
|
||||||
- "fmt.Fprint"
|
- "fmt.Fprint"
|
||||||
- "fmt.Fprintf"
|
- "fmt.Fprintf"
|
||||||
@ -294,15 +236,14 @@ linters-settings:
|
|||||||
- "fmt.Print"
|
- "fmt.Print"
|
||||||
- "fmt.Printf"
|
- "fmt.Printf"
|
||||||
- "fmt.Println"
|
- "fmt.Println"
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#unnecessary-stmt
|
|
||||||
- name: unnecessary-stmt
|
- name: unnecessary-stmt
|
||||||
disabled: false
|
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#useless-break
|
|
||||||
- name: useless-break
|
- name: useless-break
|
||||||
disabled: false
|
- name: var-declaration
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#waitgroup-by-value
|
- name: var-naming
|
||||||
|
arguments:
|
||||||
|
- ["ID"] # AllowList
|
||||||
|
- ["Otel", "Aws", "Gcp"] # DenyList
|
||||||
- name: waitgroup-by-value
|
- name: waitgroup-by-value
|
||||||
disabled: false
|
|
||||||
testifylint:
|
testifylint:
|
||||||
enable-all: true
|
enable-all: true
|
||||||
disable:
|
disable:
|
||||||
|
134
vendor/go.opentelemetry.io/otel/CHANGELOG.md
generated
vendored
134
vendor/go.opentelemetry.io/otel/CHANGELOG.md
generated
vendored
@ -11,6 +11,133 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
|
|||||||
<!-- Released section -->
|
<!-- Released section -->
|
||||||
<!-- Don't change this section unless doing release -->
|
<!-- Don't change this section unless doing release -->
|
||||||
|
|
||||||
|
## [1.35.0/0.57.0/0.11.0] 2025-03-05
|
||||||
|
|
||||||
|
This release is the last to support [Go 1.22].
|
||||||
|
The next release will require at least [Go 1.23].
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add `ValueFromAttribute` and `KeyValueFromAttribute` in `go.opentelemetry.io/otel/log`. (#6180)
|
||||||
|
- Add `EventName` and `SetEventName` to `Record` in `go.opentelemetry.io/otel/log`. (#6187)
|
||||||
|
- Add `EventName` to `RecordFactory` in `go.opentelemetry.io/otel/log/logtest`. (#6187)
|
||||||
|
- `AssertRecordEqual` in `go.opentelemetry.io/otel/log/logtest` checks `Record.EventName`. (#6187)
|
||||||
|
- Add `EventName` and `SetEventName` to `Record` in `go.opentelemetry.io/otel/sdk/log`. (#6193)
|
||||||
|
- Add `EventName` to `RecordFactory` in `go.opentelemetry.io/otel/sdk/log/logtest`. (#6193)
|
||||||
|
- Emit `Record.EventName` field in `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc`. (#6211)
|
||||||
|
- Emit `Record.EventName` field in `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp`. (#6211)
|
||||||
|
- Emit `Record.EventName` field in `go.opentelemetry.io/otel/exporters/stdout/stdoutlog` (#6210)
|
||||||
|
- The `go.opentelemetry.io/otel/semconv/v1.28.0` package.
|
||||||
|
The package contains semantic conventions from the `v1.28.0` version of the OpenTelemetry Semantic Conventions.
|
||||||
|
See the [migration documentation](./semconv/v1.28.0/MIGRATION.md) for information on how to upgrade from `go.opentelemetry.io/otel/semconv/v1.27.0`(#6236)
|
||||||
|
- The `go.opentelemetry.io/otel/semconv/v1.30.0` package.
|
||||||
|
The package contains semantic conventions from the `v1.30.0` version of the OpenTelemetry Semantic Conventions.
|
||||||
|
See the [migration documentation](./semconv/v1.30.0/MIGRATION.md) for information on how to upgrade from `go.opentelemetry.io/otel/semconv/v1.28.0`(#6240)
|
||||||
|
- Document the pitfalls of using `Resource` as a comparable type.
|
||||||
|
`Resource.Equal` and `Resource.Equivalent` should be used instead. (#6272)
|
||||||
|
- Support [Go 1.24]. (#6304)
|
||||||
|
- Add `FilterProcessor` and `EnabledParameters` in `go.opentelemetry.io/otel/sdk/log`.
|
||||||
|
It replaces `go.opentelemetry.io/otel/sdk/log/internal/x.FilterProcessor`.
|
||||||
|
Compared to previous version it additionally gives the possibility to filter by resource and instrumentation scope. (#6317)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Update `github.com/prometheus/common` to `v0.62.0`, which changes the `NameValidationScheme` to `NoEscaping`.
|
||||||
|
This allows metrics names to keep original delimiters (e.g. `.`), rather than replacing with underscores.
|
||||||
|
This is controlled by the `Content-Type` header, or can be reverted by setting `NameValidationScheme` to `LegacyValidation` in `github.com/prometheus/common/model`. (#6198)
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
- Eliminate goroutine leak for the processor returned by `NewSimpleSpanProcessor` in `go.opentelemetry.io/otel/sdk/trace` when `Shutdown` is called and the passed `ctx` is canceled and `SpanExporter.Shutdown` has not returned. (#6368)
|
||||||
|
- Eliminate goroutine leak for the processor returned by `NewBatchSpanProcessor` in `go.opentelemetry.io/otel/sdk/trace` when `ForceFlush` is called and the passed `ctx` is canceled and `SpanExporter.Export` has not returned. (#6369)
|
||||||
|
|
||||||
|
## [1.34.0/0.56.0/0.10.0] 2025-01-17
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Remove the notices from `Logger` to make the whole Logs API user-facing in `go.opentelemetry.io/otel/log`. (#6167)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Relax minimum Go version to 1.22.0 in various modules. (#6073)
|
||||||
|
- The `Type` name logged for the `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc` client is corrected from `otlphttpgrpc` to `otlptracegrpc`. (#6143)
|
||||||
|
- The `Type` name logged for the `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlphttpgrpc` client is corrected from `otlphttphttp` to `otlptracehttp`. (#6143)
|
||||||
|
|
||||||
|
## [1.33.0/0.55.0/0.9.0/0.0.12] 2024-12-12
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add `Reset` method to `SpanRecorder` in `go.opentelemetry.io/otel/sdk/trace/tracetest`. (#5994)
|
||||||
|
- Add `EnabledInstrument` interface in `go.opentelemetry.io/otel/sdk/metric/internal/x`.
|
||||||
|
This is an experimental interface that is implemented by synchronous instruments provided by `go.opentelemetry.io/otel/sdk/metric`.
|
||||||
|
Users can use it to avoid performing computationally expensive operations when recording measurements.
|
||||||
|
It does not fall within the scope of the OpenTelemetry Go versioning and stability [policy](./VERSIONING.md) and it may be changed in backwards incompatible ways or removed in feature releases. (#6016)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- The default global API now supports full auto-instrumentation from the `go.opentelemetry.io/auto` package.
|
||||||
|
See that package for more information. (#5920)
|
||||||
|
- Propagate non-retryable error messages to client in `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp`. (#5929)
|
||||||
|
- Propagate non-retryable error messages to client in `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp`. (#5929)
|
||||||
|
- Propagate non-retryable error messages to client in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp`. (#5929)
|
||||||
|
- Performance improvements for attribute value `AsStringSlice`, `AsFloat64Slice`, `AsInt64Slice`, `AsBoolSlice`. (#6011)
|
||||||
|
- Change `EnabledParameters` to have a `Severity` field instead of a getter and setter in `go.opentelemetry.io/otel/log`. (#6009)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix inconsistent request body closing in `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp`. (#5954)
|
||||||
|
- Fix inconsistent request body closing in `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp`. (#5954)
|
||||||
|
- Fix inconsistent request body closing in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp`. (#5954)
|
||||||
|
- Fix invalid exemplar keys in `go.opentelemetry.io/otel/exporters/prometheus`. (#5995)
|
||||||
|
- Fix attribute value truncation in `go.opentelemetry.io/otel/sdk/trace`. (#5997)
|
||||||
|
- Fix attribute value truncation in `go.opentelemetry.io/otel/sdk/log`. (#6032)
|
||||||
|
|
||||||
|
## [1.32.0/0.54.0/0.8.0/0.0.11] 2024-11-08
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add `go.opentelemetry.io/otel/sdk/metric/exemplar.AlwaysOffFilter`, which can be used to disable exemplar recording. (#5850)
|
||||||
|
- Add `go.opentelemetry.io/otel/sdk/metric.WithExemplarFilter`, which can be used to configure the exemplar filter used by the metrics SDK. (#5850)
|
||||||
|
- Add `ExemplarReservoirProviderSelector` and `DefaultExemplarReservoirProviderSelector` to `go.opentelemetry.io/otel/sdk/metric`, which defines the exemplar reservoir to use based on the aggregation of the metric. (#5861)
|
||||||
|
- Add `ExemplarReservoirProviderSelector` to `go.opentelemetry.io/otel/sdk/metric.Stream` to allow using views to configure the exemplar reservoir to use for a metric. (#5861)
|
||||||
|
- Add `ReservoirProvider`, `HistogramReservoirProvider` and `FixedSizeReservoirProvider` to `go.opentelemetry.io/otel/sdk/metric/exemplar` to make it convenient to use providers of Reservoirs. (#5861)
|
||||||
|
- The `go.opentelemetry.io/otel/semconv/v1.27.0` package.
|
||||||
|
The package contains semantic conventions from the `v1.27.0` version of the OpenTelemetry Semantic Conventions. (#5894)
|
||||||
|
- Add `Attributes attribute.Set` field to `Scope` in `go.opentelemetry.io/otel/sdk/instrumentation`. (#5903)
|
||||||
|
- Add `Attributes attribute.Set` field to `ScopeRecords` in `go.opentelemetry.io/otel/log/logtest`. (#5927)
|
||||||
|
- `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc` adds instrumentation scope attributes. (#5934)
|
||||||
|
- `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp` adds instrumentation scope attributes. (#5934)
|
||||||
|
- `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc` adds instrumentation scope attributes. (#5935)
|
||||||
|
- `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp` adds instrumentation scope attributes. (#5935)
|
||||||
|
- `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc` adds instrumentation scope attributes. (#5933)
|
||||||
|
- `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp` adds instrumentation scope attributes. (#5933)
|
||||||
|
- `go.opentelemetry.io/otel/exporters/prometheus` adds instrumentation scope attributes in `otel_scope_info` metric as labels. (#5932)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Support scope attributes and make them as identifying for `Tracer` in `go.opentelemetry.io/otel` and `go.opentelemetry.io/otel/sdk/trace`. (#5924)
|
||||||
|
- Support scope attributes and make them as identifying for `Meter` in `go.opentelemetry.io/otel` and `go.opentelemetry.io/otel/sdk/metric`. (#5926)
|
||||||
|
- Support scope attributes and make them as identifying for `Logger` in `go.opentelemetry.io/otel` and `go.opentelemetry.io/otel/sdk/log`. (#5925)
|
||||||
|
- Make schema URL and scope attributes as identifying for `Tracer` in `go.opentelemetry.io/otel/bridge/opentracing`. (#5931)
|
||||||
|
- Clear unneeded slice elements to allow GC to collect the objects in `go.opentelemetry.io/otel/sdk/metric` and `go.opentelemetry.io/otel/sdk/trace`. (#5804)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Global MeterProvider registration unwraps global instrument Observers, the undocumented Unwrap() methods are now private. (#5881)
|
||||||
|
- `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc` now keeps the metadata already present in the context when `WithHeaders` is used. (#5892)
|
||||||
|
- `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc` now keeps the metadata already present in the context when `WithHeaders` is used. (#5911)
|
||||||
|
- `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc` now keeps the metadata already present in the context when `WithHeaders` is used. (#5915)
|
||||||
|
- Fix `go.opentelemetry.io/otel/exporters/prometheus` trying to add exemplars to Gauge metrics, which is unsupported. (#5912)
|
||||||
|
- Fix `WithEndpointURL` to always use a secure connection when an https URL is passed in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc`. (#5944)
|
||||||
|
- Fix `WithEndpointURL` to always use a secure connection when an https URL is passed in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp`. (#5944)
|
||||||
|
- Fix `WithEndpointURL` to always use a secure connection when an https URL is passed in `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc`. (#5944)
|
||||||
|
- Fix `WithEndpointURL` to always use a secure connection when an https URL is passed in `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp`. (#5944)
|
||||||
|
- Fix incorrect metrics generated from callbacks when multiple readers are used in `go.opentelemetry.io/otel/sdk/metric`. (#5900)
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- Remove all examples under `go.opentelemetry.io/otel/example` as they are moved to [Contrib repository](https://github.com/open-telemetry/opentelemetry-go-contrib/tree/main/examples). (#5930)
|
||||||
|
|
||||||
## [1.31.0/0.53.0/0.7.0/0.0.10] 2024-10-11
|
## [1.31.0/0.53.0/0.7.0/0.0.10] 2024-10-11
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
@ -3110,7 +3237,11 @@ 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.31.0...HEAD
|
[Unreleased]: https://github.com/open-telemetry/opentelemetry-go/compare/v1.35.0...HEAD
|
||||||
|
[1.35.0/0.57.0/0.11.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.35.0
|
||||||
|
[1.34.0/0.56.0/0.10.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.34.0
|
||||||
|
[1.33.0/0.55.0/0.9.0/0.0.12]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.33.0
|
||||||
|
[1.32.0/0.54.0/0.8.0/0.0.11]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.32.0
|
||||||
[1.31.0/0.53.0/0.7.0/0.0.10]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.31.0
|
[1.31.0/0.53.0/0.7.0/0.0.10]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.31.0
|
||||||
[1.30.0/0.52.0/0.6.0/0.0.9]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.30.0
|
[1.30.0/0.52.0/0.6.0/0.0.9]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.30.0
|
||||||
[1.29.0/0.51.0/0.5.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.29.0
|
[1.29.0/0.51.0/0.5.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.29.0
|
||||||
@ -3198,6 +3329,7 @@ It contains api and sdk for trace and meter.
|
|||||||
|
|
||||||
<!-- Released section ended -->
|
<!-- Released section ended -->
|
||||||
|
|
||||||
|
[Go 1.24]: https://go.dev/doc/go1.24
|
||||||
[Go 1.23]: https://go.dev/doc/go1.23
|
[Go 1.23]: https://go.dev/doc/go1.23
|
||||||
[Go 1.22]: https://go.dev/doc/go1.22
|
[Go 1.22]: https://go.dev/doc/go1.22
|
||||||
[Go 1.21]: https://go.dev/doc/go1.21
|
[Go 1.21]: https://go.dev/doc/go1.21
|
||||||
|
30
vendor/go.opentelemetry.io/otel/CONTRIBUTING.md
generated
vendored
30
vendor/go.opentelemetry.io/otel/CONTRIBUTING.md
generated
vendored
@ -181,6 +181,18 @@ patterns in the spec.
|
|||||||
For a deeper discussion, see
|
For a deeper discussion, see
|
||||||
[this](https://github.com/open-telemetry/opentelemetry-specification/issues/165).
|
[this](https://github.com/open-telemetry/opentelemetry-specification/issues/165).
|
||||||
|
|
||||||
|
## Tests
|
||||||
|
|
||||||
|
Each functionality should be covered by tests.
|
||||||
|
|
||||||
|
Performance-critical functionality should also be covered by benchmarks.
|
||||||
|
|
||||||
|
- Pull requests adding a performance-critical functionality
|
||||||
|
should have `go test -bench` output in their description.
|
||||||
|
- Pull requests changing a performance-critical functionality
|
||||||
|
should have [`benchstat`](https://pkg.go.dev/golang.org/x/perf/cmd/benchstat)
|
||||||
|
output in their description.
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
Each (non-internal, non-test) package must be documented using
|
Each (non-internal, non-test) package must be documented using
|
||||||
@ -629,6 +641,10 @@ should be canceled.
|
|||||||
|
|
||||||
## Approvers and Maintainers
|
## Approvers and Maintainers
|
||||||
|
|
||||||
|
### Triagers
|
||||||
|
|
||||||
|
- [Cheng-Zhen Yang](https://github.com/scorpionknifes), Independent
|
||||||
|
|
||||||
### Approvers
|
### Approvers
|
||||||
|
|
||||||
### Maintainers
|
### Maintainers
|
||||||
@ -641,13 +657,13 @@ should be canceled.
|
|||||||
|
|
||||||
### Emeritus
|
### Emeritus
|
||||||
|
|
||||||
- [Aaron Clawson](https://github.com/MadVikingGod), LightStep
|
- [Aaron Clawson](https://github.com/MadVikingGod)
|
||||||
- [Anthony Mirabella](https://github.com/Aneurysm9), AWS
|
- [Anthony Mirabella](https://github.com/Aneurysm9)
|
||||||
- [Chester Cheung](https://github.com/hanyuancheung), Tencent
|
- [Chester Cheung](https://github.com/hanyuancheung)
|
||||||
- [Evan Torrie](https://github.com/evantorrie), Yahoo
|
- [Evan Torrie](https://github.com/evantorrie)
|
||||||
- [Gustavo Silva Paiva](https://github.com/paivagustavo), LightStep
|
- [Gustavo Silva Paiva](https://github.com/paivagustavo)
|
||||||
- [Josh MacDonald](https://github.com/jmacd), LightStep
|
- [Josh MacDonald](https://github.com/jmacd)
|
||||||
- [Liz Fong-Jones](https://github.com/lizthegrey), Honeycomb
|
- [Liz Fong-Jones](https://github.com/lizthegrey)
|
||||||
|
|
||||||
### Become an Approver or a Maintainer
|
### Become an Approver or a Maintainer
|
||||||
|
|
||||||
|
53
vendor/go.opentelemetry.io/otel/Makefile
generated
vendored
53
vendor/go.opentelemetry.io/otel/Makefile
generated
vendored
@ -11,11 +11,15 @@ ALL_COVERAGE_MOD_DIRS := $(shell find . -type f -name 'go.mod' -exec dirname {}
|
|||||||
GO = go
|
GO = go
|
||||||
TIMEOUT = 60
|
TIMEOUT = 60
|
||||||
|
|
||||||
|
# User to run as in docker images.
|
||||||
|
DOCKER_USER=$(shell id -u):$(shell id -g)
|
||||||
|
DEPENDENCIES_DOCKERFILE=./dependencies.Dockerfile
|
||||||
|
|
||||||
.DEFAULT_GOAL := precommit
|
.DEFAULT_GOAL := precommit
|
||||||
|
|
||||||
.PHONY: precommit ci
|
.PHONY: precommit ci
|
||||||
precommit: generate license-check misspell go-mod-tidy golangci-lint-fix verify-readmes verify-mods test-default
|
precommit: generate toolchain-check license-check misspell go-mod-tidy golangci-lint-fix verify-readmes verify-mods test-default
|
||||||
ci: generate license-check lint vanity-import-check verify-readmes verify-mods build test-default check-clean-work-tree test-coverage
|
ci: generate toolchain-check license-check lint vanity-import-check verify-readmes verify-mods build test-default check-clean-work-tree test-coverage
|
||||||
|
|
||||||
# Tools
|
# Tools
|
||||||
|
|
||||||
@ -81,20 +85,20 @@ PIP := $(PYTOOLS)/pip
|
|||||||
WORKDIR := /workdir
|
WORKDIR := /workdir
|
||||||
|
|
||||||
# The python image to use for the virtual environment.
|
# The python image to use for the virtual environment.
|
||||||
PYTHONIMAGE := python:3.11.3-slim-bullseye
|
PYTHONIMAGE := $(shell awk '$$4=="python" {print $$2}' $(DEPENDENCIES_DOCKERFILE))
|
||||||
|
|
||||||
# Run the python image with the current directory mounted.
|
# Run the python image with the current directory mounted.
|
||||||
DOCKERPY := docker run --rm -v "$(CURDIR):$(WORKDIR)" -w $(WORKDIR) $(PYTHONIMAGE)
|
DOCKERPY := docker run --rm -u $(DOCKER_USER) -v "$(CURDIR):$(WORKDIR)" -w $(WORKDIR) $(PYTHONIMAGE)
|
||||||
|
|
||||||
# Create a virtual environment for Python tools.
|
# Create a virtual environment for Python tools.
|
||||||
$(PYTOOLS):
|
$(PYTOOLS):
|
||||||
# The `--upgrade` flag is needed to ensure that the virtual environment is
|
# The `--upgrade` flag is needed to ensure that the virtual environment is
|
||||||
# created with the latest pip version.
|
# created with the latest pip version.
|
||||||
@$(DOCKERPY) bash -c "python3 -m venv $(VENVDIR) && $(PIP) install --upgrade pip"
|
@$(DOCKERPY) bash -c "python3 -m venv $(VENVDIR) && $(PIP) install --upgrade --cache-dir=$(WORKDIR)/.cache/pip pip"
|
||||||
|
|
||||||
# Install python packages into the virtual environment.
|
# Install python packages into the virtual environment.
|
||||||
$(PYTOOLS)/%: $(PYTOOLS)
|
$(PYTOOLS)/%: $(PYTOOLS)
|
||||||
@$(DOCKERPY) $(PIP) install -r requirements.txt
|
@$(DOCKERPY) $(PIP) install --cache-dir=$(WORKDIR)/.cache/pip -r requirements.txt
|
||||||
|
|
||||||
CODESPELL = $(PYTOOLS)/codespell
|
CODESPELL = $(PYTOOLS)/codespell
|
||||||
$(CODESPELL): PACKAGE=codespell
|
$(CODESPELL): PACKAGE=codespell
|
||||||
@ -119,7 +123,7 @@ vanity-import-fix: $(PORTO)
|
|||||||
# Generate go.work file for local development.
|
# Generate go.work file for local development.
|
||||||
.PHONY: go-work
|
.PHONY: go-work
|
||||||
go-work: $(CROSSLINK)
|
go-work: $(CROSSLINK)
|
||||||
$(CROSSLINK) work --root=$(shell pwd)
|
$(CROSSLINK) work --root=$(shell pwd) --go=1.22.7
|
||||||
|
|
||||||
# Build
|
# Build
|
||||||
|
|
||||||
@ -235,6 +239,16 @@ govulncheck/%: $(GOVULNCHECK)
|
|||||||
codespell: $(CODESPELL)
|
codespell: $(CODESPELL)
|
||||||
@$(DOCKERPY) $(CODESPELL)
|
@$(DOCKERPY) $(CODESPELL)
|
||||||
|
|
||||||
|
.PHONY: toolchain-check
|
||||||
|
toolchain-check:
|
||||||
|
@toolchainRes=$$(for f in $(ALL_GO_MOD_DIRS); do \
|
||||||
|
awk '/^toolchain/ { found=1; next } END { if (found) print FILENAME }' $$f/go.mod; \
|
||||||
|
done); \
|
||||||
|
if [ -n "$${toolchainRes}" ]; then \
|
||||||
|
echo "toolchain checking failed:"; echo "$${toolchainRes}"; \
|
||||||
|
exit 1; \
|
||||||
|
fi
|
||||||
|
|
||||||
.PHONY: license-check
|
.PHONY: license-check
|
||||||
license-check:
|
license-check:
|
||||||
@licRes=$$(for f in $$(find . -type f \( -iname '*.go' -o -iname '*.sh' \) ! -path '**/third_party/*' ! -path './.git/*' ) ; do \
|
@licRes=$$(for f in $$(find . -type f \( -iname '*.go' -o -iname '*.sh' \) ! -path '**/third_party/*' ! -path './.git/*' ) ; do \
|
||||||
@ -255,13 +269,30 @@ check-clean-work-tree:
|
|||||||
exit 1; \
|
exit 1; \
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# The weaver docker image to use for semconv-generate.
|
||||||
|
WEAVER_IMAGE := $(shell awk '$$4=="weaver" {print $$2}' $(DEPENDENCIES_DOCKERFILE))
|
||||||
|
|
||||||
SEMCONVPKG ?= "semconv/"
|
SEMCONVPKG ?= "semconv/"
|
||||||
.PHONY: semconv-generate
|
.PHONY: semconv-generate
|
||||||
semconv-generate: $(SEMCONVGEN) $(SEMCONVKIT)
|
semconv-generate: $(SEMCONVKIT)
|
||||||
[ "$(TAG)" ] || ( echo "TAG unset: missing opentelemetry semantic-conventions tag"; exit 1 )
|
[ "$(TAG)" ] || ( echo "TAG unset: missing opentelemetry semantic-conventions tag"; exit 1 )
|
||||||
[ "$(OTEL_SEMCONV_REPO)" ] || ( echo "OTEL_SEMCONV_REPO unset: missing path to opentelemetry semantic-conventions repo"; exit 1 )
|
# Ensure the target directory for source code is available.
|
||||||
$(SEMCONVGEN) -i "$(OTEL_SEMCONV_REPO)/model/." --only=attribute_group -p conventionType=trace -f attribute_group.go -t "$(SEMCONVPKG)/template.j2" -s "$(TAG)"
|
mkdir -p $(PWD)/$(SEMCONVPKG)/${TAG}
|
||||||
$(SEMCONVGEN) -i "$(OTEL_SEMCONV_REPO)/model/." --only=metric -f metric.go -t "$(SEMCONVPKG)/metric_template.j2" -s "$(TAG)"
|
# Note: We mount a home directory for downloading/storing the semconv repository.
|
||||||
|
# Weaver will automatically clean the cache when finished, but the directories will remain.
|
||||||
|
mkdir -p ~/.weaver
|
||||||
|
docker run --rm \
|
||||||
|
-u $(DOCKER_USER) \
|
||||||
|
--env HOME=/tmp/weaver \
|
||||||
|
--mount 'type=bind,source=$(PWD)/semconv,target=/home/weaver/templates/registry/go,readonly' \
|
||||||
|
--mount 'type=bind,source=$(PWD)/semconv/${TAG},target=/home/weaver/target' \
|
||||||
|
--mount 'type=bind,source=$(HOME)/.weaver,target=/tmp/weaver/.weaver' \
|
||||||
|
$(WEAVER_IMAGE) registry generate \
|
||||||
|
--registry=https://github.com/open-telemetry/semantic-conventions/archive/refs/tags/$(TAG).zip[model] \
|
||||||
|
--templates=/home/weaver/templates \
|
||||||
|
--param tag=$(TAG) \
|
||||||
|
go \
|
||||||
|
/home/weaver/target
|
||||||
$(SEMCONVKIT) -output "$(SEMCONVPKG)/$(TAG)" -tag "$(TAG)"
|
$(SEMCONVKIT) -output "$(SEMCONVPKG)/$(TAG)" -tag "$(TAG)"
|
||||||
|
|
||||||
.PHONY: gorelease
|
.PHONY: gorelease
|
||||||
|
15
vendor/go.opentelemetry.io/otel/README.md
generated
vendored
15
vendor/go.opentelemetry.io/otel/README.md
generated
vendored
@ -1,9 +1,11 @@
|
|||||||
# OpenTelemetry-Go
|
# OpenTelemetry-Go
|
||||||
|
|
||||||
[](https://github.com/open-telemetry/opentelemetry-go/actions?query=workflow%3Aci+branch%3Amain)
|
[](https://github.com/open-telemetry/opentelemetry-go/actions/workflows/ci.yml)
|
||||||
[](https://app.codecov.io/gh/open-telemetry/opentelemetry-go?branch=main)
|
[](https://app.codecov.io/gh/open-telemetry/opentelemetry-go?branch=main)
|
||||||
[](https://pkg.go.dev/go.opentelemetry.io/otel)
|
[](https://pkg.go.dev/go.opentelemetry.io/otel)
|
||||||
[](https://goreportcard.com/report/go.opentelemetry.io/otel)
|
[](https://goreportcard.com/report/go.opentelemetry.io/otel)
|
||||||
|
[](https://scorecard.dev/viewer/?uri=github.com/open-telemetry/opentelemetry-go)
|
||||||
|
[](https://www.bestpractices.dev/projects/9996)
|
||||||
[](https://cloud-native.slack.com/archives/C01NPAXACKT)
|
[](https://cloud-native.slack.com/archives/C01NPAXACKT)
|
||||||
|
|
||||||
OpenTelemetry-Go is the [Go](https://golang.org/) implementation of [OpenTelemetry](https://opentelemetry.io/).
|
OpenTelemetry-Go is the [Go](https://golang.org/) implementation of [OpenTelemetry](https://opentelemetry.io/).
|
||||||
@ -49,18 +51,25 @@ Currently, this project supports the following environments.
|
|||||||
|
|
||||||
| OS | Go Version | Architecture |
|
| OS | Go Version | Architecture |
|
||||||
|----------|------------|--------------|
|
|----------|------------|--------------|
|
||||||
|
| Ubuntu | 1.24 | amd64 |
|
||||||
| Ubuntu | 1.23 | amd64 |
|
| Ubuntu | 1.23 | amd64 |
|
||||||
| Ubuntu | 1.22 | amd64 |
|
| Ubuntu | 1.22 | amd64 |
|
||||||
|
| Ubuntu | 1.24 | 386 |
|
||||||
| Ubuntu | 1.23 | 386 |
|
| Ubuntu | 1.23 | 386 |
|
||||||
| Ubuntu | 1.22 | 386 |
|
| Ubuntu | 1.22 | 386 |
|
||||||
| Linux | 1.23 | arm64 |
|
| Ubuntu | 1.24 | arm64 |
|
||||||
| Linux | 1.22 | arm64 |
|
| Ubuntu | 1.23 | arm64 |
|
||||||
|
| Ubuntu | 1.22 | arm64 |
|
||||||
|
| macOS 13 | 1.24 | amd64 |
|
||||||
| macOS 13 | 1.23 | amd64 |
|
| macOS 13 | 1.23 | amd64 |
|
||||||
| macOS 13 | 1.22 | amd64 |
|
| macOS 13 | 1.22 | amd64 |
|
||||||
|
| macOS | 1.24 | arm64 |
|
||||||
| macOS | 1.23 | arm64 |
|
| macOS | 1.23 | arm64 |
|
||||||
| macOS | 1.22 | arm64 |
|
| macOS | 1.22 | arm64 |
|
||||||
|
| Windows | 1.24 | amd64 |
|
||||||
| Windows | 1.23 | amd64 |
|
| Windows | 1.23 | amd64 |
|
||||||
| Windows | 1.22 | amd64 |
|
| Windows | 1.22 | amd64 |
|
||||||
|
| Windows | 1.24 | 386 |
|
||||||
| Windows | 1.23 | 386 |
|
| Windows | 1.23 | 386 |
|
||||||
| Windows | 1.22 | 386 |
|
| Windows | 1.22 | 386 |
|
||||||
|
|
||||||
|
17
vendor/go.opentelemetry.io/otel/RELEASING.md
generated
vendored
17
vendor/go.opentelemetry.io/otel/RELEASING.md
generated
vendored
@ -5,17 +5,14 @@
|
|||||||
New versions of the [OpenTelemetry Semantic Conventions] mean new versions of the `semconv` package need to be generated.
|
New versions of the [OpenTelemetry Semantic Conventions] mean new versions of the `semconv` package need to be generated.
|
||||||
The `semconv-generate` make target is used for this.
|
The `semconv-generate` make target is used for this.
|
||||||
|
|
||||||
1. Checkout a local copy of the [OpenTelemetry Semantic Conventions] to the desired release tag.
|
1. Set the `TAG` environment variable to the semantic convention tag you want to generate.
|
||||||
2. Pull the latest `otel/semconvgen` image: `docker pull otel/semconvgen:latest`
|
2. Run the `make semconv-generate ...` target from this repository.
|
||||||
3. Run the `make semconv-generate ...` target from this repository.
|
|
||||||
|
|
||||||
For example,
|
For example,
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
export TAG="v1.21.0" # Change to the release version you are generating.
|
export TAG="v1.30.0" # Change to the release version you are generating.
|
||||||
export OTEL_SEMCONV_REPO="/absolute/path/to/opentelemetry/semantic-conventions"
|
make semconv-generate # Uses the exported TAG.
|
||||||
docker pull otel/semconvgen:latest
|
|
||||||
make semconv-generate # Uses the exported TAG and OTEL_SEMCONV_REPO.
|
|
||||||
```
|
```
|
||||||
|
|
||||||
This should create a new sub-package of [`semconv`](./semconv).
|
This should create a new sub-package of [`semconv`](./semconv).
|
||||||
@ -130,6 +127,6 @@ Importantly, bump any package versions referenced to be the latest one you just
|
|||||||
|
|
||||||
Bump the dependencies in the following Go services:
|
Bump the dependencies in the following Go services:
|
||||||
|
|
||||||
- [`accountingservice`](https://github.com/open-telemetry/opentelemetry-demo/tree/main/src/accountingservice)
|
- [`accounting`](https://github.com/open-telemetry/opentelemetry-demo/tree/main/src/accounting)
|
||||||
- [`checkoutservice`](https://github.com/open-telemetry/opentelemetry-demo/tree/main/src/checkoutservice)
|
- [`checkoutservice`](https://github.com/open-telemetry/opentelemetry-demo/tree/main/src/checkout)
|
||||||
- [`productcatalogservice`](https://github.com/open-telemetry/opentelemetry-demo/tree/main/src/productcatalogservice)
|
- [`productcatalogservice`](https://github.com/open-telemetry/opentelemetry-demo/tree/main/src/product-catalog)
|
||||||
|
2
vendor/go.opentelemetry.io/otel/VERSIONING.md
generated
vendored
2
vendor/go.opentelemetry.io/otel/VERSIONING.md
generated
vendored
@ -26,7 +26,7 @@ is designed so the following goals can be achieved.
|
|||||||
go.opentelemetry.io/otel/v2 v2.0.1`) and in the package import path
|
go.opentelemetry.io/otel/v2 v2.0.1`) and in the package import path
|
||||||
(e.g., `import "go.opentelemetry.io/otel/v2/trace"`). This includes the
|
(e.g., `import "go.opentelemetry.io/otel/v2/trace"`). This includes the
|
||||||
paths used in `go get` commands (e.g., `go get
|
paths used in `go get` commands (e.g., `go get
|
||||||
go.opentelemetry.io/otel/v2@v2.0.1`. Note there is both a `/v2` and a
|
go.opentelemetry.io/otel/v2@v2.0.1`). Note there is both a `/v2` and a
|
||||||
`@v2.0.1` in that example. One way to think about it is that the module
|
`@v2.0.1` in that example. One way to think about it is that the module
|
||||||
name now includes the `/v2`, so include `/v2` whenever you are using the
|
name now includes the `/v2`, so include `/v2` whenever you are using the
|
||||||
module name).
|
module name).
|
||||||
|
4
vendor/go.opentelemetry.io/otel/baggage/baggage.go
generated
vendored
4
vendor/go.opentelemetry.io/otel/baggage/baggage.go
generated
vendored
@ -355,7 +355,7 @@ func parseMember(member string) (Member, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// replaceInvalidUTF8Sequences replaces invalid UTF-8 sequences with '<27>'.
|
// replaceInvalidUTF8Sequences replaces invalid UTF-8 sequences with '<27>'.
|
||||||
func replaceInvalidUTF8Sequences(cap int, unescapeVal string) string {
|
func replaceInvalidUTF8Sequences(c int, unescapeVal string) string {
|
||||||
if utf8.ValidString(unescapeVal) {
|
if utf8.ValidString(unescapeVal) {
|
||||||
return unescapeVal
|
return unescapeVal
|
||||||
}
|
}
|
||||||
@ -363,7 +363,7 @@ func replaceInvalidUTF8Sequences(cap int, unescapeVal string) string {
|
|||||||
// https://github.com/w3c/baggage/blob/8c215efbeebd3fa4b1aceb937a747e56444f22f3/baggage/HTTP_HEADER_FORMAT.md?plain=1#L69
|
// https://github.com/w3c/baggage/blob/8c215efbeebd3fa4b1aceb937a747e56444f22f3/baggage/HTTP_HEADER_FORMAT.md?plain=1#L69
|
||||||
|
|
||||||
var b strings.Builder
|
var b strings.Builder
|
||||||
b.Grow(cap)
|
b.Grow(c)
|
||||||
for i := 0; i < len(unescapeVal); {
|
for i := 0; i < len(unescapeVal); {
|
||||||
r, size := utf8.DecodeRuneInString(unescapeVal[i:])
|
r, size := utf8.DecodeRuneInString(unescapeVal[i:])
|
||||||
if r == utf8.RuneError && size == 1 {
|
if r == utf8.RuneError && size == 1 {
|
||||||
|
3
vendor/go.opentelemetry.io/otel/codes/codes.go
generated
vendored
3
vendor/go.opentelemetry.io/otel/codes/codes.go
generated
vendored
@ -5,6 +5,7 @@ package codes // import "go.opentelemetry.io/otel/codes"
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
@ -63,7 +64,7 @@ func (c *Code) UnmarshalJSON(b []byte) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if c == nil {
|
if c == nil {
|
||||||
return fmt.Errorf("nil receiver passed to UnmarshalJSON")
|
return errors.New("nil receiver passed to UnmarshalJSON")
|
||||||
}
|
}
|
||||||
|
|
||||||
var x interface{}
|
var x interface{}
|
||||||
|
3
vendor/go.opentelemetry.io/otel/dependencies.Dockerfile
generated
vendored
Normal file
3
vendor/go.opentelemetry.io/otel/dependencies.Dockerfile
generated
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# This is a renovate-friendly source of Docker images.
|
||||||
|
FROM python:3.13.2-slim-bullseye@sha256:31b581c8218e1f3c58672481b3b7dba8e898852866b408c6a984c22832523935 AS python
|
||||||
|
FROM otel/weaver:v0.13.2@sha256:ae7346b992e477f629ea327e0979e8a416a97f7956ab1f7e95ac1f44edf1a893 AS weaver
|
7
vendor/go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc/client.go
generated
vendored
7
vendor/go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc/client.go
generated
vendored
@ -155,7 +155,12 @@ func (c *client) exportContext(parent context.Context) (context.Context, context
|
|||||||
}
|
}
|
||||||
|
|
||||||
if c.metadata.Len() > 0 {
|
if c.metadata.Len() > 0 {
|
||||||
ctx = metadata.NewOutgoingContext(ctx, c.metadata)
|
md := c.metadata
|
||||||
|
if outMD, ok := metadata.FromOutgoingContext(ctx); ok {
|
||||||
|
md = metadata.Join(md, outMD)
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx = metadata.NewOutgoingContext(ctx, md)
|
||||||
}
|
}
|
||||||
|
|
||||||
return ctx, cancel
|
return ctx, cancel
|
||||||
|
3
vendor/go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc/exporter.go
generated
vendored
3
vendor/go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc/exporter.go
generated
vendored
@ -5,6 +5,7 @@ package otlpmetricgrpc // import "go.opentelemetry.io/otel/exporters/otlp/otlpme
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
@ -114,7 +115,7 @@ func (e *Exporter) Shutdown(ctx context.Context) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
var errShutdown = fmt.Errorf("gRPC exporter is shutdown")
|
var errShutdown = errors.New("gRPC exporter is shutdown")
|
||||||
|
|
||||||
type shutdownClient struct{}
|
type shutdownClient struct{}
|
||||||
|
|
||||||
|
@ -111,7 +111,7 @@ func cleanPath(urlPath string, defaultPath string) string {
|
|||||||
return defaultPath
|
return defaultPath
|
||||||
}
|
}
|
||||||
if !path.IsAbs(tmp) {
|
if !path.IsAbs(tmp) {
|
||||||
tmp = fmt.Sprintf("/%s", tmp)
|
tmp = "/" + tmp
|
||||||
}
|
}
|
||||||
return tmp
|
return tmp
|
||||||
}
|
}
|
||||||
@ -287,9 +287,7 @@ func WithEndpointURL(v string) GenericOption {
|
|||||||
|
|
||||||
cfg.Metrics.Endpoint = u.Host
|
cfg.Metrics.Endpoint = u.Host
|
||||||
cfg.Metrics.URLPath = u.Path
|
cfg.Metrics.URLPath = u.Path
|
||||||
if u.Scheme != "https" {
|
cfg.Metrics.Insecure = u.Scheme != "https"
|
||||||
cfg.Metrics.Insecure = true
|
|
||||||
}
|
|
||||||
|
|
||||||
return cfg
|
return cfg
|
||||||
})
|
})
|
||||||
|
@ -46,8 +46,9 @@ func ScopeMetrics(sms []metricdata.ScopeMetrics) ([]*mpb.ScopeMetrics, error) {
|
|||||||
|
|
||||||
out = append(out, &mpb.ScopeMetrics{
|
out = append(out, &mpb.ScopeMetrics{
|
||||||
Scope: &cpb.InstrumentationScope{
|
Scope: &cpb.InstrumentationScope{
|
||||||
Name: sm.Scope.Name,
|
Name: sm.Scope.Name,
|
||||||
Version: sm.Scope.Version,
|
Version: sm.Scope.Version,
|
||||||
|
Attributes: AttrIter(sm.Scope.Attributes.Iter()),
|
||||||
},
|
},
|
||||||
Metrics: ms,
|
Metrics: ms,
|
||||||
SchemaUrl: sm.Scope.SchemaURL,
|
SchemaUrl: sm.Scope.SchemaURL,
|
||||||
@ -83,13 +84,13 @@ func metric(m metricdata.Metrics) (*mpb.Metric, error) {
|
|||||||
}
|
}
|
||||||
switch a := m.Data.(type) {
|
switch a := m.Data.(type) {
|
||||||
case metricdata.Gauge[int64]:
|
case metricdata.Gauge[int64]:
|
||||||
out.Data = Gauge[int64](a)
|
out.Data = Gauge(a)
|
||||||
case metricdata.Gauge[float64]:
|
case metricdata.Gauge[float64]:
|
||||||
out.Data = Gauge[float64](a)
|
out.Data = Gauge(a)
|
||||||
case metricdata.Sum[int64]:
|
case metricdata.Sum[int64]:
|
||||||
out.Data, err = Sum[int64](a)
|
out.Data, err = Sum(a)
|
||||||
case metricdata.Sum[float64]:
|
case metricdata.Sum[float64]:
|
||||||
out.Data, err = Sum[float64](a)
|
out.Data, err = Sum(a)
|
||||||
case metricdata.Histogram[int64]:
|
case metricdata.Histogram[int64]:
|
||||||
out.Data, err = Histogram(a)
|
out.Data, err = Histogram(a)
|
||||||
case metricdata.Histogram[float64]:
|
case metricdata.Histogram[float64]:
|
||||||
|
2
vendor/go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc/version.go
generated
vendored
2
vendor/go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc/version.go
generated
vendored
@ -5,5 +5,5 @@ package otlpmetricgrpc // import "go.opentelemetry.io/otel/exporters/otlp/otlpme
|
|||||||
|
|
||||||
// Version is the current release version of the OpenTelemetry OTLP over gRPC metrics exporter in use.
|
// Version is the current release version of the OpenTelemetry OTLP over gRPC metrics exporter in use.
|
||||||
func Version() string {
|
func Version() string {
|
||||||
return "1.31.0"
|
return "1.35.0"
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,8 @@ func InstrumentationScope(il instrumentation.Scope) *commonpb.InstrumentationSco
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return &commonpb.InstrumentationScope{
|
return &commonpb.InstrumentationScope{
|
||||||
Name: il.Name,
|
Name: il.Name,
|
||||||
Version: il.Version,
|
Version: il.Version,
|
||||||
|
Attributes: Iterator(il.Attributes.Iter()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
9
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/client.go
generated
vendored
9
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/client.go
generated
vendored
@ -229,7 +229,12 @@ func (c *client) exportContext(parent context.Context) (context.Context, context
|
|||||||
}
|
}
|
||||||
|
|
||||||
if c.metadata.Len() > 0 {
|
if c.metadata.Len() > 0 {
|
||||||
ctx = metadata.NewOutgoingContext(ctx, c.metadata)
|
md := c.metadata
|
||||||
|
if outMD, ok := metadata.FromOutgoingContext(ctx); ok {
|
||||||
|
md = metadata.Join(md, outMD)
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx = metadata.NewOutgoingContext(ctx, md)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unify the client stopCtx with the parent.
|
// Unify the client stopCtx with the parent.
|
||||||
@ -289,7 +294,7 @@ func (c *client) MarshalLog() interface{} {
|
|||||||
Type string
|
Type string
|
||||||
Endpoint string
|
Endpoint string
|
||||||
}{
|
}{
|
||||||
Type: "otlphttpgrpc",
|
Type: "otlptracegrpc",
|
||||||
Endpoint: c.endpoint,
|
Endpoint: c.endpoint,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -98,7 +98,7 @@ func cleanPath(urlPath string, defaultPath string) string {
|
|||||||
return defaultPath
|
return defaultPath
|
||||||
}
|
}
|
||||||
if !path.IsAbs(tmp) {
|
if !path.IsAbs(tmp) {
|
||||||
tmp = fmt.Sprintf("/%s", tmp)
|
tmp = "/" + tmp
|
||||||
}
|
}
|
||||||
return tmp
|
return tmp
|
||||||
}
|
}
|
||||||
@ -278,9 +278,7 @@ func WithEndpointURL(v string) GenericOption {
|
|||||||
|
|
||||||
cfg.Traces.Endpoint = u.Host
|
cfg.Traces.Endpoint = u.Host
|
||||||
cfg.Traces.URLPath = u.Path
|
cfg.Traces.URLPath = u.Path
|
||||||
if u.Scheme != "https" {
|
cfg.Traces.Insecure = u.Scheme != "https"
|
||||||
cfg.Traces.Insecure = true
|
|
||||||
}
|
|
||||||
|
|
||||||
return cfg
|
return cfg
|
||||||
})
|
})
|
||||||
|
2
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/version.go
generated
vendored
2
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/version.go
generated
vendored
@ -5,5 +5,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.31.0"
|
return "1.35.0"
|
||||||
}
|
}
|
||||||
|
44
vendor/go.opentelemetry.io/otel/internal/attribute/attribute.go
generated
vendored
44
vendor/go.opentelemetry.io/otel/internal/attribute/attribute.go
generated
vendored
@ -49,12 +49,11 @@ func AsBoolSlice(v interface{}) []bool {
|
|||||||
if rv.Type().Kind() != reflect.Array {
|
if rv.Type().Kind() != reflect.Array {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
var zero bool
|
cpy := make([]bool, rv.Len())
|
||||||
correctLen := rv.Len()
|
if len(cpy) > 0 {
|
||||||
correctType := reflect.ArrayOf(correctLen, reflect.TypeOf(zero))
|
_ = reflect.Copy(reflect.ValueOf(cpy), rv)
|
||||||
cpy := reflect.New(correctType)
|
}
|
||||||
_ = reflect.Copy(cpy.Elem(), rv)
|
return cpy
|
||||||
return cpy.Elem().Slice(0, correctLen).Interface().([]bool)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// AsInt64Slice converts an int64 array into a slice into with same elements as array.
|
// AsInt64Slice converts an int64 array into a slice into with same elements as array.
|
||||||
@ -63,12 +62,11 @@ func AsInt64Slice(v interface{}) []int64 {
|
|||||||
if rv.Type().Kind() != reflect.Array {
|
if rv.Type().Kind() != reflect.Array {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
var zero int64
|
cpy := make([]int64, rv.Len())
|
||||||
correctLen := rv.Len()
|
if len(cpy) > 0 {
|
||||||
correctType := reflect.ArrayOf(correctLen, reflect.TypeOf(zero))
|
_ = reflect.Copy(reflect.ValueOf(cpy), rv)
|
||||||
cpy := reflect.New(correctType)
|
}
|
||||||
_ = reflect.Copy(cpy.Elem(), rv)
|
return cpy
|
||||||
return cpy.Elem().Slice(0, correctLen).Interface().([]int64)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// AsFloat64Slice converts a float64 array into a slice into with same elements as array.
|
// AsFloat64Slice converts a float64 array into a slice into with same elements as array.
|
||||||
@ -77,12 +75,11 @@ func AsFloat64Slice(v interface{}) []float64 {
|
|||||||
if rv.Type().Kind() != reflect.Array {
|
if rv.Type().Kind() != reflect.Array {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
var zero float64
|
cpy := make([]float64, rv.Len())
|
||||||
correctLen := rv.Len()
|
if len(cpy) > 0 {
|
||||||
correctType := reflect.ArrayOf(correctLen, reflect.TypeOf(zero))
|
_ = reflect.Copy(reflect.ValueOf(cpy), rv)
|
||||||
cpy := reflect.New(correctType)
|
}
|
||||||
_ = reflect.Copy(cpy.Elem(), rv)
|
return cpy
|
||||||
return cpy.Elem().Slice(0, correctLen).Interface().([]float64)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// AsStringSlice converts a string array into a slice into with same elements as array.
|
// AsStringSlice converts a string array into a slice into with same elements as array.
|
||||||
@ -91,10 +88,9 @@ func AsStringSlice(v interface{}) []string {
|
|||||||
if rv.Type().Kind() != reflect.Array {
|
if rv.Type().Kind() != reflect.Array {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
var zero string
|
cpy := make([]string, rv.Len())
|
||||||
correctLen := rv.Len()
|
if len(cpy) > 0 {
|
||||||
correctType := reflect.ArrayOf(correctLen, reflect.TypeOf(zero))
|
_ = reflect.Copy(reflect.ValueOf(cpy), rv)
|
||||||
cpy := reflect.New(correctType)
|
}
|
||||||
_ = reflect.Copy(cpy.Elem(), rv)
|
return cpy
|
||||||
return cpy.Elem().Slice(0, correctLen).Interface().([]string)
|
|
||||||
}
|
}
|
||||||
|
14
vendor/go.opentelemetry.io/otel/internal/global/instruments.go
generated
vendored
14
vendor/go.opentelemetry.io/otel/internal/global/instruments.go
generated
vendored
@ -13,7 +13,7 @@ import (
|
|||||||
|
|
||||||
// unwrapper unwraps to return the underlying instrument implementation.
|
// unwrapper unwraps to return the underlying instrument implementation.
|
||||||
type unwrapper interface {
|
type unwrapper interface {
|
||||||
Unwrap() metric.Observable
|
unwrap() metric.Observable
|
||||||
}
|
}
|
||||||
|
|
||||||
type afCounter struct {
|
type afCounter struct {
|
||||||
@ -40,7 +40,7 @@ func (i *afCounter) setDelegate(m metric.Meter) {
|
|||||||
i.delegate.Store(ctr)
|
i.delegate.Store(ctr)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *afCounter) Unwrap() metric.Observable {
|
func (i *afCounter) unwrap() metric.Observable {
|
||||||
if ctr := i.delegate.Load(); ctr != nil {
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
return ctr.(metric.Float64ObservableCounter)
|
return ctr.(metric.Float64ObservableCounter)
|
||||||
}
|
}
|
||||||
@ -71,7 +71,7 @@ func (i *afUpDownCounter) setDelegate(m metric.Meter) {
|
|||||||
i.delegate.Store(ctr)
|
i.delegate.Store(ctr)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *afUpDownCounter) Unwrap() metric.Observable {
|
func (i *afUpDownCounter) unwrap() metric.Observable {
|
||||||
if ctr := i.delegate.Load(); ctr != nil {
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
return ctr.(metric.Float64ObservableUpDownCounter)
|
return ctr.(metric.Float64ObservableUpDownCounter)
|
||||||
}
|
}
|
||||||
@ -102,7 +102,7 @@ func (i *afGauge) setDelegate(m metric.Meter) {
|
|||||||
i.delegate.Store(ctr)
|
i.delegate.Store(ctr)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *afGauge) Unwrap() metric.Observable {
|
func (i *afGauge) unwrap() metric.Observable {
|
||||||
if ctr := i.delegate.Load(); ctr != nil {
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
return ctr.(metric.Float64ObservableGauge)
|
return ctr.(metric.Float64ObservableGauge)
|
||||||
}
|
}
|
||||||
@ -133,7 +133,7 @@ func (i *aiCounter) setDelegate(m metric.Meter) {
|
|||||||
i.delegate.Store(ctr)
|
i.delegate.Store(ctr)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *aiCounter) Unwrap() metric.Observable {
|
func (i *aiCounter) unwrap() metric.Observable {
|
||||||
if ctr := i.delegate.Load(); ctr != nil {
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
return ctr.(metric.Int64ObservableCounter)
|
return ctr.(metric.Int64ObservableCounter)
|
||||||
}
|
}
|
||||||
@ -164,7 +164,7 @@ func (i *aiUpDownCounter) setDelegate(m metric.Meter) {
|
|||||||
i.delegate.Store(ctr)
|
i.delegate.Store(ctr)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *aiUpDownCounter) Unwrap() metric.Observable {
|
func (i *aiUpDownCounter) unwrap() metric.Observable {
|
||||||
if ctr := i.delegate.Load(); ctr != nil {
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
return ctr.(metric.Int64ObservableUpDownCounter)
|
return ctr.(metric.Int64ObservableUpDownCounter)
|
||||||
}
|
}
|
||||||
@ -195,7 +195,7 @@ func (i *aiGauge) setDelegate(m metric.Meter) {
|
|||||||
i.delegate.Store(ctr)
|
i.delegate.Store(ctr)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *aiGauge) Unwrap() metric.Observable {
|
func (i *aiGauge) unwrap() metric.Observable {
|
||||||
if ctr := i.delegate.Load(); ctr != nil {
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
return ctr.(metric.Int64ObservableGauge)
|
return ctr.(metric.Int64ObservableGauge)
|
||||||
}
|
}
|
||||||
|
69
vendor/go.opentelemetry.io/otel/internal/global/meter.go
generated
vendored
69
vendor/go.opentelemetry.io/otel/internal/global/meter.go
generated
vendored
@ -5,6 +5,7 @@ package global // import "go.opentelemetry.io/otel/internal/global"
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"container/list"
|
"container/list"
|
||||||
|
"context"
|
||||||
"reflect"
|
"reflect"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
@ -66,6 +67,7 @@ func (p *meterProvider) Meter(name string, opts ...metric.MeterOption) metric.Me
|
|||||||
name: name,
|
name: name,
|
||||||
version: c.InstrumentationVersion(),
|
version: c.InstrumentationVersion(),
|
||||||
schema: c.SchemaURL(),
|
schema: c.SchemaURL(),
|
||||||
|
attrs: c.InstrumentationAttributes(),
|
||||||
}
|
}
|
||||||
|
|
||||||
if p.meters == nil {
|
if p.meters == nil {
|
||||||
@ -472,8 +474,7 @@ func (m *meter) RegisterCallback(f metric.Callback, insts ...metric.Observable)
|
|||||||
defer m.mtx.Unlock()
|
defer m.mtx.Unlock()
|
||||||
|
|
||||||
if m.delegate != nil {
|
if m.delegate != nil {
|
||||||
insts = unwrapInstruments(insts)
|
return m.delegate.RegisterCallback(unwrapCallback(f), unwrapInstruments(insts)...)
|
||||||
return m.delegate.RegisterCallback(f, insts...)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
reg := ®istration{instruments: insts, function: f}
|
reg := ®istration{instruments: insts, function: f}
|
||||||
@ -487,15 +488,11 @@ func (m *meter) RegisterCallback(f metric.Callback, insts ...metric.Observable)
|
|||||||
return reg, nil
|
return reg, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type wrapped interface {
|
|
||||||
unwrap() metric.Observable
|
|
||||||
}
|
|
||||||
|
|
||||||
func unwrapInstruments(instruments []metric.Observable) []metric.Observable {
|
func unwrapInstruments(instruments []metric.Observable) []metric.Observable {
|
||||||
out := make([]metric.Observable, 0, len(instruments))
|
out := make([]metric.Observable, 0, len(instruments))
|
||||||
|
|
||||||
for _, inst := range instruments {
|
for _, inst := range instruments {
|
||||||
if in, ok := inst.(wrapped); ok {
|
if in, ok := inst.(unwrapper); ok {
|
||||||
out = append(out, in.unwrap())
|
out = append(out, in.unwrap())
|
||||||
} else {
|
} else {
|
||||||
out = append(out, inst)
|
out = append(out, inst)
|
||||||
@ -515,9 +512,61 @@ type registration struct {
|
|||||||
unregMu sync.Mutex
|
unregMu sync.Mutex
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *registration) setDelegate(m metric.Meter) {
|
type unwrapObs struct {
|
||||||
insts := unwrapInstruments(c.instruments)
|
embedded.Observer
|
||||||
|
obs metric.Observer
|
||||||
|
}
|
||||||
|
|
||||||
|
// unwrapFloat64Observable returns an expected metric.Float64Observable after
|
||||||
|
// unwrapping the global object.
|
||||||
|
func unwrapFloat64Observable(inst metric.Float64Observable) metric.Float64Observable {
|
||||||
|
if unwrapped, ok := inst.(unwrapper); ok {
|
||||||
|
if floatObs, ok := unwrapped.unwrap().(metric.Float64Observable); ok {
|
||||||
|
// Note: if the unwrapped object does not
|
||||||
|
// unwrap as an observable for either of the
|
||||||
|
// predicates here, it means an internal bug in
|
||||||
|
// this package. We avoid logging an error in
|
||||||
|
// this case, because the SDK has to try its
|
||||||
|
// own type conversion on the object. The SDK
|
||||||
|
// will see this and be forced to respond with
|
||||||
|
// its own error.
|
||||||
|
//
|
||||||
|
// This code uses a double-nested if statement
|
||||||
|
// to avoid creating a branch that is
|
||||||
|
// impossible to cover.
|
||||||
|
inst = floatObs
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return inst
|
||||||
|
}
|
||||||
|
|
||||||
|
// unwrapInt64Observable returns an expected metric.Int64Observable after
|
||||||
|
// unwrapping the global object.
|
||||||
|
func unwrapInt64Observable(inst metric.Int64Observable) metric.Int64Observable {
|
||||||
|
if unwrapped, ok := inst.(unwrapper); ok {
|
||||||
|
if unint, ok := unwrapped.unwrap().(metric.Int64Observable); ok {
|
||||||
|
// See the comment in unwrapFloat64Observable().
|
||||||
|
inst = unint
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return inst
|
||||||
|
}
|
||||||
|
|
||||||
|
func (uo *unwrapObs) ObserveFloat64(inst metric.Float64Observable, value float64, opts ...metric.ObserveOption) {
|
||||||
|
uo.obs.ObserveFloat64(unwrapFloat64Observable(inst), value, opts...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (uo *unwrapObs) ObserveInt64(inst metric.Int64Observable, value int64, opts ...metric.ObserveOption) {
|
||||||
|
uo.obs.ObserveInt64(unwrapInt64Observable(inst), value, opts...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func unwrapCallback(f metric.Callback) metric.Callback {
|
||||||
|
return func(ctx context.Context, obs metric.Observer) error {
|
||||||
|
return f(ctx, &unwrapObs{obs: obs})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *registration) setDelegate(m metric.Meter) {
|
||||||
c.unregMu.Lock()
|
c.unregMu.Lock()
|
||||||
defer c.unregMu.Unlock()
|
defer c.unregMu.Unlock()
|
||||||
|
|
||||||
@ -526,7 +575,7 @@ func (c *registration) setDelegate(m metric.Meter) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
reg, err := m.RegisterCallback(c.function, insts...)
|
reg, err := m.RegisterCallback(unwrapCallback(c.function), unwrapInstruments(c.instruments)...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
GetErrorHandler().Handle(err)
|
GetErrorHandler().Handle(err)
|
||||||
return
|
return
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user