feat: add status probe
This commit is contained in:
		@@ -1,16 +1,19 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"domogeek/calendar"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"flag"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"log"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/hellofresh/health-go/v4"
 | 
			
		||||
	"github.com/prometheus/client_golang/prometheus"
 | 
			
		||||
	"github.com/prometheus/client_golang/prometheus/promauto"
 | 
			
		||||
	"github.com/prometheus/client_golang/prometheus/promhttp"
 | 
			
		||||
	"log"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
@@ -107,5 +110,16 @@ func main() {
 | 
			
		||||
				&CalendarHandler{})))
 | 
			
		||||
	http.Handle("/calendar", &h)
 | 
			
		||||
	http.Handle("/metrics", promhttp.Handler())
 | 
			
		||||
	healthz, _ := health.New(health.WithChecks(health.Config{
 | 
			
		||||
		Name:      "calendar",
 | 
			
		||||
		Timeout:   time.Second * 5,
 | 
			
		||||
		SkipOnErr: false,
 | 
			
		||||
		Check: func(ctx context.Context) error {
 | 
			
		||||
			return nil
 | 
			
		||||
		},
 | 
			
		||||
	},
 | 
			
		||||
	))
 | 
			
		||||
	http.Handle("/status", healthz.Handler())
 | 
			
		||||
 | 
			
		||||
	log.Fatal(http.ListenAndServe(addr, nil))
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										7
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								go.mod
									
									
									
									
									
								
							@@ -2,7 +2,10 @@ module domogeek
 | 
			
		||||
 | 
			
		||||
go 1.18
 | 
			
		||||
 | 
			
		||||
require github.com/prometheus/client_golang v1.12.1
 | 
			
		||||
require (
 | 
			
		||||
	github.com/hellofresh/health-go/v4 v4.5.0
 | 
			
		||||
	github.com/prometheus/client_golang v1.12.1
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
require (
 | 
			
		||||
	github.com/beorn7/perks v1.0.1 // indirect
 | 
			
		||||
@@ -12,6 +15,8 @@ require (
 | 
			
		||||
	github.com/prometheus/client_model v0.2.0 // indirect
 | 
			
		||||
	github.com/prometheus/common v0.32.1 // indirect
 | 
			
		||||
	github.com/prometheus/procfs v0.7.3 // indirect
 | 
			
		||||
	go.opentelemetry.io/otel v1.0.0 // indirect
 | 
			
		||||
	go.opentelemetry.io/otel/trace v1.0.0 // indirect
 | 
			
		||||
	golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 // indirect
 | 
			
		||||
	google.golang.org/protobuf v1.26.0 // indirect
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										210
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										210
									
								
								go.sum
									
									
									
									
									
								
							@@ -33,6 +33,7 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9
 | 
			
		||||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
 | 
			
		||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 | 
			
		||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 | 
			
		||||
github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
 | 
			
		||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 | 
			
		||||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 | 
			
		||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
 | 
			
		||||
@@ -42,6 +43,7 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24
 | 
			
		||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
 | 
			
		||||
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
 | 
			
		||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
 | 
			
		||||
github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA=
 | 
			
		||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 | 
			
		||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 | 
			
		||||
github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
 | 
			
		||||
@@ -51,12 +53,22 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P
 | 
			
		||||
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
 | 
			
		||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 | 
			
		||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
 | 
			
		||||
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
 | 
			
		||||
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
 | 
			
		||||
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
 | 
			
		||||
github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
 | 
			
		||||
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
 | 
			
		||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
			
		||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 | 
			
		||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
			
		||||
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
 | 
			
		||||
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 | 
			
		||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 | 
			
		||||
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
 | 
			
		||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
 | 
			
		||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 | 
			
		||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 | 
			
		||||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
 | 
			
		||||
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
 | 
			
		||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
 | 
			
		||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
 | 
			
		||||
@@ -66,7 +78,35 @@ github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vb
 | 
			
		||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
 | 
			
		||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
 | 
			
		||||
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
 | 
			
		||||
github.com/go-redis/redis/v8 v8.11.3/go.mod h1:xNJ9xDG09FsIPwh3bWdk+0oDWHbtF9rPN0F/oD9XeKc=
 | 
			
		||||
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
 | 
			
		||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
 | 
			
		||||
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
 | 
			
		||||
github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0=
 | 
			
		||||
github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY=
 | 
			
		||||
github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg=
 | 
			
		||||
github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
 | 
			
		||||
github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
 | 
			
		||||
github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs=
 | 
			
		||||
github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
 | 
			
		||||
github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
 | 
			
		||||
github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk=
 | 
			
		||||
github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28=
 | 
			
		||||
github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo=
 | 
			
		||||
github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk=
 | 
			
		||||
github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw=
 | 
			
		||||
github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360=
 | 
			
		||||
github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg=
 | 
			
		||||
github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE=
 | 
			
		||||
github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8=
 | 
			
		||||
github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=
 | 
			
		||||
github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=
 | 
			
		||||
github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=
 | 
			
		||||
github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=
 | 
			
		||||
github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ=
 | 
			
		||||
github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0=
 | 
			
		||||
github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw=
 | 
			
		||||
github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
 | 
			
		||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 | 
			
		||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
 | 
			
		||||
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 | 
			
		||||
@@ -96,6 +136,7 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw
 | 
			
		||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
 | 
			
		||||
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
 | 
			
		||||
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
 | 
			
		||||
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 | 
			
		||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 | 
			
		||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 | 
			
		||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 | 
			
		||||
@@ -105,9 +146,11 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
 | 
			
		||||
github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
 | 
			
		||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
 | 
			
		||||
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
			
		||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
 | 
			
		||||
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
 | 
			
		||||
@@ -119,11 +162,53 @@ github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hf
 | 
			
		||||
github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
 | 
			
		||||
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
 | 
			
		||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
 | 
			
		||||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
			
		||||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
 | 
			
		||||
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
 | 
			
		||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 | 
			
		||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 | 
			
		||||
github.com/hellofresh/health-go/v4 v4.5.0 h1:0oxP/ITC+VfKh3kQROEZ7OHbjoxKQHLsuTtM/NR5he8=
 | 
			
		||||
github.com/hellofresh/health-go/v4 v4.5.0/go.mod h1:176z4n98qW0mksO2DmDWjz0DXUcqkGXt8NZX3B3X1ok=
 | 
			
		||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 | 
			
		||||
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 | 
			
		||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
 | 
			
		||||
github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo=
 | 
			
		||||
github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
 | 
			
		||||
github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
 | 
			
		||||
github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA=
 | 
			
		||||
github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE=
 | 
			
		||||
github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s=
 | 
			
		||||
github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o=
 | 
			
		||||
github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY=
 | 
			
		||||
github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI=
 | 
			
		||||
github.com/jackc/pgconn v1.10.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI=
 | 
			
		||||
github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8=
 | 
			
		||||
github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE=
 | 
			
		||||
github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c=
 | 
			
		||||
github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak=
 | 
			
		||||
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
 | 
			
		||||
github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78=
 | 
			
		||||
github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA=
 | 
			
		||||
github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg=
 | 
			
		||||
github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=
 | 
			
		||||
github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=
 | 
			
		||||
github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
 | 
			
		||||
github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
 | 
			
		||||
github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E=
 | 
			
		||||
github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg=
 | 
			
		||||
github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc=
 | 
			
		||||
github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw=
 | 
			
		||||
github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM=
 | 
			
		||||
github.com/jackc/pgtype v1.8.1/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4=
 | 
			
		||||
github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y=
 | 
			
		||||
github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM=
 | 
			
		||||
github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc=
 | 
			
		||||
github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs=
 | 
			
		||||
github.com/jackc/pgx/v4 v4.13.0/go.mod h1:9P4X524sErlaxj0XSGZk7s+LD0eOyu1ZDUrrpznYDF0=
 | 
			
		||||
github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
 | 
			
		||||
github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
 | 
			
		||||
github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
 | 
			
		||||
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
 | 
			
		||||
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
 | 
			
		||||
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 | 
			
		||||
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
 | 
			
		||||
@@ -133,13 +218,30 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1
 | 
			
		||||
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
 | 
			
		||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
 | 
			
		||||
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
 | 
			
		||||
github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4=
 | 
			
		||||
github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA=
 | 
			
		||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 | 
			
		||||
github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
 | 
			
		||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
			
		||||
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
			
		||||
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
			
		||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
 | 
			
		||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 | 
			
		||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 | 
			
		||||
github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
 | 
			
		||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 | 
			
		||||
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
 | 
			
		||||
github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
 | 
			
		||||
github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
 | 
			
		||||
github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
 | 
			
		||||
github.com/lib/pq v1.10.3/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
 | 
			
		||||
github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE=
 | 
			
		||||
github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0=
 | 
			
		||||
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
 | 
			
		||||
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
 | 
			
		||||
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
 | 
			
		||||
github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
 | 
			
		||||
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
 | 
			
		||||
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
 | 
			
		||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
 | 
			
		||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 | 
			
		||||
@@ -147,11 +249,22 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ
 | 
			
		||||
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 | 
			
		||||
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 | 
			
		||||
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
 | 
			
		||||
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
 | 
			
		||||
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 | 
			
		||||
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 | 
			
		||||
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
 | 
			
		||||
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
 | 
			
		||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 | 
			
		||||
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
 | 
			
		||||
github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
 | 
			
		||||
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
 | 
			
		||||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
 | 
			
		||||
github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0=
 | 
			
		||||
github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE=
 | 
			
		||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
			
		||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
			
		||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
			
		||||
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=
 | 
			
		||||
@@ -175,29 +288,79 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O
 | 
			
		||||
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
 | 
			
		||||
github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=
 | 
			
		||||
github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
 | 
			
		||||
github.com/rabbitmq/amqp091-go v1.1.0/go.mod h1:ogQDLSOACsLPsIq0NpbtiifNZi2YOz0VTJ0kHRghqbM=
 | 
			
		||||
github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 | 
			
		||||
github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 | 
			
		||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 | 
			
		||||
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
 | 
			
		||||
github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
 | 
			
		||||
github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=
 | 
			
		||||
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
 | 
			
		||||
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
 | 
			
		||||
github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
 | 
			
		||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
 | 
			
		||||
github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
 | 
			
		||||
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
 | 
			
		||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
 | 
			
		||||
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
 | 
			
		||||
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 | 
			
		||||
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 | 
			
		||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
			
		||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
			
		||||
github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48=
 | 
			
		||||
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
 | 
			
		||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 | 
			
		||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 | 
			
		||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
 | 
			
		||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
 | 
			
		||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 | 
			
		||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
 | 
			
		||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 | 
			
		||||
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
 | 
			
		||||
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
 | 
			
		||||
github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs=
 | 
			
		||||
github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM=
 | 
			
		||||
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
 | 
			
		||||
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
			
		||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
			
		||||
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
			
		||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
			
		||||
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
 | 
			
		||||
go.mongodb.org/mongo-driver v1.7.2/go.mod h1:Q4oFMbo1+MSNqICAdYMlC/zSTrwCogR4R8NzkI+yfU8=
 | 
			
		||||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
 | 
			
		||||
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
 | 
			
		||||
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
 | 
			
		||||
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
 | 
			
		||||
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
 | 
			
		||||
go.opentelemetry.io/otel v1.0.0 h1:qTTn6x71GVBvoafHK/yaRUmFzI4LcONZD0/kXxl5PHI=
 | 
			
		||||
go.opentelemetry.io/otel v1.0.0/go.mod h1:AjRVh9A5/5DE7S+mZtTR6t8vpKKryam+0lREnfmS4cg=
 | 
			
		||||
go.opentelemetry.io/otel/trace v1.0.0 h1:TSBr8GTEtKevYMG/2d21M989r5WJYVimhTHBKVEZuh4=
 | 
			
		||||
go.opentelemetry.io/otel/trace v1.0.0/go.mod h1:PXTWqayeFUlJV1YDNhsJYB184+IvAH814St6o6ajzIs=
 | 
			
		||||
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 | 
			
		||||
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 | 
			
		||||
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
 | 
			
		||||
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
 | 
			
		||||
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
 | 
			
		||||
go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
 | 
			
		||||
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
 | 
			
		||||
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
 | 
			
		||||
go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
 | 
			
		||||
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
 | 
			
		||||
go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20210920023735-84f357641f63/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 | 
			
		||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 | 
			
		||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 | 
			
		||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
 | 
			
		||||
@@ -230,6 +393,7 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 | 
			
		||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 | 
			
		||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
			
		||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
			
		||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
			
		||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
			
		||||
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
			
		||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
			
		||||
@@ -242,6 +406,7 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL
 | 
			
		||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
			
		||||
golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
			
		||||
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
			
		||||
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
			
		||||
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
			
		||||
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
			
		||||
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
			
		||||
@@ -252,10 +417,14 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/
 | 
			
		||||
golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 | 
			
		||||
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 | 
			
		||||
golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 | 
			
		||||
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 | 
			
		||||
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 | 
			
		||||
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 | 
			
		||||
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 | 
			
		||||
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 | 
			
		||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 | 
			
		||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 | 
			
		||||
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
 | 
			
		||||
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 | 
			
		||||
@@ -267,28 +436,41 @@ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJ
 | 
			
		||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20190412183630-56d357773e84/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-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/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-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/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-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
@@ -303,19 +485,26 @@ golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7w
 | 
			
		||||
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 h1:XfKQ4OlFl8okEOr5UvAqFRVj8pY/4yfcXrddB8qAbU0=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 | 
			
		||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 | 
			
		||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
			
		||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
			
		||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
			
		||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 | 
			
		||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 | 
			
		||||
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 | 
			
		||||
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 | 
			
		||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 | 
			
		||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 | 
			
		||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
			
		||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
			
		||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
			
		||||
@@ -325,15 +514,23 @@ golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3
 | 
			
		||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
			
		||||
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
			
		||||
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
			
		||||
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
			
		||||
golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
			
		||||
golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
			
		||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
			
		||||
@@ -341,6 +538,7 @@ golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtn
 | 
			
		||||
golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
			
		||||
golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
			
		||||
golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
			
		||||
@@ -359,6 +557,9 @@ golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roY
 | 
			
		||||
golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 | 
			
		||||
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 | 
			
		||||
golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
			
		||||
golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
			
		||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/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=
 | 
			
		||||
@@ -427,6 +628,7 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa
 | 
			
		||||
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
 | 
			
		||||
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
 | 
			
		||||
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
 | 
			
		||||
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
 | 
			
		||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 | 
			
		||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
 | 
			
		||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
 | 
			
		||||
@@ -445,12 +647,18 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
 | 
			
		||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
 | 
			
		||||
gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s=
 | 
			
		||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
 | 
			
		||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
			
		||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
			
		||||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
			
		||||
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
			
		||||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
			
		||||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
			
		||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
			
		||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 | 
			
		||||
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 | 
			
		||||
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								vendor/github.com/hellofresh/health-go/v4/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/hellofresh/health-go/v4/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
vendor/
 | 
			
		||||
coverage.txt
 | 
			
		||||
.idea/
 | 
			
		||||
							
								
								
									
										15
									
								
								vendor/github.com/hellofresh/health-go/v4/.golangci.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								vendor/github.com/hellofresh/health-go/v4/.golangci.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
# See https://golangci-lint.run/usage/configuration/#config-file for more information
 | 
			
		||||
run:
 | 
			
		||||
  timeout: 5m
 | 
			
		||||
linters:
 | 
			
		||||
  disable-all: true
 | 
			
		||||
  enable:
 | 
			
		||||
    - gofmt
 | 
			
		||||
    - golint
 | 
			
		||||
    - goimports
 | 
			
		||||
  fast: false
 | 
			
		||||
linters-settings:
 | 
			
		||||
  gofmt:
 | 
			
		||||
    simplify: false
 | 
			
		||||
issues:
 | 
			
		||||
  exclude-use-default: false
 | 
			
		||||
							
								
								
									
										13
									
								
								vendor/github.com/hellofresh/health-go/v4/.whitesource
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								vendor/github.com/hellofresh/health-go/v4/.whitesource
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
			
		||||
{
 | 
			
		||||
  "scanSettings": {
 | 
			
		||||
    "configMode": "AUTO",
 | 
			
		||||
    "configExternalURL": "",
 | 
			
		||||
    "projectToken" : ""
 | 
			
		||||
  },
 | 
			
		||||
  "checkRunSettings": {
 | 
			
		||||
    "vulnerableCheckRunConclusionLevel": "success"
 | 
			
		||||
  },
 | 
			
		||||
  "issueSettings": {
 | 
			
		||||
    "minSeverityLevel": "NONE"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										201
									
								
								vendor/github.com/hellofresh/health-go/v4/LICENSE.txt
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										201
									
								
								vendor/github.com/hellofresh/health-go/v4/LICENSE.txt
									
									
									
										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 2020 HelloFresh SE
 | 
			
		||||
 | 
			
		||||
   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.
 | 
			
		||||
							
								
								
									
										23
									
								
								vendor/github.com/hellofresh/health-go/v4/Makefile
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								vendor/github.com/hellofresh/health-go/v4/Makefile
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
OK_COLOR=\033[32;01m
 | 
			
		||||
NO_COLOR=\033[0m
 | 
			
		||||
 | 
			
		||||
test:
 | 
			
		||||
	@echo "$(OK_COLOR)==> Running tests against container deps$(NO_COLOR)"
 | 
			
		||||
	@docker-compose up -d
 | 
			
		||||
	@sleep 3 && \
 | 
			
		||||
		HEALTH_GO_PG_PQ_DSN="postgres://test:test@`docker-compose port pg-pq 5432`/test?sslmode=disable" \
 | 
			
		||||
		HEALTH_GO_PG_PGX4_DSN="postgres://test:test@`docker-compose port pg-pgx4 5432`/test?sslmode=disable" \
 | 
			
		||||
		HEALTH_GO_MQ_DSN="amqp://guest:guest@`docker-compose port rabbit 5672`/" \
 | 
			
		||||
		HEALTH_GO_MQ_URL="http://guest:guest@`docker-compose port rabbit 15672`/" \
 | 
			
		||||
		HEALTH_GO_RD_DSN="redis://`docker-compose port redis 6379`/" \
 | 
			
		||||
		HEALTH_GO_MG_DSN="mongodb://`docker-compose port mongo 27017`/" \
 | 
			
		||||
		HEALTH_GO_MS_DSN="test:test@tcp(`docker-compose port mysql 3306`)/test?charset=utf8" \
 | 
			
		||||
		HEALTH_GO_HTTP_URL="http://`docker-compose port http 8080`/status" \
 | 
			
		||||
		HEALTH_GO_MD_DSN="memcached://localhost:${{ job.services.memcached.ports[11211] }}/" \
 | 
			
		||||
		go test -cover ./... -coverprofile=coverage.txt -covermode=atomic
 | 
			
		||||
 | 
			
		||||
lint:
 | 
			
		||||
	@echo "$(OK_COLOR)==> Linting with golangci-lint$(NO_COLOR)"
 | 
			
		||||
	@docker run --rm -v $(pwd):/app -w /app golangci/golangci-lint:v1.33.0 golangci-lint run -v
 | 
			
		||||
 | 
			
		||||
.PHONY: test lint
 | 
			
		||||
							
								
								
									
										192
									
								
								vendor/github.com/hellofresh/health-go/v4/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										192
									
								
								vendor/github.com/hellofresh/health-go/v4/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,192 @@
 | 
			
		||||
# health-go
 | 
			
		||||
[](https://goreportcard.com/report/github.com/hellofresh/health-go)
 | 
			
		||||
[](https://godoc.org/github.com/hellofresh/health-go)
 | 
			
		||||
 | 
			
		||||
* Exposes an HTTP handler that retrieves health status of the application
 | 
			
		||||
* Implements some generic checkers for the following services:
 | 
			
		||||
  * RabbitMQ
 | 
			
		||||
  * PostgreSQL
 | 
			
		||||
  * Redis
 | 
			
		||||
  * HTTP
 | 
			
		||||
  * MongoDB
 | 
			
		||||
  * MySQL
 | 
			
		||||
  * gRPC
 | 
			
		||||
  * Memcached
 | 
			
		||||
 | 
			
		||||
## Usage
 | 
			
		||||
 | 
			
		||||
The library exports `Handler` and `HandlerFunc` functions which are fully compatible with `net/http`.
 | 
			
		||||
 | 
			
		||||
Additionally, library exports `Measure` function that returns summary status for all the registered health checks,
 | 
			
		||||
so it can be used in non-HTTP environments.
 | 
			
		||||
 | 
			
		||||
### Handler
 | 
			
		||||
 | 
			
		||||
```go
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/hellofresh/health-go/v4"
 | 
			
		||||
	healthMysql "github.com/hellofresh/health-go/v4/checks/mysql"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	// add some checks on instance creation
 | 
			
		||||
	h, _ := health.New(health.WithChecks(health.Config{
 | 
			
		||||
		Name:      "rabbitmq",
 | 
			
		||||
		Timeout:   time.Second * 5,
 | 
			
		||||
		SkipOnErr: true,
 | 
			
		||||
		Check: func(ctx context.Context) error {
 | 
			
		||||
			// rabbitmq health check implementation goes here
 | 
			
		||||
			return nil
 | 
			
		||||
		}}, health.Config{
 | 
			
		||||
		Name: "mongodb",
 | 
			
		||||
		Check: func(ctx context.Context) error {
 | 
			
		||||
			// mongo_db health check implementation goes here
 | 
			
		||||
			return nil
 | 
			
		||||
		},
 | 
			
		||||
	},
 | 
			
		||||
	))
 | 
			
		||||
 | 
			
		||||
	// and then add some more if needed
 | 
			
		||||
	h.Register(health.Config{
 | 
			
		||||
		Name:      "mysql",
 | 
			
		||||
		Timeout:   time.Second * 2,
 | 
			
		||||
		SkipOnErr: false,
 | 
			
		||||
		Check: healthMysql.New(healthMysql.Config{
 | 
			
		||||
			DSN: "test:test@tcp(0.0.0.0:31726)/test?charset=utf8",
 | 
			
		||||
		}),
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	http.Handle("/status", h.Handler())
 | 
			
		||||
	http.ListenAndServe(":3000", nil)
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### HandlerFunc
 | 
			
		||||
```go
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/go-chi/chi"
 | 
			
		||||
	"github.com/hellofresh/health-go/v4"
 | 
			
		||||
	healthMysql "github.com/hellofresh/health-go/v4/checks/mysql"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	// add some checks on instance creation
 | 
			
		||||
	h, _ := health.New(health.WithChecks(health.Config{
 | 
			
		||||
		Name:      "rabbitmq",
 | 
			
		||||
		Timeout:   time.Second * 5,
 | 
			
		||||
		SkipOnErr: true,
 | 
			
		||||
		Check: func(ctx context.Context) error {
 | 
			
		||||
			// rabbitmq health check implementation goes here
 | 
			
		||||
			return nil
 | 
			
		||||
		}}, health.Config{
 | 
			
		||||
		Name: "mongodb",
 | 
			
		||||
		Check: func(ctx context.Context) error {
 | 
			
		||||
			// mongo_db health check implementation goes here
 | 
			
		||||
			return nil
 | 
			
		||||
		},
 | 
			
		||||
	},
 | 
			
		||||
	))
 | 
			
		||||
 | 
			
		||||
	// and then add some more if needed
 | 
			
		||||
	h.Register(health.Config{
 | 
			
		||||
		Name:      "mysql",
 | 
			
		||||
		Timeout:   time.Second * 2,
 | 
			
		||||
		SkipOnErr: false,
 | 
			
		||||
		Check: healthMysql.New(healthMysql.Config{
 | 
			
		||||
			DSN: "test:test@tcp(0.0.0.0:31726)/test?charset=utf8",
 | 
			
		||||
		}),
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	r := chi.NewRouter()
 | 
			
		||||
	r.Get("/status", h.HandlerFunc)
 | 
			
		||||
	http.ListenAndServe(":3000", nil)
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
For more examples please check [here](https://github.com/hellofresh/health-go/blob/master/_examples/server.go)
 | 
			
		||||
## API Documentation
 | 
			
		||||
 | 
			
		||||
### `GET /status`
 | 
			
		||||
 | 
			
		||||
Get the health of the application.
 | 
			
		||||
- Method: `GET`
 | 
			
		||||
- Endpoint: `/status`
 | 
			
		||||
- Request:
 | 
			
		||||
```
 | 
			
		||||
curl localhost:3000/status
 | 
			
		||||
```
 | 
			
		||||
- Response:
 | 
			
		||||
 | 
			
		||||
HTTP/1.1 200 OK
 | 
			
		||||
```json
 | 
			
		||||
{
 | 
			
		||||
  "status": "OK",
 | 
			
		||||
  "timestamp": "2017-01-01T00:00:00.413567856+033:00",
 | 
			
		||||
  "system": {
 | 
			
		||||
    "version": "go1.8",
 | 
			
		||||
    "goroutines_count": 4,
 | 
			
		||||
    "total_alloc_bytes": 21321,
 | 
			
		||||
    "heap_objects_count": 21323,
 | 
			
		||||
    "alloc_bytes": 234523
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
HTTP/1.1 200 OK
 | 
			
		||||
```json
 | 
			
		||||
{
 | 
			
		||||
  "status": "Partially Available",
 | 
			
		||||
  "timestamp": "2017-01-01T00:00:00.413567856+033:00",
 | 
			
		||||
  "failures": {
 | 
			
		||||
    "rabbitmq": "Failed during rabbitmq health check"
 | 
			
		||||
  },
 | 
			
		||||
  "system": {
 | 
			
		||||
    "version": "go1.8",
 | 
			
		||||
    "goroutines_count": 4,
 | 
			
		||||
    "total_alloc_bytes": 21321,
 | 
			
		||||
    "heap_objects_count": 21323,
 | 
			
		||||
    "alloc_bytes": 234523
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
HTTP/1.1 503 Service Unavailable
 | 
			
		||||
```json
 | 
			
		||||
{
 | 
			
		||||
  "status": "Unavailable",
 | 
			
		||||
  "timestamp": "2017-01-01T00:00:00.413567856+033:00",
 | 
			
		||||
  "failures": {
 | 
			
		||||
    "mongodb": "Failed during mongodb health check"
 | 
			
		||||
  },
 | 
			
		||||
  "system": {
 | 
			
		||||
    "version": "go1.8",
 | 
			
		||||
    "goroutines_count": 4,
 | 
			
		||||
    "total_alloc_bytes": 21321,
 | 
			
		||||
    "heap_objects_count": 21323,
 | 
			
		||||
    "alloc_bytes": 234523
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Contributing
 | 
			
		||||
- Fork it
 | 
			
		||||
- Create your feature branch (`git checkout -b my-new-feature`)
 | 
			
		||||
- Commit your changes (`git commit -am 'Add some feature'`)
 | 
			
		||||
- Push to the branch (`git push origin my-new-feature`)
 | 
			
		||||
- Create new Pull Request
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
> GitHub [@hellofresh](https://github.com/hellofresh)  · 
 | 
			
		||||
> Medium [@engineering.hellofresh](https://engineering.hellofresh.com)
 | 
			
		||||
							
								
								
									
										88
									
								
								vendor/github.com/hellofresh/health-go/v4/docker-compose.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								vendor/github.com/hellofresh/health-go/v4/docker-compose.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,88 @@
 | 
			
		||||
version: '3'
 | 
			
		||||
services:
 | 
			
		||||
 | 
			
		||||
  pg-pq:
 | 
			
		||||
    image: postgres:9.6-alpine
 | 
			
		||||
    ports:
 | 
			
		||||
      - "5432"
 | 
			
		||||
    environment:
 | 
			
		||||
      POSTGRES_USER: test
 | 
			
		||||
      POSTGRES_PASSWORD: test
 | 
			
		||||
      POSTGRES_DB: test
 | 
			
		||||
    healthcheck:
 | 
			
		||||
      test: [ "CMD", "pg_isready" ]
 | 
			
		||||
      interval: 10s
 | 
			
		||||
      timeout: 5s
 | 
			
		||||
      retries: 5
 | 
			
		||||
 | 
			
		||||
  pg-pgx4:
 | 
			
		||||
    image: postgres:9.6-alpine
 | 
			
		||||
    ports:
 | 
			
		||||
      - "5432"
 | 
			
		||||
    environment:
 | 
			
		||||
      POSTGRES_USER: test
 | 
			
		||||
      POSTGRES_PASSWORD: test
 | 
			
		||||
      POSTGRES_DB: test
 | 
			
		||||
    healthcheck:
 | 
			
		||||
      test: [ "CMD", "pg_isready" ]
 | 
			
		||||
      interval: 10s
 | 
			
		||||
      timeout: 5s
 | 
			
		||||
      retries: 5
 | 
			
		||||
 | 
			
		||||
  rabbit:
 | 
			
		||||
    image: rabbitmq:3.6-management-alpine
 | 
			
		||||
    ports:
 | 
			
		||||
      - "5672"
 | 
			
		||||
      - "15672"
 | 
			
		||||
    healthcheck:
 | 
			
		||||
      test: [ "CMD", "rabbitmqctl", "status" ]
 | 
			
		||||
      interval: 10s
 | 
			
		||||
      timeout: 5s
 | 
			
		||||
      retries: 5
 | 
			
		||||
 | 
			
		||||
  redis:
 | 
			
		||||
    image: redis:3.2-alpine
 | 
			
		||||
    ports:
 | 
			
		||||
      - "6379"
 | 
			
		||||
    healthcheck:
 | 
			
		||||
      test: [ "CMD", "redis-cli", "ping" ]
 | 
			
		||||
      interval: 10s
 | 
			
		||||
      timeout: 5s
 | 
			
		||||
      retries: 5
 | 
			
		||||
 | 
			
		||||
  mongo:
 | 
			
		||||
    image: mongo:3
 | 
			
		||||
    ports:
 | 
			
		||||
      - "27017"
 | 
			
		||||
    healthcheck:
 | 
			
		||||
      test: "mongo localhost:27017/test --quiet --eval 'quit(db.runCommand({ ping: 1 }).ok ? 0 : 2)'"
 | 
			
		||||
      interval: 10s
 | 
			
		||||
      timeout: 5s
 | 
			
		||||
      retries: 5
 | 
			
		||||
 | 
			
		||||
  mysql:
 | 
			
		||||
    image: mysql:5.7
 | 
			
		||||
    ports:
 | 
			
		||||
      - "3306"
 | 
			
		||||
    environment:
 | 
			
		||||
      MYSQL_ROOT_PASSWORD: test
 | 
			
		||||
      MYSQL_DATABASE: test
 | 
			
		||||
      MYSQL_USER: test
 | 
			
		||||
      MYSQL_PASSWORD: test
 | 
			
		||||
    healthcheck:
 | 
			
		||||
      test: [ "CMD", "mysqladmin", "ping", "-h", "localhost" ]
 | 
			
		||||
      interval: 10s
 | 
			
		||||
      timeout: 5s
 | 
			
		||||
      retries: 5
 | 
			
		||||
 | 
			
		||||
  memcached:
 | 
			
		||||
    image: memcached:1.6.9-alpine
 | 
			
		||||
    ports:
 | 
			
		||||
      - "11211"
 | 
			
		||||
 | 
			
		||||
  http:
 | 
			
		||||
    image: pierreprinetti/apimock:latest
 | 
			
		||||
    ports:
 | 
			
		||||
      - "8080"
 | 
			
		||||
    environment:
 | 
			
		||||
      HOST: ":8080"
 | 
			
		||||
							
								
								
									
										262
									
								
								vendor/github.com/hellofresh/health-go/v4/health.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										262
									
								
								vendor/github.com/hellofresh/health-go/v4/health.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,262 @@
 | 
			
		||||
package health
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"runtime"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"go.opentelemetry.io/otel/attribute"
 | 
			
		||||
	"go.opentelemetry.io/otel/codes"
 | 
			
		||||
	"go.opentelemetry.io/otel/trace"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Status type represents health status
 | 
			
		||||
type Status string
 | 
			
		||||
 | 
			
		||||
// Possible health statuses
 | 
			
		||||
const (
 | 
			
		||||
	StatusOK                 Status = "OK"
 | 
			
		||||
	StatusPartiallyAvailable Status = "Partially Available"
 | 
			
		||||
	StatusUnavailable        Status = "Unavailable"
 | 
			
		||||
	StatusTimeout            Status = "Timeout during health check"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type (
 | 
			
		||||
	// CheckFunc is the func which executes the check.
 | 
			
		||||
	CheckFunc func(context.Context) error
 | 
			
		||||
 | 
			
		||||
	// Config carries the parameters to run the check.
 | 
			
		||||
	Config struct {
 | 
			
		||||
		// Name is the name of the resource to be checked.
 | 
			
		||||
		Name string
 | 
			
		||||
		// Timeout is the timeout defined for every check.
 | 
			
		||||
		Timeout time.Duration
 | 
			
		||||
		// SkipOnErr if set to true, it will retrieve StatusOK providing the error message from the failed resource.
 | 
			
		||||
		SkipOnErr bool
 | 
			
		||||
		// Check is the func which executes the check.
 | 
			
		||||
		Check CheckFunc
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Check represents the health check response.
 | 
			
		||||
	Check struct {
 | 
			
		||||
		// Status is the check status.
 | 
			
		||||
		Status Status `json:"status"`
 | 
			
		||||
		// Timestamp is the time in which the check occurred.
 | 
			
		||||
		Timestamp time.Time `json:"timestamp"`
 | 
			
		||||
		// Failures holds the failed checks along with their messages.
 | 
			
		||||
		Failures map[string]string `json:"failures,omitempty"`
 | 
			
		||||
		// System holds information of the go process.
 | 
			
		||||
		System `json:"system"`
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// System runtime variables about the go process.
 | 
			
		||||
	System struct {
 | 
			
		||||
		// Version is the go version.
 | 
			
		||||
		Version string `json:"version"`
 | 
			
		||||
		// GoroutinesCount is the number of the current goroutines.
 | 
			
		||||
		GoroutinesCount int `json:"goroutines_count"`
 | 
			
		||||
		// TotalAllocBytes is the total bytes allocated.
 | 
			
		||||
		TotalAllocBytes int `json:"total_alloc_bytes"`
 | 
			
		||||
		// HeapObjectsCount is the number of objects in the go heap.
 | 
			
		||||
		HeapObjectsCount int `json:"heap_objects_count"`
 | 
			
		||||
		// TotalAllocBytes is the bytes allocated and not yet freed.
 | 
			
		||||
		AllocBytes int `json:"alloc_bytes"`
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Health is the health-checks container
 | 
			
		||||
	Health struct {
 | 
			
		||||
		mu     sync.Mutex
 | 
			
		||||
		checks map[string]Config
 | 
			
		||||
 | 
			
		||||
		tp                  trace.TracerProvider
 | 
			
		||||
		instrumentationName string
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	checkResponse struct {
 | 
			
		||||
		name      string
 | 
			
		||||
		skipOnErr bool
 | 
			
		||||
		err       error
 | 
			
		||||
	}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// New instantiates and build new health check container
 | 
			
		||||
func New(opts ...Option) (*Health, error) {
 | 
			
		||||
	h := &Health{
 | 
			
		||||
		checks: make(map[string]Config),
 | 
			
		||||
		tp:     trace.NewNoopTracerProvider(),
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, o := range opts {
 | 
			
		||||
		if err := o(h); err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return h, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Register registers a check config to be performed.
 | 
			
		||||
func (h *Health) Register(c Config) error {
 | 
			
		||||
	if c.Timeout == 0 {
 | 
			
		||||
		c.Timeout = time.Second * 2
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if c.Name == "" {
 | 
			
		||||
		return errors.New("health check must have a name to be registered")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	h.mu.Lock()
 | 
			
		||||
	defer h.mu.Unlock()
 | 
			
		||||
 | 
			
		||||
	if _, ok := h.checks[c.Name]; ok {
 | 
			
		||||
		return fmt.Errorf("health check %q is already registered", c.Name)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	h.checks[c.Name] = c
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Handler returns an HTTP handler (http.HandlerFunc).
 | 
			
		||||
func (h *Health) Handler() http.Handler {
 | 
			
		||||
	return http.HandlerFunc(h.HandlerFunc)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HandlerFunc is the HTTP handler function.
 | 
			
		||||
func (h *Health) HandlerFunc(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	c := h.Measure(r.Context())
 | 
			
		||||
 | 
			
		||||
	w.Header().Set("Content-Type", "application/json")
 | 
			
		||||
	data, err := json.Marshal(c)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		w.WriteHeader(http.StatusInternalServerError)
 | 
			
		||||
		http.Error(w, err.Error(), http.StatusInternalServerError)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	code := http.StatusOK
 | 
			
		||||
	if c.Status == StatusUnavailable {
 | 
			
		||||
		code = http.StatusServiceUnavailable
 | 
			
		||||
	}
 | 
			
		||||
	w.WriteHeader(code)
 | 
			
		||||
	w.Write(data)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type checkSpan struct {
 | 
			
		||||
	ctx  context.Context
 | 
			
		||||
	span trace.Span
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newCheckSpan(ctx context.Context, tracer trace.Tracer, name string) checkSpan {
 | 
			
		||||
	var cs checkSpan
 | 
			
		||||
	cs.ctx, cs.span = tracer.Start(ctx, name)
 | 
			
		||||
	return cs
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Measure runs all the registered health checks and returns summary status
 | 
			
		||||
func (h *Health) Measure(ctx context.Context) Check {
 | 
			
		||||
	h.mu.Lock()
 | 
			
		||||
	defer h.mu.Unlock()
 | 
			
		||||
 | 
			
		||||
	tracer := h.tp.Tracer(h.instrumentationName)
 | 
			
		||||
 | 
			
		||||
	ctx, span := tracer.Start(ctx, "health.Measure")
 | 
			
		||||
	defer span.End()
 | 
			
		||||
 | 
			
		||||
	status := StatusOK
 | 
			
		||||
	total := len(h.checks)
 | 
			
		||||
	failures := make(map[string]string)
 | 
			
		||||
	resChan := make(chan checkResponse, total)
 | 
			
		||||
	checkSpans := make(map[string]checkSpan)
 | 
			
		||||
 | 
			
		||||
	span.SetAttributes(attribute.Int("checks", total))
 | 
			
		||||
 | 
			
		||||
	var wg sync.WaitGroup
 | 
			
		||||
	wg.Add(total)
 | 
			
		||||
 | 
			
		||||
	go func() {
 | 
			
		||||
		defer close(resChan)
 | 
			
		||||
 | 
			
		||||
		wg.Wait()
 | 
			
		||||
	}()
 | 
			
		||||
 | 
			
		||||
	for _, c := range h.checks {
 | 
			
		||||
		checkSpans[c.Name] = newCheckSpan(ctx, tracer, c.Name)
 | 
			
		||||
 | 
			
		||||
		go func(c Config) {
 | 
			
		||||
			defer wg.Done()
 | 
			
		||||
 | 
			
		||||
			select {
 | 
			
		||||
			case resChan <- checkResponse{c.Name, c.SkipOnErr, c.Check(ctx)}:
 | 
			
		||||
			default:
 | 
			
		||||
			}
 | 
			
		||||
		}(c)
 | 
			
		||||
 | 
			
		||||
	loop:
 | 
			
		||||
		for {
 | 
			
		||||
			select {
 | 
			
		||||
			case <-time.After(c.Timeout):
 | 
			
		||||
				failures[c.Name] = string(StatusTimeout)
 | 
			
		||||
				status = getAvailability(status, c.SkipOnErr)
 | 
			
		||||
 | 
			
		||||
				cs := checkSpans[c.Name]
 | 
			
		||||
				cs.span.SetStatus(codes.Error, string(StatusTimeout))
 | 
			
		||||
				cs.span.End()
 | 
			
		||||
 | 
			
		||||
				break loop
 | 
			
		||||
			case res := <-resChan:
 | 
			
		||||
				cs := checkSpans[res.name]
 | 
			
		||||
 | 
			
		||||
				if res.err != nil {
 | 
			
		||||
					failures[res.name] = res.err.Error()
 | 
			
		||||
					status = getAvailability(status, res.skipOnErr)
 | 
			
		||||
 | 
			
		||||
					cs.span.RecordError(res.err)
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				cs.span.End()
 | 
			
		||||
 | 
			
		||||
				break loop
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	span.SetAttributes(attribute.String("status", string(status)))
 | 
			
		||||
 | 
			
		||||
	return newCheck(status, failures)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newCheck(s Status, failures map[string]string) Check {
 | 
			
		||||
	return Check{
 | 
			
		||||
		Status:    s,
 | 
			
		||||
		Timestamp: time.Now(),
 | 
			
		||||
		Failures:  failures,
 | 
			
		||||
		System:    newSystemMetrics(),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newSystemMetrics() System {
 | 
			
		||||
	s := runtime.MemStats{}
 | 
			
		||||
	runtime.ReadMemStats(&s)
 | 
			
		||||
 | 
			
		||||
	return System{
 | 
			
		||||
		Version:          runtime.Version(),
 | 
			
		||||
		GoroutinesCount:  runtime.NumGoroutine(),
 | 
			
		||||
		TotalAllocBytes:  int(s.TotalAlloc),
 | 
			
		||||
		HeapObjectsCount: int(s.HeapObjects),
 | 
			
		||||
		AllocBytes:       int(s.Alloc),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getAvailability(s Status, skipOnErr bool) Status {
 | 
			
		||||
	if skipOnErr && s != StatusUnavailable {
 | 
			
		||||
		return StatusPartiallyAvailable
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return StatusUnavailable
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										34
									
								
								vendor/github.com/hellofresh/health-go/v4/options.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								vendor/github.com/hellofresh/health-go/v4/options.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
package health
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	"go.opentelemetry.io/otel/trace"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Option is the health-container options type
 | 
			
		||||
type Option func(*Health) error
 | 
			
		||||
 | 
			
		||||
// WithChecks adds checks to newly instantiated health-container
 | 
			
		||||
func WithChecks(checks ...Config) Option {
 | 
			
		||||
	return func(h *Health) error {
 | 
			
		||||
		for _, c := range checks {
 | 
			
		||||
			if err := h.Register(c); err != nil {
 | 
			
		||||
				return fmt.Errorf("could not register check %q: %w", c.Name, err)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WithTracerProvider sets trace provider for the checks and instrumentation name that will be used
 | 
			
		||||
// for tracer from trace provider.
 | 
			
		||||
func WithTracerProvider(tp trace.TracerProvider, instrumentationName string) Option {
 | 
			
		||||
	return func(h *Health) error {
 | 
			
		||||
		h.tp = tp
 | 
			
		||||
		h.instrumentationName = instrumentationName
 | 
			
		||||
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										201
									
								
								vendor/go.opentelemetry.io/otel/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										201
									
								
								vendor/go.opentelemetry.io/otel/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.
 | 
			
		||||
							
								
								
									
										16
									
								
								vendor/go.opentelemetry.io/otel/attribute/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								vendor/go.opentelemetry.io/otel/attribute/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
			
		||||
// Copyright The OpenTelemetry Authors
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
//     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
// Package attribute provides key and value attributes.
 | 
			
		||||
package attribute // import "go.opentelemetry.io/otel/attribute"
 | 
			
		||||
							
								
								
									
										150
									
								
								vendor/go.opentelemetry.io/otel/attribute/encoder.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										150
									
								
								vendor/go.opentelemetry.io/otel/attribute/encoder.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,150 @@
 | 
			
		||||
// Copyright The OpenTelemetry Authors
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
//     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
package attribute // import "go.opentelemetry.io/otel/attribute"
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"sync/atomic"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type (
 | 
			
		||||
	// Encoder is a mechanism for serializing a label set into a
 | 
			
		||||
	// specific string representation that supports caching, to
 | 
			
		||||
	// avoid repeated serialization. An example could be an
 | 
			
		||||
	// exporter encoding the label set into a wire representation.
 | 
			
		||||
	Encoder interface {
 | 
			
		||||
		// Encode returns the serialized encoding of the label
 | 
			
		||||
		// set using its Iterator.  This result may be cached
 | 
			
		||||
		// by a attribute.Set.
 | 
			
		||||
		Encode(iterator Iterator) string
 | 
			
		||||
 | 
			
		||||
		// ID returns a value that is unique for each class of
 | 
			
		||||
		// label encoder.  Label encoders allocate these using
 | 
			
		||||
		// `NewEncoderID`.
 | 
			
		||||
		ID() EncoderID
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// EncoderID is used to identify distinct Encoder
 | 
			
		||||
	// implementations, for caching encoded results.
 | 
			
		||||
	EncoderID struct {
 | 
			
		||||
		value uint64
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// defaultLabelEncoder uses a sync.Pool of buffers to reduce
 | 
			
		||||
	// the number of allocations used in encoding labels.  This
 | 
			
		||||
	// implementation encodes a comma-separated list of key=value,
 | 
			
		||||
	// with '/'-escaping of '=', ',', and '\'.
 | 
			
		||||
	defaultLabelEncoder struct {
 | 
			
		||||
		// pool is a pool of labelset builders.  The buffers in this
 | 
			
		||||
		// pool grow to a size that most label encodings will not
 | 
			
		||||
		// allocate new memory.
 | 
			
		||||
		pool sync.Pool // *bytes.Buffer
 | 
			
		||||
	}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// escapeChar is used to ensure uniqueness of the label encoding where
 | 
			
		||||
// keys or values contain either '=' or ','.  Since there is no parser
 | 
			
		||||
// needed for this encoding and its only requirement is to be unique,
 | 
			
		||||
// this choice is arbitrary.  Users will see these in some exporters
 | 
			
		||||
// (e.g., stdout), so the backslash ('\') is used as a conventional choice.
 | 
			
		||||
const escapeChar = '\\'
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	_ Encoder = &defaultLabelEncoder{}
 | 
			
		||||
 | 
			
		||||
	// encoderIDCounter is for generating IDs for other label
 | 
			
		||||
	// encoders.
 | 
			
		||||
	encoderIDCounter uint64
 | 
			
		||||
 | 
			
		||||
	defaultEncoderOnce     sync.Once
 | 
			
		||||
	defaultEncoderID       = NewEncoderID()
 | 
			
		||||
	defaultEncoderInstance *defaultLabelEncoder
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// NewEncoderID returns a unique label encoder ID. It should be
 | 
			
		||||
// called once per each type of label encoder. Preferably in init() or
 | 
			
		||||
// in var definition.
 | 
			
		||||
func NewEncoderID() EncoderID {
 | 
			
		||||
	return EncoderID{value: atomic.AddUint64(&encoderIDCounter, 1)}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DefaultEncoder returns a label encoder that encodes labels
 | 
			
		||||
// in such a way that each escaped label's key is followed by an equal
 | 
			
		||||
// sign and then by an escaped label's value. All key-value pairs are
 | 
			
		||||
// separated by a comma.
 | 
			
		||||
//
 | 
			
		||||
// Escaping is done by prepending a backslash before either a
 | 
			
		||||
// backslash, equal sign or a comma.
 | 
			
		||||
func DefaultEncoder() Encoder {
 | 
			
		||||
	defaultEncoderOnce.Do(func() {
 | 
			
		||||
		defaultEncoderInstance = &defaultLabelEncoder{
 | 
			
		||||
			pool: sync.Pool{
 | 
			
		||||
				New: func() interface{} {
 | 
			
		||||
					return &bytes.Buffer{}
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		}
 | 
			
		||||
	})
 | 
			
		||||
	return defaultEncoderInstance
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Encode is a part of an implementation of the LabelEncoder
 | 
			
		||||
// interface.
 | 
			
		||||
func (d *defaultLabelEncoder) Encode(iter Iterator) string {
 | 
			
		||||
	buf := d.pool.Get().(*bytes.Buffer)
 | 
			
		||||
	defer d.pool.Put(buf)
 | 
			
		||||
	buf.Reset()
 | 
			
		||||
 | 
			
		||||
	for iter.Next() {
 | 
			
		||||
		i, keyValue := iter.IndexedLabel()
 | 
			
		||||
		if i > 0 {
 | 
			
		||||
			_, _ = buf.WriteRune(',')
 | 
			
		||||
		}
 | 
			
		||||
		copyAndEscape(buf, string(keyValue.Key))
 | 
			
		||||
 | 
			
		||||
		_, _ = buf.WriteRune('=')
 | 
			
		||||
 | 
			
		||||
		if keyValue.Value.Type() == STRING {
 | 
			
		||||
			copyAndEscape(buf, keyValue.Value.AsString())
 | 
			
		||||
		} else {
 | 
			
		||||
			_, _ = buf.WriteString(keyValue.Value.Emit())
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return buf.String()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ID is a part of an implementation of the LabelEncoder interface.
 | 
			
		||||
func (*defaultLabelEncoder) ID() EncoderID {
 | 
			
		||||
	return defaultEncoderID
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// copyAndEscape escapes `=`, `,` and its own escape character (`\`),
 | 
			
		||||
// making the default encoding unique.
 | 
			
		||||
func copyAndEscape(buf *bytes.Buffer, val string) {
 | 
			
		||||
	for _, ch := range val {
 | 
			
		||||
		switch ch {
 | 
			
		||||
		case '=', ',', escapeChar:
 | 
			
		||||
			buf.WriteRune(escapeChar)
 | 
			
		||||
		}
 | 
			
		||||
		buf.WriteRune(ch)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Valid returns true if this encoder ID was allocated by
 | 
			
		||||
// `NewEncoderID`.  Invalid encoder IDs will not be cached.
 | 
			
		||||
func (id EncoderID) Valid() bool {
 | 
			
		||||
	return id.value != 0
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										143
									
								
								vendor/go.opentelemetry.io/otel/attribute/iterator.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										143
									
								
								vendor/go.opentelemetry.io/otel/attribute/iterator.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,143 @@
 | 
			
		||||
// Copyright The OpenTelemetry Authors
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
//     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
package attribute // import "go.opentelemetry.io/otel/attribute"
 | 
			
		||||
 | 
			
		||||
// Iterator allows iterating over the set of labels in order,
 | 
			
		||||
// sorted by key.
 | 
			
		||||
type Iterator struct {
 | 
			
		||||
	storage *Set
 | 
			
		||||
	idx     int
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MergeIterator supports iterating over two sets of labels while
 | 
			
		||||
// eliminating duplicate values from the combined set.  The first
 | 
			
		||||
// iterator value takes precedence.
 | 
			
		||||
type MergeIterator struct {
 | 
			
		||||
	one     oneIterator
 | 
			
		||||
	two     oneIterator
 | 
			
		||||
	current KeyValue
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type oneIterator struct {
 | 
			
		||||
	iter  Iterator
 | 
			
		||||
	done  bool
 | 
			
		||||
	label KeyValue
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Next moves the iterator to the next position. Returns false if there
 | 
			
		||||
// are no more labels.
 | 
			
		||||
func (i *Iterator) Next() bool {
 | 
			
		||||
	i.idx++
 | 
			
		||||
	return i.idx < i.Len()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Label returns current KeyValue. Must be called only after Next returns
 | 
			
		||||
// true.
 | 
			
		||||
func (i *Iterator) Label() KeyValue {
 | 
			
		||||
	kv, _ := i.storage.Get(i.idx)
 | 
			
		||||
	return kv
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Attribute is a synonym for Label().
 | 
			
		||||
func (i *Iterator) Attribute() KeyValue {
 | 
			
		||||
	return i.Label()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IndexedLabel returns current index and attribute. Must be called only
 | 
			
		||||
// after Next returns true.
 | 
			
		||||
func (i *Iterator) IndexedLabel() (int, KeyValue) {
 | 
			
		||||
	return i.idx, i.Label()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Len returns a number of labels in the iterator's `*Set`.
 | 
			
		||||
func (i *Iterator) Len() int {
 | 
			
		||||
	return i.storage.Len()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ToSlice is a convenience function that creates a slice of labels
 | 
			
		||||
// from the passed iterator. The iterator is set up to start from the
 | 
			
		||||
// beginning before creating the slice.
 | 
			
		||||
func (i *Iterator) ToSlice() []KeyValue {
 | 
			
		||||
	l := i.Len()
 | 
			
		||||
	if l == 0 {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	i.idx = -1
 | 
			
		||||
	slice := make([]KeyValue, 0, l)
 | 
			
		||||
	for i.Next() {
 | 
			
		||||
		slice = append(slice, i.Label())
 | 
			
		||||
	}
 | 
			
		||||
	return slice
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewMergeIterator returns a MergeIterator for merging two label sets
 | 
			
		||||
// Duplicates are resolved by taking the value from the first set.
 | 
			
		||||
func NewMergeIterator(s1, s2 *Set) MergeIterator {
 | 
			
		||||
	mi := MergeIterator{
 | 
			
		||||
		one: makeOne(s1.Iter()),
 | 
			
		||||
		two: makeOne(s2.Iter()),
 | 
			
		||||
	}
 | 
			
		||||
	return mi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func makeOne(iter Iterator) oneIterator {
 | 
			
		||||
	oi := oneIterator{
 | 
			
		||||
		iter: iter,
 | 
			
		||||
	}
 | 
			
		||||
	oi.advance()
 | 
			
		||||
	return oi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (oi *oneIterator) advance() {
 | 
			
		||||
	if oi.done = !oi.iter.Next(); !oi.done {
 | 
			
		||||
		oi.label = oi.iter.Label()
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Next returns true if there is another label available.
 | 
			
		||||
func (m *MergeIterator) Next() bool {
 | 
			
		||||
	if m.one.done && m.two.done {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	if m.one.done {
 | 
			
		||||
		m.current = m.two.label
 | 
			
		||||
		m.two.advance()
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
	if m.two.done {
 | 
			
		||||
		m.current = m.one.label
 | 
			
		||||
		m.one.advance()
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
	if m.one.label.Key == m.two.label.Key {
 | 
			
		||||
		m.current = m.one.label // first iterator label value wins
 | 
			
		||||
		m.one.advance()
 | 
			
		||||
		m.two.advance()
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
	if m.one.label.Key < m.two.label.Key {
 | 
			
		||||
		m.current = m.one.label
 | 
			
		||||
		m.one.advance()
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
	m.current = m.two.label
 | 
			
		||||
	m.two.advance()
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Label returns the current value after Next() returns true.
 | 
			
		||||
func (m *MergeIterator) Label() KeyValue {
 | 
			
		||||
	return m.current
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										134
									
								
								vendor/go.opentelemetry.io/otel/attribute/key.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										134
									
								
								vendor/go.opentelemetry.io/otel/attribute/key.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,134 @@
 | 
			
		||||
// Copyright The OpenTelemetry Authors
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
//     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
package attribute // import "go.opentelemetry.io/otel/attribute"
 | 
			
		||||
 | 
			
		||||
// Key represents the key part in key-value pairs. It's a string. The
 | 
			
		||||
// allowed character set in the key depends on the use of the key.
 | 
			
		||||
type Key string
 | 
			
		||||
 | 
			
		||||
// Bool creates a KeyValue instance with a BOOL Value.
 | 
			
		||||
//
 | 
			
		||||
// If creating both a key and value at the same time, use the provided
 | 
			
		||||
// convenience function instead -- Bool(name, value).
 | 
			
		||||
func (k Key) Bool(v bool) KeyValue {
 | 
			
		||||
	return KeyValue{
 | 
			
		||||
		Key:   k,
 | 
			
		||||
		Value: BoolValue(v),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// BoolSlice creates a KeyValue instance with a BOOLSLICE Value.
 | 
			
		||||
//
 | 
			
		||||
// If creating both a key and value at the same time, use the provided
 | 
			
		||||
// convenience function instead -- BoolSlice(name, value).
 | 
			
		||||
func (k Key) BoolSlice(v []bool) KeyValue {
 | 
			
		||||
	return KeyValue{
 | 
			
		||||
		Key:   k,
 | 
			
		||||
		Value: BoolSliceValue(v),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Int creates a KeyValue instance with an INT64 Value.
 | 
			
		||||
//
 | 
			
		||||
// If creating both a key and value at the same time, use the provided
 | 
			
		||||
// convenience function instead -- Int(name, value).
 | 
			
		||||
func (k Key) Int(v int) KeyValue {
 | 
			
		||||
	return KeyValue{
 | 
			
		||||
		Key:   k,
 | 
			
		||||
		Value: IntValue(v),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IntSlice creates a KeyValue instance with an INT64SLICE Value.
 | 
			
		||||
//
 | 
			
		||||
// If creating both a key and value at the same time, use the provided
 | 
			
		||||
// convenience function instead -- IntSlice(name, value).
 | 
			
		||||
func (k Key) IntSlice(v []int) KeyValue {
 | 
			
		||||
	return KeyValue{
 | 
			
		||||
		Key:   k,
 | 
			
		||||
		Value: IntSliceValue(v),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Int64 creates a KeyValue instance with an INT64 Value.
 | 
			
		||||
//
 | 
			
		||||
// If creating both a key and value at the same time, use the provided
 | 
			
		||||
// convenience function instead -- Int64(name, value).
 | 
			
		||||
func (k Key) Int64(v int64) KeyValue {
 | 
			
		||||
	return KeyValue{
 | 
			
		||||
		Key:   k,
 | 
			
		||||
		Value: Int64Value(v),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Int64Slice creates a KeyValue instance with an INT64SLICE Value.
 | 
			
		||||
//
 | 
			
		||||
// If creating both a key and value at the same time, use the provided
 | 
			
		||||
// convenience function instead -- Int64Slice(name, value).
 | 
			
		||||
func (k Key) Int64Slice(v []int64) KeyValue {
 | 
			
		||||
	return KeyValue{
 | 
			
		||||
		Key:   k,
 | 
			
		||||
		Value: Int64SliceValue(v),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Float64 creates a KeyValue instance with a FLOAT64 Value.
 | 
			
		||||
//
 | 
			
		||||
// If creating both a key and value at the same time, use the provided
 | 
			
		||||
// convenience function instead -- Float64(name, value).
 | 
			
		||||
func (k Key) Float64(v float64) KeyValue {
 | 
			
		||||
	return KeyValue{
 | 
			
		||||
		Key:   k,
 | 
			
		||||
		Value: Float64Value(v),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Float64Slice creates a KeyValue instance with a FLOAT64SLICE Value.
 | 
			
		||||
//
 | 
			
		||||
// If creating both a key and value at the same time, use the provided
 | 
			
		||||
// convenience function instead -- Float64(name, value).
 | 
			
		||||
func (k Key) Float64Slice(v []float64) KeyValue {
 | 
			
		||||
	return KeyValue{
 | 
			
		||||
		Key:   k,
 | 
			
		||||
		Value: Float64SliceValue(v),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// String creates a KeyValue instance with a STRING Value.
 | 
			
		||||
//
 | 
			
		||||
// If creating both a key and value at the same time, use the provided
 | 
			
		||||
// convenience function instead -- String(name, value).
 | 
			
		||||
func (k Key) String(v string) KeyValue {
 | 
			
		||||
	return KeyValue{
 | 
			
		||||
		Key:   k,
 | 
			
		||||
		Value: StringValue(v),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// StringSlice creates a KeyValue instance with a STRINGSLICE Value.
 | 
			
		||||
//
 | 
			
		||||
// If creating both a key and value at the same time, use the provided
 | 
			
		||||
// convenience function instead -- StringSlice(name, value).
 | 
			
		||||
func (k Key) StringSlice(v []string) KeyValue {
 | 
			
		||||
	return KeyValue{
 | 
			
		||||
		Key:   k,
 | 
			
		||||
		Value: StringSliceValue(v),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Defined returns true for non-empty keys.
 | 
			
		||||
func (k Key) Defined() bool {
 | 
			
		||||
	return len(k) != 0
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										86
									
								
								vendor/go.opentelemetry.io/otel/attribute/kv.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								vendor/go.opentelemetry.io/otel/attribute/kv.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,86 @@
 | 
			
		||||
// Copyright The OpenTelemetry Authors
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
//     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
package attribute // import "go.opentelemetry.io/otel/attribute"
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// KeyValue holds a key and value pair.
 | 
			
		||||
type KeyValue struct {
 | 
			
		||||
	Key   Key
 | 
			
		||||
	Value Value
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Valid returns if kv is a valid OpenTelemetry attribute.
 | 
			
		||||
func (kv KeyValue) Valid() bool {
 | 
			
		||||
	return kv.Key != "" && kv.Value.Type() != INVALID
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Bool creates a KeyValue with a BOOL Value type.
 | 
			
		||||
func Bool(k string, v bool) KeyValue {
 | 
			
		||||
	return Key(k).Bool(v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// BoolSlice creates a KeyValue with a BOOLSLICE Value type.
 | 
			
		||||
func BoolSlice(k string, v []bool) KeyValue {
 | 
			
		||||
	return Key(k).BoolSlice(v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Int creates a KeyValue with an INT64 Value type.
 | 
			
		||||
func Int(k string, v int) KeyValue {
 | 
			
		||||
	return Key(k).Int(v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IntSlice creates a KeyValue with an INT64SLICE Value type.
 | 
			
		||||
func IntSlice(k string, v []int) KeyValue {
 | 
			
		||||
	return Key(k).IntSlice(v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Int64 creates a KeyValue with an INT64 Value type.
 | 
			
		||||
func Int64(k string, v int64) KeyValue {
 | 
			
		||||
	return Key(k).Int64(v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Int64Slice creates a KeyValue with an INT64SLICE Value type.
 | 
			
		||||
func Int64Slice(k string, v []int64) KeyValue {
 | 
			
		||||
	return Key(k).Int64Slice(v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Float64 creates a KeyValue with a FLOAT64 Value type.
 | 
			
		||||
func Float64(k string, v float64) KeyValue {
 | 
			
		||||
	return Key(k).Float64(v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Float64Slice creates a KeyValue with a FLOAT64SLICE Value type.
 | 
			
		||||
func Float64Slice(k string, v []float64) KeyValue {
 | 
			
		||||
	return Key(k).Float64Slice(v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// String creates a KeyValue with a STRING Value type.
 | 
			
		||||
func String(k, v string) KeyValue {
 | 
			
		||||
	return Key(k).String(v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// StringSlice creates a KeyValue with a STRINGSLICE Value type.
 | 
			
		||||
func StringSlice(k string, v []string) KeyValue {
 | 
			
		||||
	return Key(k).StringSlice(v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Stringer creates a new key-value pair with a passed name and a string
 | 
			
		||||
// value generated by the passed Stringer interface.
 | 
			
		||||
func Stringer(k string, v fmt.Stringer) KeyValue {
 | 
			
		||||
	return Key(k).String(v.String())
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										426
									
								
								vendor/go.opentelemetry.io/otel/attribute/set.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										426
									
								
								vendor/go.opentelemetry.io/otel/attribute/set.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,426 @@
 | 
			
		||||
// Copyright The OpenTelemetry Authors
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
//     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
package attribute // import "go.opentelemetry.io/otel/attribute"
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"sort"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type (
 | 
			
		||||
	// Set is the representation for a distinct label set.  It
 | 
			
		||||
	// manages an immutable set of labels, with an internal cache
 | 
			
		||||
	// for storing label encodings.
 | 
			
		||||
	//
 | 
			
		||||
	// This type supports the `Equivalent` method of comparison
 | 
			
		||||
	// using values of type `Distinct`.
 | 
			
		||||
	//
 | 
			
		||||
	// This type is used to implement:
 | 
			
		||||
	// 1. Metric labels
 | 
			
		||||
	// 2. Resource sets
 | 
			
		||||
	// 3. Correlation map (TODO)
 | 
			
		||||
	Set struct {
 | 
			
		||||
		equivalent Distinct
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Distinct wraps a variable-size array of `KeyValue`,
 | 
			
		||||
	// constructed with keys in sorted order.  This can be used as
 | 
			
		||||
	// a map key or for equality checking between Sets.
 | 
			
		||||
	Distinct struct {
 | 
			
		||||
		iface interface{}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Filter supports removing certain labels from label sets.
 | 
			
		||||
	// When the filter returns true, the label will be kept in
 | 
			
		||||
	// the filtered label set.  When the filter returns false, the
 | 
			
		||||
	// label is excluded from the filtered label set, and the
 | 
			
		||||
	// label instead appears in the `removed` list of excluded labels.
 | 
			
		||||
	Filter func(KeyValue) bool
 | 
			
		||||
 | 
			
		||||
	// Sortable implements `sort.Interface`, used for sorting
 | 
			
		||||
	// `KeyValue`.  This is an exported type to support a
 | 
			
		||||
	// memory optimization.  A pointer to one of these is needed
 | 
			
		||||
	// for the call to `sort.Stable()`, which the caller may
 | 
			
		||||
	// provide in order to avoid an allocation.  See
 | 
			
		||||
	// `NewSetWithSortable()`.
 | 
			
		||||
	Sortable []KeyValue
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	// keyValueType is used in `computeDistinctReflect`.
 | 
			
		||||
	keyValueType = reflect.TypeOf(KeyValue{})
 | 
			
		||||
 | 
			
		||||
	// emptySet is returned for empty label sets.
 | 
			
		||||
	emptySet = &Set{
 | 
			
		||||
		equivalent: Distinct{
 | 
			
		||||
			iface: [0]KeyValue{},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// EmptySet returns a reference to a Set with no elements.
 | 
			
		||||
//
 | 
			
		||||
// This is a convenience provided for optimized calling utility.
 | 
			
		||||
func EmptySet() *Set {
 | 
			
		||||
	return emptySet
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// reflect abbreviates `reflect.ValueOf`.
 | 
			
		||||
func (d Distinct) reflect() reflect.Value {
 | 
			
		||||
	return reflect.ValueOf(d.iface)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Valid returns true if this value refers to a valid `*Set`.
 | 
			
		||||
func (d Distinct) Valid() bool {
 | 
			
		||||
	return d.iface != nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Len returns the number of labels in this set.
 | 
			
		||||
func (l *Set) Len() int {
 | 
			
		||||
	if l == nil || !l.equivalent.Valid() {
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
	return l.equivalent.reflect().Len()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Get returns the KeyValue at ordered position `idx` in this set.
 | 
			
		||||
func (l *Set) Get(idx int) (KeyValue, bool) {
 | 
			
		||||
	if l == nil {
 | 
			
		||||
		return KeyValue{}, false
 | 
			
		||||
	}
 | 
			
		||||
	value := l.equivalent.reflect()
 | 
			
		||||
 | 
			
		||||
	if idx >= 0 && idx < value.Len() {
 | 
			
		||||
		// Note: The Go compiler successfully avoids an allocation for
 | 
			
		||||
		// the interface{} conversion here:
 | 
			
		||||
		return value.Index(idx).Interface().(KeyValue), true
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return KeyValue{}, false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Value returns the value of a specified key in this set.
 | 
			
		||||
func (l *Set) Value(k Key) (Value, bool) {
 | 
			
		||||
	if l == nil {
 | 
			
		||||
		return Value{}, false
 | 
			
		||||
	}
 | 
			
		||||
	rValue := l.equivalent.reflect()
 | 
			
		||||
	vlen := rValue.Len()
 | 
			
		||||
 | 
			
		||||
	idx := sort.Search(vlen, func(idx int) bool {
 | 
			
		||||
		return rValue.Index(idx).Interface().(KeyValue).Key >= k
 | 
			
		||||
	})
 | 
			
		||||
	if idx >= vlen {
 | 
			
		||||
		return Value{}, false
 | 
			
		||||
	}
 | 
			
		||||
	keyValue := rValue.Index(idx).Interface().(KeyValue)
 | 
			
		||||
	if k == keyValue.Key {
 | 
			
		||||
		return keyValue.Value, true
 | 
			
		||||
	}
 | 
			
		||||
	return Value{}, false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HasValue tests whether a key is defined in this set.
 | 
			
		||||
func (l *Set) HasValue(k Key) bool {
 | 
			
		||||
	if l == nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	_, ok := l.Value(k)
 | 
			
		||||
	return ok
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Iter returns an iterator for visiting the labels in this set.
 | 
			
		||||
func (l *Set) Iter() Iterator {
 | 
			
		||||
	return Iterator{
 | 
			
		||||
		storage: l,
 | 
			
		||||
		idx:     -1,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ToSlice returns the set of labels belonging to this set, sorted,
 | 
			
		||||
// where keys appear no more than once.
 | 
			
		||||
func (l *Set) ToSlice() []KeyValue {
 | 
			
		||||
	iter := l.Iter()
 | 
			
		||||
	return iter.ToSlice()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Equivalent returns a value that may be used as a map key.  The
 | 
			
		||||
// Distinct type guarantees that the result will equal the equivalent
 | 
			
		||||
// Distinct value of any label set with the same elements as this,
 | 
			
		||||
// where sets are made unique by choosing the last value in the input
 | 
			
		||||
// for any given key.
 | 
			
		||||
func (l *Set) Equivalent() Distinct {
 | 
			
		||||
	if l == nil || !l.equivalent.Valid() {
 | 
			
		||||
		return emptySet.equivalent
 | 
			
		||||
	}
 | 
			
		||||
	return l.equivalent
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Equals returns true if the argument set is equivalent to this set.
 | 
			
		||||
func (l *Set) Equals(o *Set) bool {
 | 
			
		||||
	return l.Equivalent() == o.Equivalent()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Encoded returns the encoded form of this set, according to
 | 
			
		||||
// `encoder`.
 | 
			
		||||
func (l *Set) Encoded(encoder Encoder) string {
 | 
			
		||||
	if l == nil || encoder == nil {
 | 
			
		||||
		return ""
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return encoder.Encode(l.Iter())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func empty() Set {
 | 
			
		||||
	return Set{
 | 
			
		||||
		equivalent: emptySet.equivalent,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewSet returns a new `Set`.  See the documentation for
 | 
			
		||||
// `NewSetWithSortableFiltered` for more details.
 | 
			
		||||
//
 | 
			
		||||
// Except for empty sets, this method adds an additional allocation
 | 
			
		||||
// compared with calls that include a `*Sortable`.
 | 
			
		||||
func NewSet(kvs ...KeyValue) Set {
 | 
			
		||||
	// Check for empty set.
 | 
			
		||||
	if len(kvs) == 0 {
 | 
			
		||||
		return empty()
 | 
			
		||||
	}
 | 
			
		||||
	s, _ := NewSetWithSortableFiltered(kvs, new(Sortable), nil)
 | 
			
		||||
	return s
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewSetWithSortable returns a new `Set`.  See the documentation for
 | 
			
		||||
// `NewSetWithSortableFiltered` for more details.
 | 
			
		||||
//
 | 
			
		||||
// This call includes a `*Sortable` option as a memory optimization.
 | 
			
		||||
func NewSetWithSortable(kvs []KeyValue, tmp *Sortable) Set {
 | 
			
		||||
	// Check for empty set.
 | 
			
		||||
	if len(kvs) == 0 {
 | 
			
		||||
		return empty()
 | 
			
		||||
	}
 | 
			
		||||
	s, _ := NewSetWithSortableFiltered(kvs, tmp, nil)
 | 
			
		||||
	return s
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewSetWithFiltered returns a new `Set`.  See the documentation for
 | 
			
		||||
// `NewSetWithSortableFiltered` for more details.
 | 
			
		||||
//
 | 
			
		||||
// This call includes a `Filter` to include/exclude label keys from
 | 
			
		||||
// the return value.  Excluded keys are returned as a slice of label
 | 
			
		||||
// values.
 | 
			
		||||
func NewSetWithFiltered(kvs []KeyValue, filter Filter) (Set, []KeyValue) {
 | 
			
		||||
	// Check for empty set.
 | 
			
		||||
	if len(kvs) == 0 {
 | 
			
		||||
		return empty(), nil
 | 
			
		||||
	}
 | 
			
		||||
	return NewSetWithSortableFiltered(kvs, new(Sortable), filter)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewSetWithSortableFiltered returns a new `Set`.
 | 
			
		||||
//
 | 
			
		||||
// Duplicate keys are eliminated by taking the last value.  This
 | 
			
		||||
// re-orders the input slice so that unique last-values are contiguous
 | 
			
		||||
// at the end of the slice.
 | 
			
		||||
//
 | 
			
		||||
// This ensures the following:
 | 
			
		||||
//
 | 
			
		||||
// - Last-value-wins semantics
 | 
			
		||||
// - Caller sees the reordering, but doesn't lose values
 | 
			
		||||
// - Repeated call preserve last-value wins.
 | 
			
		||||
//
 | 
			
		||||
// Note that methods are defined on `*Set`, although this returns `Set`.
 | 
			
		||||
// Callers can avoid memory allocations by:
 | 
			
		||||
//
 | 
			
		||||
// - allocating a `Sortable` for use as a temporary in this method
 | 
			
		||||
// - allocating a `Set` for storing the return value of this
 | 
			
		||||
//   constructor.
 | 
			
		||||
//
 | 
			
		||||
// The result maintains a cache of encoded labels, by attribute.EncoderID.
 | 
			
		||||
// This value should not be copied after its first use.
 | 
			
		||||
//
 | 
			
		||||
// The second `[]KeyValue` return value is a list of labels that were
 | 
			
		||||
// excluded by the Filter (if non-nil).
 | 
			
		||||
func NewSetWithSortableFiltered(kvs []KeyValue, tmp *Sortable, filter Filter) (Set, []KeyValue) {
 | 
			
		||||
	// Check for empty set.
 | 
			
		||||
	if len(kvs) == 0 {
 | 
			
		||||
		return empty(), nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	*tmp = kvs
 | 
			
		||||
 | 
			
		||||
	// Stable sort so the following de-duplication can implement
 | 
			
		||||
	// last-value-wins semantics.
 | 
			
		||||
	sort.Stable(tmp)
 | 
			
		||||
 | 
			
		||||
	*tmp = nil
 | 
			
		||||
 | 
			
		||||
	position := len(kvs) - 1
 | 
			
		||||
	offset := position - 1
 | 
			
		||||
 | 
			
		||||
	// The requirements stated above require that the stable
 | 
			
		||||
	// result be placed in the end of the input slice, while
 | 
			
		||||
	// overwritten values are swapped to the beginning.
 | 
			
		||||
	//
 | 
			
		||||
	// De-duplicate with last-value-wins semantics.  Preserve
 | 
			
		||||
	// duplicate values at the beginning of the input slice.
 | 
			
		||||
	for ; offset >= 0; offset-- {
 | 
			
		||||
		if kvs[offset].Key == kvs[position].Key {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		position--
 | 
			
		||||
		kvs[offset], kvs[position] = kvs[position], kvs[offset]
 | 
			
		||||
	}
 | 
			
		||||
	if filter != nil {
 | 
			
		||||
		return filterSet(kvs[position:], filter)
 | 
			
		||||
	}
 | 
			
		||||
	return Set{
 | 
			
		||||
		equivalent: computeDistinct(kvs[position:]),
 | 
			
		||||
	}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// filterSet reorders `kvs` so that included keys are contiguous at
 | 
			
		||||
// the end of the slice, while excluded keys precede the included keys.
 | 
			
		||||
func filterSet(kvs []KeyValue, filter Filter) (Set, []KeyValue) {
 | 
			
		||||
	var excluded []KeyValue
 | 
			
		||||
 | 
			
		||||
	// Move labels that do not match the filter so
 | 
			
		||||
	// they're adjacent before calling computeDistinct().
 | 
			
		||||
	distinctPosition := len(kvs)
 | 
			
		||||
 | 
			
		||||
	// Swap indistinct keys forward and distinct keys toward the
 | 
			
		||||
	// end of the slice.
 | 
			
		||||
	offset := len(kvs) - 1
 | 
			
		||||
	for ; offset >= 0; offset-- {
 | 
			
		||||
		if filter(kvs[offset]) {
 | 
			
		||||
			distinctPosition--
 | 
			
		||||
			kvs[offset], kvs[distinctPosition] = kvs[distinctPosition], kvs[offset]
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	excluded = kvs[:distinctPosition]
 | 
			
		||||
 | 
			
		||||
	return Set{
 | 
			
		||||
		equivalent: computeDistinct(kvs[distinctPosition:]),
 | 
			
		||||
	}, excluded
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Filter returns a filtered copy of this `Set`.  See the
 | 
			
		||||
// documentation for `NewSetWithSortableFiltered` for more details.
 | 
			
		||||
func (l *Set) Filter(re Filter) (Set, []KeyValue) {
 | 
			
		||||
	if re == nil {
 | 
			
		||||
		return Set{
 | 
			
		||||
			equivalent: l.equivalent,
 | 
			
		||||
		}, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Note: This could be refactored to avoid the temporary slice
 | 
			
		||||
	// allocation, if it proves to be expensive.
 | 
			
		||||
	return filterSet(l.ToSlice(), re)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// computeDistinct returns a `Distinct` using either the fixed- or
 | 
			
		||||
// reflect-oriented code path, depending on the size of the input.
 | 
			
		||||
// The input slice is assumed to already be sorted and de-duplicated.
 | 
			
		||||
func computeDistinct(kvs []KeyValue) Distinct {
 | 
			
		||||
	iface := computeDistinctFixed(kvs)
 | 
			
		||||
	if iface == nil {
 | 
			
		||||
		iface = computeDistinctReflect(kvs)
 | 
			
		||||
	}
 | 
			
		||||
	return Distinct{
 | 
			
		||||
		iface: iface,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// computeDistinctFixed computes a `Distinct` for small slices.  It
 | 
			
		||||
// returns nil if the input is too large for this code path.
 | 
			
		||||
func computeDistinctFixed(kvs []KeyValue) interface{} {
 | 
			
		||||
	switch len(kvs) {
 | 
			
		||||
	case 1:
 | 
			
		||||
		ptr := new([1]KeyValue)
 | 
			
		||||
		copy((*ptr)[:], kvs)
 | 
			
		||||
		return *ptr
 | 
			
		||||
	case 2:
 | 
			
		||||
		ptr := new([2]KeyValue)
 | 
			
		||||
		copy((*ptr)[:], kvs)
 | 
			
		||||
		return *ptr
 | 
			
		||||
	case 3:
 | 
			
		||||
		ptr := new([3]KeyValue)
 | 
			
		||||
		copy((*ptr)[:], kvs)
 | 
			
		||||
		return *ptr
 | 
			
		||||
	case 4:
 | 
			
		||||
		ptr := new([4]KeyValue)
 | 
			
		||||
		copy((*ptr)[:], kvs)
 | 
			
		||||
		return *ptr
 | 
			
		||||
	case 5:
 | 
			
		||||
		ptr := new([5]KeyValue)
 | 
			
		||||
		copy((*ptr)[:], kvs)
 | 
			
		||||
		return *ptr
 | 
			
		||||
	case 6:
 | 
			
		||||
		ptr := new([6]KeyValue)
 | 
			
		||||
		copy((*ptr)[:], kvs)
 | 
			
		||||
		return *ptr
 | 
			
		||||
	case 7:
 | 
			
		||||
		ptr := new([7]KeyValue)
 | 
			
		||||
		copy((*ptr)[:], kvs)
 | 
			
		||||
		return *ptr
 | 
			
		||||
	case 8:
 | 
			
		||||
		ptr := new([8]KeyValue)
 | 
			
		||||
		copy((*ptr)[:], kvs)
 | 
			
		||||
		return *ptr
 | 
			
		||||
	case 9:
 | 
			
		||||
		ptr := new([9]KeyValue)
 | 
			
		||||
		copy((*ptr)[:], kvs)
 | 
			
		||||
		return *ptr
 | 
			
		||||
	case 10:
 | 
			
		||||
		ptr := new([10]KeyValue)
 | 
			
		||||
		copy((*ptr)[:], kvs)
 | 
			
		||||
		return *ptr
 | 
			
		||||
	default:
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// computeDistinctReflect computes a `Distinct` using reflection,
 | 
			
		||||
// works for any size input.
 | 
			
		||||
func computeDistinctReflect(kvs []KeyValue) interface{} {
 | 
			
		||||
	at := reflect.New(reflect.ArrayOf(len(kvs), keyValueType)).Elem()
 | 
			
		||||
	for i, keyValue := range kvs {
 | 
			
		||||
		*(at.Index(i).Addr().Interface().(*KeyValue)) = keyValue
 | 
			
		||||
	}
 | 
			
		||||
	return at.Interface()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MarshalJSON returns the JSON encoding of the `*Set`.
 | 
			
		||||
func (l *Set) MarshalJSON() ([]byte, error) {
 | 
			
		||||
	return json.Marshal(l.equivalent.iface)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Len implements `sort.Interface`.
 | 
			
		||||
func (l *Sortable) Len() int {
 | 
			
		||||
	return len(*l)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Swap implements `sort.Interface`.
 | 
			
		||||
func (l *Sortable) Swap(i, j int) {
 | 
			
		||||
	(*l)[i], (*l)[j] = (*l)[j], (*l)[i]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Less implements `sort.Interface`.
 | 
			
		||||
func (l *Sortable) Less(i, j int) bool {
 | 
			
		||||
	return (*l)[i].Key < (*l)[j].Key
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										31
									
								
								vendor/go.opentelemetry.io/otel/attribute/type_string.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								vendor/go.opentelemetry.io/otel/attribute/type_string.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
			
		||||
// Code generated by "stringer -type=Type"; DO NOT EDIT.
 | 
			
		||||
 | 
			
		||||
package attribute
 | 
			
		||||
 | 
			
		||||
import "strconv"
 | 
			
		||||
 | 
			
		||||
func _() {
 | 
			
		||||
	// An "invalid array index" compiler error signifies that the constant values have changed.
 | 
			
		||||
	// Re-run the stringer command to generate them again.
 | 
			
		||||
	var x [1]struct{}
 | 
			
		||||
	_ = x[INVALID-0]
 | 
			
		||||
	_ = x[BOOL-1]
 | 
			
		||||
	_ = x[INT64-2]
 | 
			
		||||
	_ = x[FLOAT64-3]
 | 
			
		||||
	_ = x[STRING-4]
 | 
			
		||||
	_ = x[BOOLSLICE-5]
 | 
			
		||||
	_ = x[INT64SLICE-6]
 | 
			
		||||
	_ = x[FLOAT64SLICE-7]
 | 
			
		||||
	_ = x[STRINGSLICE-8]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const _Type_name = "INVALIDBOOLINT64FLOAT64STRINGBOOLSLICEINT64SLICEFLOAT64SLICESTRINGSLICE"
 | 
			
		||||
 | 
			
		||||
var _Type_index = [...]uint8{0, 7, 11, 16, 23, 29, 38, 48, 60, 71}
 | 
			
		||||
 | 
			
		||||
func (i Type) String() string {
 | 
			
		||||
	if i < 0 || i >= Type(len(_Type_index)-1) {
 | 
			
		||||
		return "Type(" + strconv.FormatInt(int64(i), 10) + ")"
 | 
			
		||||
	}
 | 
			
		||||
	return _Type_name[_Type_index[i]:_Type_index[i+1]]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										271
									
								
								vendor/go.opentelemetry.io/otel/attribute/value.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										271
									
								
								vendor/go.opentelemetry.io/otel/attribute/value.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,271 @@
 | 
			
		||||
// Copyright The OpenTelemetry Authors
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
//     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
package attribute // import "go.opentelemetry.io/otel/attribute"
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"strconv"
 | 
			
		||||
 | 
			
		||||
	"go.opentelemetry.io/otel/internal"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
//go:generate stringer -type=Type
 | 
			
		||||
 | 
			
		||||
// Type describes the type of the data Value holds.
 | 
			
		||||
type Type int
 | 
			
		||||
 | 
			
		||||
// Value represents the value part in key-value pairs.
 | 
			
		||||
type Value struct {
 | 
			
		||||
	vtype    Type
 | 
			
		||||
	numeric  uint64
 | 
			
		||||
	stringly string
 | 
			
		||||
	slice    interface{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	// INVALID is used for a Value with no value set.
 | 
			
		||||
	INVALID Type = iota
 | 
			
		||||
	// BOOL is a boolean Type Value.
 | 
			
		||||
	BOOL
 | 
			
		||||
	// INT64 is a 64-bit signed integral Type Value.
 | 
			
		||||
	INT64
 | 
			
		||||
	// FLOAT64 is a 64-bit floating point Type Value.
 | 
			
		||||
	FLOAT64
 | 
			
		||||
	// STRING is a string Type Value.
 | 
			
		||||
	STRING
 | 
			
		||||
	// BOOLSLICE is a slice of booleans Type Value.
 | 
			
		||||
	BOOLSLICE
 | 
			
		||||
	// INT64SLICE is a slice of 64-bit signed integral numbers Type Value.
 | 
			
		||||
	INT64SLICE
 | 
			
		||||
	// FLOAT64SLICE is a slice of 64-bit floating point numbers Type Value.
 | 
			
		||||
	FLOAT64SLICE
 | 
			
		||||
	// STRINGSLICE is a slice of strings Type Value.
 | 
			
		||||
	STRINGSLICE
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// BoolValue creates a BOOL Value.
 | 
			
		||||
func BoolValue(v bool) Value {
 | 
			
		||||
	return Value{
 | 
			
		||||
		vtype:   BOOL,
 | 
			
		||||
		numeric: internal.BoolToRaw(v),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// BoolSliceValue creates a BOOLSLICE Value.
 | 
			
		||||
func BoolSliceValue(v []bool) Value {
 | 
			
		||||
	cp := make([]bool, len(v))
 | 
			
		||||
	copy(cp, v)
 | 
			
		||||
	return Value{
 | 
			
		||||
		vtype: BOOLSLICE,
 | 
			
		||||
		slice: &cp,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IntValue creates an INT64 Value.
 | 
			
		||||
func IntValue(v int) Value {
 | 
			
		||||
	return Int64Value(int64(v))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IntSliceValue creates an INTSLICE Value.
 | 
			
		||||
func IntSliceValue(v []int) Value {
 | 
			
		||||
	cp := make([]int64, 0, len(v))
 | 
			
		||||
	for _, i := range v {
 | 
			
		||||
		cp = append(cp, int64(i))
 | 
			
		||||
	}
 | 
			
		||||
	return Value{
 | 
			
		||||
		vtype: INT64SLICE,
 | 
			
		||||
		slice: &cp,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Int64Value creates an INT64 Value.
 | 
			
		||||
func Int64Value(v int64) Value {
 | 
			
		||||
	return Value{
 | 
			
		||||
		vtype:   INT64,
 | 
			
		||||
		numeric: internal.Int64ToRaw(v),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Int64SliceValue creates an INT64SLICE Value.
 | 
			
		||||
func Int64SliceValue(v []int64) Value {
 | 
			
		||||
	cp := make([]int64, len(v))
 | 
			
		||||
	copy(cp, v)
 | 
			
		||||
	return Value{
 | 
			
		||||
		vtype: INT64SLICE,
 | 
			
		||||
		slice: &cp,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Float64Value creates a FLOAT64 Value.
 | 
			
		||||
func Float64Value(v float64) Value {
 | 
			
		||||
	return Value{
 | 
			
		||||
		vtype:   FLOAT64,
 | 
			
		||||
		numeric: internal.Float64ToRaw(v),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Float64SliceValue creates a FLOAT64SLICE Value.
 | 
			
		||||
func Float64SliceValue(v []float64) Value {
 | 
			
		||||
	cp := make([]float64, len(v))
 | 
			
		||||
	copy(cp, v)
 | 
			
		||||
	return Value{
 | 
			
		||||
		vtype: FLOAT64SLICE,
 | 
			
		||||
		slice: &cp,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// StringValue creates a STRING Value.
 | 
			
		||||
func StringValue(v string) Value {
 | 
			
		||||
	return Value{
 | 
			
		||||
		vtype:    STRING,
 | 
			
		||||
		stringly: v,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// StringSliceValue creates a STRINGSLICE Value.
 | 
			
		||||
func StringSliceValue(v []string) Value {
 | 
			
		||||
	cp := make([]string, len(v))
 | 
			
		||||
	copy(cp, v)
 | 
			
		||||
	return Value{
 | 
			
		||||
		vtype: STRINGSLICE,
 | 
			
		||||
		slice: &cp,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Type returns a type of the Value.
 | 
			
		||||
func (v Value) Type() Type {
 | 
			
		||||
	return v.vtype
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AsBool returns the bool value. Make sure that the Value's type is
 | 
			
		||||
// BOOL.
 | 
			
		||||
func (v Value) AsBool() bool {
 | 
			
		||||
	return internal.RawToBool(v.numeric)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AsBoolSlice returns the []bool value. Make sure that the Value's type is
 | 
			
		||||
// BOOLSLICE.
 | 
			
		||||
func (v Value) AsBoolSlice() []bool {
 | 
			
		||||
	if s, ok := v.slice.(*[]bool); ok {
 | 
			
		||||
		return *s
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AsInt64 returns the int64 value. Make sure that the Value's type is
 | 
			
		||||
// INT64.
 | 
			
		||||
func (v Value) AsInt64() int64 {
 | 
			
		||||
	return internal.RawToInt64(v.numeric)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AsInt64Slice returns the []int64 value. Make sure that the Value's type is
 | 
			
		||||
// INT64SLICE.
 | 
			
		||||
func (v Value) AsInt64Slice() []int64 {
 | 
			
		||||
	if s, ok := v.slice.(*[]int64); ok {
 | 
			
		||||
		return *s
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AsFloat64 returns the float64 value. Make sure that the Value's
 | 
			
		||||
// type is FLOAT64.
 | 
			
		||||
func (v Value) AsFloat64() float64 {
 | 
			
		||||
	return internal.RawToFloat64(v.numeric)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AsFloat64Slice returns the []float64 value. Make sure that the Value's type is
 | 
			
		||||
// INT64SLICE.
 | 
			
		||||
func (v Value) AsFloat64Slice() []float64 {
 | 
			
		||||
	if s, ok := v.slice.(*[]float64); ok {
 | 
			
		||||
		return *s
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AsString returns the string value. Make sure that the Value's type
 | 
			
		||||
// is STRING.
 | 
			
		||||
func (v Value) AsString() string {
 | 
			
		||||
	return v.stringly
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AsStringSlice returns the []string value. Make sure that the Value's type is
 | 
			
		||||
// INT64SLICE.
 | 
			
		||||
func (v Value) AsStringSlice() []string {
 | 
			
		||||
	if s, ok := v.slice.(*[]string); ok {
 | 
			
		||||
		return *s
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type unknownValueType struct{}
 | 
			
		||||
 | 
			
		||||
// AsInterface returns Value's data as interface{}.
 | 
			
		||||
func (v Value) AsInterface() interface{} {
 | 
			
		||||
	switch v.Type() {
 | 
			
		||||
	case BOOL:
 | 
			
		||||
		return v.AsBool()
 | 
			
		||||
	case BOOLSLICE:
 | 
			
		||||
		return v.AsBoolSlice()
 | 
			
		||||
	case INT64:
 | 
			
		||||
		return v.AsInt64()
 | 
			
		||||
	case INT64SLICE:
 | 
			
		||||
		return v.AsInt64Slice()
 | 
			
		||||
	case FLOAT64:
 | 
			
		||||
		return v.AsFloat64()
 | 
			
		||||
	case FLOAT64SLICE:
 | 
			
		||||
		return v.AsFloat64Slice()
 | 
			
		||||
	case STRING:
 | 
			
		||||
		return v.stringly
 | 
			
		||||
	case STRINGSLICE:
 | 
			
		||||
		return v.AsStringSlice()
 | 
			
		||||
	}
 | 
			
		||||
	return unknownValueType{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Emit returns a string representation of Value's data.
 | 
			
		||||
func (v Value) Emit() string {
 | 
			
		||||
	switch v.Type() {
 | 
			
		||||
	case BOOLSLICE:
 | 
			
		||||
		return fmt.Sprint(*(v.slice.(*[]bool)))
 | 
			
		||||
	case BOOL:
 | 
			
		||||
		return strconv.FormatBool(v.AsBool())
 | 
			
		||||
	case INT64SLICE:
 | 
			
		||||
		return fmt.Sprint(*(v.slice.(*[]int64)))
 | 
			
		||||
	case INT64:
 | 
			
		||||
		return strconv.FormatInt(v.AsInt64(), 10)
 | 
			
		||||
	case FLOAT64SLICE:
 | 
			
		||||
		return fmt.Sprint(*(v.slice.(*[]float64)))
 | 
			
		||||
	case FLOAT64:
 | 
			
		||||
		return fmt.Sprint(v.AsFloat64())
 | 
			
		||||
	case STRINGSLICE:
 | 
			
		||||
		return fmt.Sprint(*(v.slice.(*[]string)))
 | 
			
		||||
	case STRING:
 | 
			
		||||
		return v.stringly
 | 
			
		||||
	default:
 | 
			
		||||
		return "unknown"
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MarshalJSON returns the JSON encoding of the Value.
 | 
			
		||||
func (v Value) MarshalJSON() ([]byte, error) {
 | 
			
		||||
	var jsonVal struct {
 | 
			
		||||
		Type  string
 | 
			
		||||
		Value interface{}
 | 
			
		||||
	}
 | 
			
		||||
	jsonVal.Type = v.Type().String()
 | 
			
		||||
	jsonVal.Value = v.AsInterface()
 | 
			
		||||
	return json.Marshal(jsonVal)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										106
									
								
								vendor/go.opentelemetry.io/otel/codes/codes.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								vendor/go.opentelemetry.io/otel/codes/codes.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,106 @@
 | 
			
		||||
// Copyright The OpenTelemetry Authors
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
//     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
package codes // import "go.opentelemetry.io/otel/codes"
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"strconv"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	// Unset is the default status code.
 | 
			
		||||
	Unset Code = 0
 | 
			
		||||
	// Error indicates the operation contains an error.
 | 
			
		||||
	Error Code = 1
 | 
			
		||||
	// Ok indicates operation has been validated by an Application developers
 | 
			
		||||
	// or Operator to have completed successfully, or contain no error.
 | 
			
		||||
	Ok Code = 2
 | 
			
		||||
 | 
			
		||||
	maxCode = 3
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Code is an 32-bit representation of a status state.
 | 
			
		||||
type Code uint32
 | 
			
		||||
 | 
			
		||||
var codeToStr = map[Code]string{
 | 
			
		||||
	Unset: "Unset",
 | 
			
		||||
	Error: "Error",
 | 
			
		||||
	Ok:    "Ok",
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var strToCode = map[string]Code{
 | 
			
		||||
	`"Unset"`: Unset,
 | 
			
		||||
	`"Error"`: Error,
 | 
			
		||||
	`"Ok"`:    Ok,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// String returns the Code as a string.
 | 
			
		||||
func (c Code) String() string {
 | 
			
		||||
	return codeToStr[c]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnmarshalJSON unmarshals b into the Code.
 | 
			
		||||
//
 | 
			
		||||
// This is based on the functionality in the gRPC codes package:
 | 
			
		||||
// https://github.com/grpc/grpc-go/blob/bb64fee312b46ebee26be43364a7a966033521b1/codes/codes.go#L218-L244
 | 
			
		||||
func (c *Code) UnmarshalJSON(b []byte) error {
 | 
			
		||||
	// From json.Unmarshaler: By convention, to approximate the behavior of
 | 
			
		||||
	// Unmarshal itself, Unmarshalers implement UnmarshalJSON([]byte("null")) as
 | 
			
		||||
	// a no-op.
 | 
			
		||||
	if string(b) == "null" {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	if c == nil {
 | 
			
		||||
		return fmt.Errorf("nil receiver passed to UnmarshalJSON")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var x interface{}
 | 
			
		||||
	if err := json.Unmarshal(b, &x); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	switch x.(type) {
 | 
			
		||||
	case string:
 | 
			
		||||
		if jc, ok := strToCode[string(b)]; ok {
 | 
			
		||||
			*c = jc
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
		return fmt.Errorf("invalid code: %q", string(b))
 | 
			
		||||
	case float64:
 | 
			
		||||
		if ci, err := strconv.ParseUint(string(b), 10, 32); err == nil {
 | 
			
		||||
			if ci >= maxCode {
 | 
			
		||||
				return fmt.Errorf("invalid code: %q", ci)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			*c = Code(ci)
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
		return fmt.Errorf("invalid code: %q", string(b))
 | 
			
		||||
	default:
 | 
			
		||||
		return fmt.Errorf("invalid code: %q", string(b))
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MarshalJSON returns c as the JSON encoding of c.
 | 
			
		||||
func (c *Code) MarshalJSON() ([]byte, error) {
 | 
			
		||||
	if c == nil {
 | 
			
		||||
		return []byte("null"), nil
 | 
			
		||||
	}
 | 
			
		||||
	str, ok := codeToStr[*c]
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return nil, fmt.Errorf("invalid code: %d", *c)
 | 
			
		||||
	}
 | 
			
		||||
	return []byte(fmt.Sprintf("%q", str)), nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										21
									
								
								vendor/go.opentelemetry.io/otel/codes/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								vendor/go.opentelemetry.io/otel/codes/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
			
		||||
// Copyright The OpenTelemetry Authors
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
//     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Package codes defines the canonical error codes used by OpenTelemetry.
 | 
			
		||||
 | 
			
		||||
It conforms to [the OpenTelemetry
 | 
			
		||||
specification](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/api.md#statuscanonicalcode).
 | 
			
		||||
*/
 | 
			
		||||
package codes // import "go.opentelemetry.io/otel/codes"
 | 
			
		||||
							
								
								
									
										55
									
								
								vendor/go.opentelemetry.io/otel/internal/rawhelpers.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								vendor/go.opentelemetry.io/otel/internal/rawhelpers.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,55 @@
 | 
			
		||||
// Copyright The OpenTelemetry Authors
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
//     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
package internal
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"math"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func BoolToRaw(b bool) uint64 {
 | 
			
		||||
	if b {
 | 
			
		||||
		return 1
 | 
			
		||||
	}
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RawToBool(r uint64) bool {
 | 
			
		||||
	return r != 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Int64ToRaw(i int64) uint64 {
 | 
			
		||||
	return uint64(i)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RawToInt64(r uint64) int64 {
 | 
			
		||||
	return int64(r)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Float64ToRaw(f float64) uint64 {
 | 
			
		||||
	return math.Float64bits(f)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RawToFloat64(r uint64) float64 {
 | 
			
		||||
	return math.Float64frombits(r)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RawPtrToFloat64Ptr(r *uint64) *float64 {
 | 
			
		||||
	return (*float64)(unsafe.Pointer(r))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RawPtrToInt64Ptr(r *uint64) *int64 {
 | 
			
		||||
	return (*int64)(unsafe.Pointer(r))
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										201
									
								
								vendor/go.opentelemetry.io/otel/trace/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										201
									
								
								vendor/go.opentelemetry.io/otel/trace/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.
 | 
			
		||||
							
								
								
									
										297
									
								
								vendor/go.opentelemetry.io/otel/trace/config.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										297
									
								
								vendor/go.opentelemetry.io/otel/trace/config.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,297 @@
 | 
			
		||||
// Copyright The OpenTelemetry Authors
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
//     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
package trace // import "go.opentelemetry.io/otel/trace"
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"go.opentelemetry.io/otel/attribute"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// TracerConfig is a group of options for a Tracer.
 | 
			
		||||
type TracerConfig struct {
 | 
			
		||||
	instrumentationVersion string
 | 
			
		||||
	// Schema URL of the telemetry emitted by the Tracer.
 | 
			
		||||
	schemaURL string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// InstrumentationVersion returns the version of the library providing instrumentation.
 | 
			
		||||
func (t *TracerConfig) InstrumentationVersion() string {
 | 
			
		||||
	return t.instrumentationVersion
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SchemaURL returns the Schema URL of the telemetry emitted by the Tracer.
 | 
			
		||||
func (t *TracerConfig) SchemaURL() string {
 | 
			
		||||
	return t.schemaURL
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewTracerConfig applies all the options to a returned TracerConfig.
 | 
			
		||||
func NewTracerConfig(options ...TracerOption) TracerConfig {
 | 
			
		||||
	var config TracerConfig
 | 
			
		||||
	for _, option := range options {
 | 
			
		||||
		option.apply(&config)
 | 
			
		||||
	}
 | 
			
		||||
	return config
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TracerOption applies an option to a TracerConfig.
 | 
			
		||||
type TracerOption interface {
 | 
			
		||||
	apply(*TracerConfig)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type tracerOptionFunc func(*TracerConfig)
 | 
			
		||||
 | 
			
		||||
func (fn tracerOptionFunc) apply(cfg *TracerConfig) {
 | 
			
		||||
	fn(cfg)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SpanConfig is a group of options for a Span.
 | 
			
		||||
type SpanConfig struct {
 | 
			
		||||
	attributes []attribute.KeyValue
 | 
			
		||||
	timestamp  time.Time
 | 
			
		||||
	links      []Link
 | 
			
		||||
	newRoot    bool
 | 
			
		||||
	spanKind   SpanKind
 | 
			
		||||
	stackTrace bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Attributes describe the associated qualities of a Span.
 | 
			
		||||
func (cfg *SpanConfig) Attributes() []attribute.KeyValue {
 | 
			
		||||
	return cfg.attributes
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Timestamp is a time in a Span life-cycle.
 | 
			
		||||
func (cfg *SpanConfig) Timestamp() time.Time {
 | 
			
		||||
	return cfg.timestamp
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// StackTrace checks whether stack trace capturing is enabled.
 | 
			
		||||
func (cfg *SpanConfig) StackTrace() bool {
 | 
			
		||||
	return cfg.stackTrace
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Links are the associations a Span has with other Spans.
 | 
			
		||||
func (cfg *SpanConfig) Links() []Link {
 | 
			
		||||
	return cfg.links
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewRoot identifies a Span as the root Span for a new trace. This is
 | 
			
		||||
// commonly used when an existing trace crosses trust boundaries and the
 | 
			
		||||
// remote parent span context should be ignored for security.
 | 
			
		||||
func (cfg *SpanConfig) NewRoot() bool {
 | 
			
		||||
	return cfg.newRoot
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SpanKind is the role a Span has in a trace.
 | 
			
		||||
func (cfg *SpanConfig) SpanKind() SpanKind {
 | 
			
		||||
	return cfg.spanKind
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewSpanStartConfig applies all the options to a returned SpanConfig.
 | 
			
		||||
// No validation is performed on the returned SpanConfig (e.g. no uniqueness
 | 
			
		||||
// checking or bounding of data), it is left to the SDK to perform this
 | 
			
		||||
// action.
 | 
			
		||||
func NewSpanStartConfig(options ...SpanStartOption) SpanConfig {
 | 
			
		||||
	var c SpanConfig
 | 
			
		||||
	for _, option := range options {
 | 
			
		||||
		option.applySpanStart(&c)
 | 
			
		||||
	}
 | 
			
		||||
	return c
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewSpanEndConfig applies all the options to a returned SpanConfig.
 | 
			
		||||
// No validation is performed on the returned SpanConfig (e.g. no uniqueness
 | 
			
		||||
// checking or bounding of data), it is left to the SDK to perform this
 | 
			
		||||
// action.
 | 
			
		||||
func NewSpanEndConfig(options ...SpanEndOption) SpanConfig {
 | 
			
		||||
	var c SpanConfig
 | 
			
		||||
	for _, option := range options {
 | 
			
		||||
		option.applySpanEnd(&c)
 | 
			
		||||
	}
 | 
			
		||||
	return c
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SpanStartOption applies an option to a SpanConfig. These options are applicable
 | 
			
		||||
// only when the span is created
 | 
			
		||||
type SpanStartOption interface {
 | 
			
		||||
	applySpanStart(*SpanConfig)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type spanOptionFunc func(*SpanConfig)
 | 
			
		||||
 | 
			
		||||
func (fn spanOptionFunc) applySpanStart(cfg *SpanConfig) {
 | 
			
		||||
	fn(cfg)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SpanEndOption applies an option to a SpanConfig. These options are
 | 
			
		||||
// applicable only when the span is ended.
 | 
			
		||||
type SpanEndOption interface {
 | 
			
		||||
	applySpanEnd(*SpanConfig)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EventConfig is a group of options for an Event.
 | 
			
		||||
type EventConfig struct {
 | 
			
		||||
	attributes []attribute.KeyValue
 | 
			
		||||
	timestamp  time.Time
 | 
			
		||||
	stackTrace bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Attributes describe the associated qualities of an Event.
 | 
			
		||||
func (cfg *EventConfig) Attributes() []attribute.KeyValue {
 | 
			
		||||
	return cfg.attributes
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Timestamp is a time in an Event life-cycle.
 | 
			
		||||
func (cfg *EventConfig) Timestamp() time.Time {
 | 
			
		||||
	return cfg.timestamp
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// StackTrace checks whether stack trace capturing is enabled.
 | 
			
		||||
func (cfg *EventConfig) StackTrace() bool {
 | 
			
		||||
	return cfg.stackTrace
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewEventConfig applies all the EventOptions to a returned EventConfig. If no
 | 
			
		||||
// timestamp option is passed, the returned EventConfig will have a Timestamp
 | 
			
		||||
// set to the call time, otherwise no validation is performed on the returned
 | 
			
		||||
// EventConfig.
 | 
			
		||||
func NewEventConfig(options ...EventOption) EventConfig {
 | 
			
		||||
	var c EventConfig
 | 
			
		||||
	for _, option := range options {
 | 
			
		||||
		option.applyEvent(&c)
 | 
			
		||||
	}
 | 
			
		||||
	if c.timestamp.IsZero() {
 | 
			
		||||
		c.timestamp = time.Now()
 | 
			
		||||
	}
 | 
			
		||||
	return c
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EventOption applies span event options to an EventConfig.
 | 
			
		||||
type EventOption interface {
 | 
			
		||||
	applyEvent(*EventConfig)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SpanOption are options that can be used at both the beginning and end of a span.
 | 
			
		||||
type SpanOption interface {
 | 
			
		||||
	SpanStartOption
 | 
			
		||||
	SpanEndOption
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SpanStartEventOption are options that can be used at the start of a span, or with an event.
 | 
			
		||||
type SpanStartEventOption interface {
 | 
			
		||||
	SpanStartOption
 | 
			
		||||
	EventOption
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SpanEndEventOption are options that can be used at the end of a span, or with an event.
 | 
			
		||||
type SpanEndEventOption interface {
 | 
			
		||||
	SpanEndOption
 | 
			
		||||
	EventOption
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type attributeOption []attribute.KeyValue
 | 
			
		||||
 | 
			
		||||
func (o attributeOption) applySpan(c *SpanConfig) {
 | 
			
		||||
	c.attributes = append(c.attributes, []attribute.KeyValue(o)...)
 | 
			
		||||
}
 | 
			
		||||
func (o attributeOption) applySpanStart(c *SpanConfig) { o.applySpan(c) }
 | 
			
		||||
func (o attributeOption) applyEvent(c *EventConfig) {
 | 
			
		||||
	c.attributes = append(c.attributes, []attribute.KeyValue(o)...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var _ SpanStartEventOption = attributeOption{}
 | 
			
		||||
 | 
			
		||||
// WithAttributes adds the attributes related to a span life-cycle event.
 | 
			
		||||
// These attributes are used to describe the work a Span represents when this
 | 
			
		||||
// option is provided to a Span's start or end events. Otherwise, these
 | 
			
		||||
// attributes provide additional information about the event being recorded
 | 
			
		||||
// (e.g. error, state change, processing progress, system event).
 | 
			
		||||
//
 | 
			
		||||
// If multiple of these options are passed the attributes of each successive
 | 
			
		||||
// option will extend the attributes instead of overwriting. There is no
 | 
			
		||||
// guarantee of uniqueness in the resulting attributes.
 | 
			
		||||
func WithAttributes(attributes ...attribute.KeyValue) SpanStartEventOption {
 | 
			
		||||
	return attributeOption(attributes)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SpanEventOption are options that can be used with an event or a span.
 | 
			
		||||
type SpanEventOption interface {
 | 
			
		||||
	SpanOption
 | 
			
		||||
	EventOption
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type timestampOption time.Time
 | 
			
		||||
 | 
			
		||||
func (o timestampOption) applySpan(c *SpanConfig)      { c.timestamp = time.Time(o) }
 | 
			
		||||
func (o timestampOption) applySpanStart(c *SpanConfig) { o.applySpan(c) }
 | 
			
		||||
func (o timestampOption) applySpanEnd(c *SpanConfig)   { o.applySpan(c) }
 | 
			
		||||
func (o timestampOption) applyEvent(c *EventConfig)    { c.timestamp = time.Time(o) }
 | 
			
		||||
 | 
			
		||||
var _ SpanEventOption = timestampOption{}
 | 
			
		||||
 | 
			
		||||
// WithTimestamp sets the time of a Span or Event life-cycle moment (e.g.
 | 
			
		||||
// started, stopped, errored).
 | 
			
		||||
func WithTimestamp(t time.Time) SpanEventOption {
 | 
			
		||||
	return timestampOption(t)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type stackTraceOption bool
 | 
			
		||||
 | 
			
		||||
func (o stackTraceOption) applyEvent(c *EventConfig)  { c.stackTrace = bool(o) }
 | 
			
		||||
func (o stackTraceOption) applySpan(c *SpanConfig)    { c.stackTrace = bool(o) }
 | 
			
		||||
func (o stackTraceOption) applySpanEnd(c *SpanConfig) { o.applySpan(c) }
 | 
			
		||||
 | 
			
		||||
// WithStackTrace sets the flag to capture the error with stack trace (e.g. true, false).
 | 
			
		||||
func WithStackTrace(b bool) SpanEndEventOption {
 | 
			
		||||
	return stackTraceOption(b)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WithLinks adds links to a Span. The links are added to the existing Span
 | 
			
		||||
// links, i.e. this does not overwrite.
 | 
			
		||||
func WithLinks(links ...Link) SpanStartOption {
 | 
			
		||||
	return spanOptionFunc(func(cfg *SpanConfig) {
 | 
			
		||||
		cfg.links = append(cfg.links, links...)
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WithNewRoot specifies that the Span should be treated as a root Span. Any
 | 
			
		||||
// existing parent span context will be ignored when defining the Span's trace
 | 
			
		||||
// identifiers.
 | 
			
		||||
func WithNewRoot() SpanStartOption {
 | 
			
		||||
	return spanOptionFunc(func(cfg *SpanConfig) {
 | 
			
		||||
		cfg.newRoot = true
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WithSpanKind sets the SpanKind of a Span.
 | 
			
		||||
func WithSpanKind(kind SpanKind) SpanStartOption {
 | 
			
		||||
	return spanOptionFunc(func(cfg *SpanConfig) {
 | 
			
		||||
		cfg.spanKind = kind
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WithInstrumentationVersion sets the instrumentation version.
 | 
			
		||||
func WithInstrumentationVersion(version string) TracerOption {
 | 
			
		||||
	return tracerOptionFunc(func(cfg *TracerConfig) {
 | 
			
		||||
		cfg.instrumentationVersion = version
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WithSchemaURL sets the schema URL for the Tracer.
 | 
			
		||||
func WithSchemaURL(schemaURL string) TracerOption {
 | 
			
		||||
	return tracerOptionFunc(func(cfg *TracerConfig) {
 | 
			
		||||
		cfg.schemaURL = schemaURL
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										61
									
								
								vendor/go.opentelemetry.io/otel/trace/context.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								vendor/go.opentelemetry.io/otel/trace/context.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,61 @@
 | 
			
		||||
// Copyright The OpenTelemetry Authors
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
//     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
package trace // import "go.opentelemetry.io/otel/trace"
 | 
			
		||||
 | 
			
		||||
import "context"
 | 
			
		||||
 | 
			
		||||
type traceContextKeyType int
 | 
			
		||||
 | 
			
		||||
const currentSpanKey traceContextKeyType = iota
 | 
			
		||||
 | 
			
		||||
// ContextWithSpan returns a copy of parent with span set as the current Span.
 | 
			
		||||
func ContextWithSpan(parent context.Context, span Span) context.Context {
 | 
			
		||||
	return context.WithValue(parent, currentSpanKey, span)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ContextWithSpanContext returns a copy of parent with sc as the current
 | 
			
		||||
// Span. The Span implementation that wraps sc is non-recording and performs
 | 
			
		||||
// no operations other than to return sc as the SpanContext from the
 | 
			
		||||
// SpanContext method.
 | 
			
		||||
func ContextWithSpanContext(parent context.Context, sc SpanContext) context.Context {
 | 
			
		||||
	return ContextWithSpan(parent, nonRecordingSpan{sc: sc})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ContextWithRemoteSpanContext returns a copy of parent with rsc set explicly
 | 
			
		||||
// as a remote SpanContext and as the current Span. The Span implementation
 | 
			
		||||
// that wraps rsc is non-recording and performs no operations other than to
 | 
			
		||||
// return rsc as the SpanContext from the SpanContext method.
 | 
			
		||||
func ContextWithRemoteSpanContext(parent context.Context, rsc SpanContext) context.Context {
 | 
			
		||||
	return ContextWithSpanContext(parent, rsc.WithRemote(true))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SpanFromContext returns the current Span from ctx.
 | 
			
		||||
//
 | 
			
		||||
// If no Span is currently set in ctx an implementation of a Span that
 | 
			
		||||
// performs no operations is returned.
 | 
			
		||||
func SpanFromContext(ctx context.Context) Span {
 | 
			
		||||
	if ctx == nil {
 | 
			
		||||
		return noopSpan{}
 | 
			
		||||
	}
 | 
			
		||||
	if span, ok := ctx.Value(currentSpanKey).(Span); ok {
 | 
			
		||||
		return span
 | 
			
		||||
	}
 | 
			
		||||
	return noopSpan{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SpanContextFromContext returns the current Span's SpanContext.
 | 
			
		||||
func SpanContextFromContext(ctx context.Context) SpanContext {
 | 
			
		||||
	return SpanFromContext(ctx).SpanContext()
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										66
									
								
								vendor/go.opentelemetry.io/otel/trace/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								vendor/go.opentelemetry.io/otel/trace/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,66 @@
 | 
			
		||||
// Copyright The OpenTelemetry Authors
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
//     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Package trace provides an implementation of the tracing part of the
 | 
			
		||||
OpenTelemetry API.
 | 
			
		||||
 | 
			
		||||
To participate in distributed traces a Span needs to be created for the
 | 
			
		||||
operation being performed as part of a traced workflow. It its simplest form:
 | 
			
		||||
 | 
			
		||||
	var tracer trace.Tracer
 | 
			
		||||
 | 
			
		||||
	func init() {
 | 
			
		||||
		tracer = otel.Tracer("instrumentation/package/name")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	func operation(ctx context.Context) {
 | 
			
		||||
		var span trace.Span
 | 
			
		||||
		ctx, span = tracer.Start(ctx, "operation")
 | 
			
		||||
		defer span.End()
 | 
			
		||||
		// ...
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
A Tracer is unique to the instrumentation and is used to create Spans.
 | 
			
		||||
Instrumentation should be designed to accept a TracerProvider from which it
 | 
			
		||||
can create its own unique Tracer. Alternatively, the registered global
 | 
			
		||||
TracerProvider from the go.opentelemetry.io/otel package can be used as
 | 
			
		||||
a default.
 | 
			
		||||
 | 
			
		||||
	const (
 | 
			
		||||
		name    = "instrumentation/package/name"
 | 
			
		||||
		version = "0.1.0"
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	type Instrumentation struct {
 | 
			
		||||
		tracer trace.Tracer
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	func NewInstrumentation(tp trace.TracerProvider) *Instrumentation {
 | 
			
		||||
		if tp == nil {
 | 
			
		||||
			tp = otel.TracerProvider()
 | 
			
		||||
		}
 | 
			
		||||
		return &Instrumentation{
 | 
			
		||||
			tracer: tp.Tracer(name, trace.WithInstrumentationVersion(version)),
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	func operation(ctx context.Context, inst *Instrumentation) {
 | 
			
		||||
		var span trace.Span
 | 
			
		||||
		ctx, span = inst.tracer.Start(ctx, "operation")
 | 
			
		||||
		defer span.End()
 | 
			
		||||
		// ...
 | 
			
		||||
	}
 | 
			
		||||
*/
 | 
			
		||||
package trace // import "go.opentelemetry.io/otel/trace"
 | 
			
		||||
							
								
								
									
										27
									
								
								vendor/go.opentelemetry.io/otel/trace/nonrecording.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								vendor/go.opentelemetry.io/otel/trace/nonrecording.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
			
		||||
// Copyright The OpenTelemetry Authors
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
//     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
package trace // import "go.opentelemetry.io/otel/trace"
 | 
			
		||||
 | 
			
		||||
// nonRecordingSpan is a minimal implementation of a Span that wraps a
 | 
			
		||||
// SpanContext. It performs no operations other than to return the wrapped
 | 
			
		||||
// SpanContext.
 | 
			
		||||
type nonRecordingSpan struct {
 | 
			
		||||
	noopSpan
 | 
			
		||||
 | 
			
		||||
	sc SpanContext
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SpanContext returns the wrapped SpanContext.
 | 
			
		||||
func (s nonRecordingSpan) SpanContext() SpanContext { return s.sc }
 | 
			
		||||
							
								
								
									
										89
									
								
								vendor/go.opentelemetry.io/otel/trace/noop.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								vendor/go.opentelemetry.io/otel/trace/noop.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,89 @@
 | 
			
		||||
// Copyright The OpenTelemetry Authors
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
//     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
package trace // import "go.opentelemetry.io/otel/trace"
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
 | 
			
		||||
	"go.opentelemetry.io/otel/attribute"
 | 
			
		||||
	"go.opentelemetry.io/otel/codes"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// NewNoopTracerProvider returns an implementation of TracerProvider that
 | 
			
		||||
// performs no operations. The Tracer and Spans created from the returned
 | 
			
		||||
// TracerProvider also perform no operations.
 | 
			
		||||
func NewNoopTracerProvider() TracerProvider {
 | 
			
		||||
	return noopTracerProvider{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type noopTracerProvider struct{}
 | 
			
		||||
 | 
			
		||||
var _ TracerProvider = noopTracerProvider{}
 | 
			
		||||
 | 
			
		||||
// Tracer returns noop implementation of Tracer.
 | 
			
		||||
func (p noopTracerProvider) Tracer(string, ...TracerOption) Tracer {
 | 
			
		||||
	return noopTracer{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// noopTracer is an implementation of Tracer that preforms no operations.
 | 
			
		||||
type noopTracer struct{}
 | 
			
		||||
 | 
			
		||||
var _ Tracer = noopTracer{}
 | 
			
		||||
 | 
			
		||||
// Start carries forward a non-recording Span, if one is present in the context, otherwise it
 | 
			
		||||
// creates a no-op Span.
 | 
			
		||||
func (t noopTracer) Start(ctx context.Context, name string, _ ...SpanStartOption) (context.Context, Span) {
 | 
			
		||||
	span := SpanFromContext(ctx)
 | 
			
		||||
	if _, ok := span.(nonRecordingSpan); !ok {
 | 
			
		||||
		// span is likely already a noopSpan, but let's be sure
 | 
			
		||||
		span = noopSpan{}
 | 
			
		||||
	}
 | 
			
		||||
	return ContextWithSpan(ctx, span), span
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// noopSpan is an implementation of Span that preforms no operations.
 | 
			
		||||
type noopSpan struct{}
 | 
			
		||||
 | 
			
		||||
var _ Span = noopSpan{}
 | 
			
		||||
 | 
			
		||||
// SpanContext returns an empty span context.
 | 
			
		||||
func (noopSpan) SpanContext() SpanContext { return SpanContext{} }
 | 
			
		||||
 | 
			
		||||
// IsRecording always returns false.
 | 
			
		||||
func (noopSpan) IsRecording() bool { return false }
 | 
			
		||||
 | 
			
		||||
// SetStatus does nothing.
 | 
			
		||||
func (noopSpan) SetStatus(codes.Code, string) {}
 | 
			
		||||
 | 
			
		||||
// SetError does nothing.
 | 
			
		||||
func (noopSpan) SetError(bool) {}
 | 
			
		||||
 | 
			
		||||
// SetAttributes does nothing.
 | 
			
		||||
func (noopSpan) SetAttributes(...attribute.KeyValue) {}
 | 
			
		||||
 | 
			
		||||
// End does nothing.
 | 
			
		||||
func (noopSpan) End(...SpanEndOption) {}
 | 
			
		||||
 | 
			
		||||
// RecordError does nothing.
 | 
			
		||||
func (noopSpan) RecordError(error, ...EventOption) {}
 | 
			
		||||
 | 
			
		||||
// AddEvent does nothing.
 | 
			
		||||
func (noopSpan) AddEvent(string, ...EventOption) {}
 | 
			
		||||
 | 
			
		||||
// SetName does nothing.
 | 
			
		||||
func (noopSpan) SetName(string) {}
 | 
			
		||||
 | 
			
		||||
// TracerProvider returns a no-op TracerProvider
 | 
			
		||||
func (noopSpan) TracerProvider() TracerProvider { return noopTracerProvider{} }
 | 
			
		||||
							
								
								
									
										519
									
								
								vendor/go.opentelemetry.io/otel/trace/trace.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										519
									
								
								vendor/go.opentelemetry.io/otel/trace/trace.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,519 @@
 | 
			
		||||
// Copyright The OpenTelemetry Authors
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
//     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
package trace // import "go.opentelemetry.io/otel/trace"
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"context"
 | 
			
		||||
	"encoding/hex"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
 | 
			
		||||
	"go.opentelemetry.io/otel/attribute"
 | 
			
		||||
	"go.opentelemetry.io/otel/codes"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	// FlagsSampled is a bitmask with the sampled bit set. A SpanContext
 | 
			
		||||
	// with the sampling bit set means the span is sampled.
 | 
			
		||||
	FlagsSampled = TraceFlags(0x01)
 | 
			
		||||
 | 
			
		||||
	errInvalidHexID errorConst = "trace-id and span-id can only contain [0-9a-f] characters, all lowercase"
 | 
			
		||||
 | 
			
		||||
	errInvalidTraceIDLength errorConst = "hex encoded trace-id must have length equals to 32"
 | 
			
		||||
	errNilTraceID           errorConst = "trace-id can't be all zero"
 | 
			
		||||
 | 
			
		||||
	errInvalidSpanIDLength errorConst = "hex encoded span-id must have length equals to 16"
 | 
			
		||||
	errNilSpanID           errorConst = "span-id can't be all zero"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type errorConst string
 | 
			
		||||
 | 
			
		||||
func (e errorConst) Error() string {
 | 
			
		||||
	return string(e)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TraceID is a unique identity of a trace.
 | 
			
		||||
// nolint:revive // revive complains about stutter of `trace.TraceID`.
 | 
			
		||||
type TraceID [16]byte
 | 
			
		||||
 | 
			
		||||
var nilTraceID TraceID
 | 
			
		||||
var _ json.Marshaler = nilTraceID
 | 
			
		||||
 | 
			
		||||
// IsValid checks whether the trace TraceID is valid. A valid trace ID does
 | 
			
		||||
// not consist of zeros only.
 | 
			
		||||
func (t TraceID) IsValid() bool {
 | 
			
		||||
	return !bytes.Equal(t[:], nilTraceID[:])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MarshalJSON implements a custom marshal function to encode TraceID
 | 
			
		||||
// as a hex string.
 | 
			
		||||
func (t TraceID) MarshalJSON() ([]byte, error) {
 | 
			
		||||
	return json.Marshal(t.String())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// String returns the hex string representation form of a TraceID
 | 
			
		||||
func (t TraceID) String() string {
 | 
			
		||||
	return hex.EncodeToString(t[:])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SpanID is a unique identity of a span in a trace.
 | 
			
		||||
type SpanID [8]byte
 | 
			
		||||
 | 
			
		||||
var nilSpanID SpanID
 | 
			
		||||
var _ json.Marshaler = nilSpanID
 | 
			
		||||
 | 
			
		||||
// IsValid checks whether the SpanID is valid. A valid SpanID does not consist
 | 
			
		||||
// of zeros only.
 | 
			
		||||
func (s SpanID) IsValid() bool {
 | 
			
		||||
	return !bytes.Equal(s[:], nilSpanID[:])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MarshalJSON implements a custom marshal function to encode SpanID
 | 
			
		||||
// as a hex string.
 | 
			
		||||
func (s SpanID) MarshalJSON() ([]byte, error) {
 | 
			
		||||
	return json.Marshal(s.String())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// String returns the hex string representation form of a SpanID
 | 
			
		||||
func (s SpanID) String() string {
 | 
			
		||||
	return hex.EncodeToString(s[:])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TraceIDFromHex returns a TraceID from a hex string if it is compliant with
 | 
			
		||||
// the W3C trace-context specification.  See more at
 | 
			
		||||
// https://www.w3.org/TR/trace-context/#trace-id
 | 
			
		||||
// nolint:revive // revive complains about stutter of `trace.TraceIDFromHex`.
 | 
			
		||||
func TraceIDFromHex(h string) (TraceID, error) {
 | 
			
		||||
	t := TraceID{}
 | 
			
		||||
	if len(h) != 32 {
 | 
			
		||||
		return t, errInvalidTraceIDLength
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := decodeHex(h, t[:]); err != nil {
 | 
			
		||||
		return t, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !t.IsValid() {
 | 
			
		||||
		return t, errNilTraceID
 | 
			
		||||
	}
 | 
			
		||||
	return t, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SpanIDFromHex returns a SpanID from a hex string if it is compliant
 | 
			
		||||
// with the w3c trace-context specification.
 | 
			
		||||
// See more at https://www.w3.org/TR/trace-context/#parent-id
 | 
			
		||||
func SpanIDFromHex(h string) (SpanID, error) {
 | 
			
		||||
	s := SpanID{}
 | 
			
		||||
	if len(h) != 16 {
 | 
			
		||||
		return s, errInvalidSpanIDLength
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := decodeHex(h, s[:]); err != nil {
 | 
			
		||||
		return s, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !s.IsValid() {
 | 
			
		||||
		return s, errNilSpanID
 | 
			
		||||
	}
 | 
			
		||||
	return s, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func decodeHex(h string, b []byte) error {
 | 
			
		||||
	for _, r := range h {
 | 
			
		||||
		switch {
 | 
			
		||||
		case 'a' <= r && r <= 'f':
 | 
			
		||||
			continue
 | 
			
		||||
		case '0' <= r && r <= '9':
 | 
			
		||||
			continue
 | 
			
		||||
		default:
 | 
			
		||||
			return errInvalidHexID
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	decoded, err := hex.DecodeString(h)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	copy(b, decoded)
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TraceFlags contains flags that can be set on a SpanContext
 | 
			
		||||
type TraceFlags byte //nolint:revive // revive complains about stutter of `trace.TraceFlags`.
 | 
			
		||||
 | 
			
		||||
// IsSampled returns if the sampling bit is set in the TraceFlags.
 | 
			
		||||
func (tf TraceFlags) IsSampled() bool {
 | 
			
		||||
	return tf&FlagsSampled == FlagsSampled
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WithSampled sets the sampling bit in a new copy of the TraceFlags.
 | 
			
		||||
func (tf TraceFlags) WithSampled(sampled bool) TraceFlags {
 | 
			
		||||
	if sampled {
 | 
			
		||||
		return tf | FlagsSampled
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return tf &^ FlagsSampled
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MarshalJSON implements a custom marshal function to encode TraceFlags
 | 
			
		||||
// as a hex string.
 | 
			
		||||
func (tf TraceFlags) MarshalJSON() ([]byte, error) {
 | 
			
		||||
	return json.Marshal(tf.String())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// String returns the hex string representation form of TraceFlags
 | 
			
		||||
func (tf TraceFlags) String() string {
 | 
			
		||||
	return hex.EncodeToString([]byte{byte(tf)}[:])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SpanContextConfig contains mutable fields usable for constructing
 | 
			
		||||
// an immutable SpanContext.
 | 
			
		||||
type SpanContextConfig struct {
 | 
			
		||||
	TraceID    TraceID
 | 
			
		||||
	SpanID     SpanID
 | 
			
		||||
	TraceFlags TraceFlags
 | 
			
		||||
	TraceState TraceState
 | 
			
		||||
	Remote     bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewSpanContext constructs a SpanContext using values from the provided
 | 
			
		||||
// SpanContextConfig.
 | 
			
		||||
func NewSpanContext(config SpanContextConfig) SpanContext {
 | 
			
		||||
	return SpanContext{
 | 
			
		||||
		traceID:    config.TraceID,
 | 
			
		||||
		spanID:     config.SpanID,
 | 
			
		||||
		traceFlags: config.TraceFlags,
 | 
			
		||||
		traceState: config.TraceState,
 | 
			
		||||
		remote:     config.Remote,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SpanContext contains identifying trace information about a Span.
 | 
			
		||||
type SpanContext struct {
 | 
			
		||||
	traceID    TraceID
 | 
			
		||||
	spanID     SpanID
 | 
			
		||||
	traceFlags TraceFlags
 | 
			
		||||
	traceState TraceState
 | 
			
		||||
	remote     bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var _ json.Marshaler = SpanContext{}
 | 
			
		||||
 | 
			
		||||
// IsValid returns if the SpanContext is valid. A valid span context has a
 | 
			
		||||
// valid TraceID and SpanID.
 | 
			
		||||
func (sc SpanContext) IsValid() bool {
 | 
			
		||||
	return sc.HasTraceID() && sc.HasSpanID()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsRemote indicates whether the SpanContext represents a remotely-created Span.
 | 
			
		||||
func (sc SpanContext) IsRemote() bool {
 | 
			
		||||
	return sc.remote
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WithRemote returns a copy of sc with the Remote property set to remote.
 | 
			
		||||
func (sc SpanContext) WithRemote(remote bool) SpanContext {
 | 
			
		||||
	return SpanContext{
 | 
			
		||||
		traceID:    sc.traceID,
 | 
			
		||||
		spanID:     sc.spanID,
 | 
			
		||||
		traceFlags: sc.traceFlags,
 | 
			
		||||
		traceState: sc.traceState,
 | 
			
		||||
		remote:     remote,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TraceID returns the TraceID from the SpanContext.
 | 
			
		||||
func (sc SpanContext) TraceID() TraceID {
 | 
			
		||||
	return sc.traceID
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HasTraceID checks if the SpanContext has a valid TraceID.
 | 
			
		||||
func (sc SpanContext) HasTraceID() bool {
 | 
			
		||||
	return sc.traceID.IsValid()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WithTraceID returns a new SpanContext with the TraceID replaced.
 | 
			
		||||
func (sc SpanContext) WithTraceID(traceID TraceID) SpanContext {
 | 
			
		||||
	return SpanContext{
 | 
			
		||||
		traceID:    traceID,
 | 
			
		||||
		spanID:     sc.spanID,
 | 
			
		||||
		traceFlags: sc.traceFlags,
 | 
			
		||||
		traceState: sc.traceState,
 | 
			
		||||
		remote:     sc.remote,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SpanID returns the SpanID from the SpanContext.
 | 
			
		||||
func (sc SpanContext) SpanID() SpanID {
 | 
			
		||||
	return sc.spanID
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HasSpanID checks if the SpanContext has a valid SpanID.
 | 
			
		||||
func (sc SpanContext) HasSpanID() bool {
 | 
			
		||||
	return sc.spanID.IsValid()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WithSpanID returns a new SpanContext with the SpanID replaced.
 | 
			
		||||
func (sc SpanContext) WithSpanID(spanID SpanID) SpanContext {
 | 
			
		||||
	return SpanContext{
 | 
			
		||||
		traceID:    sc.traceID,
 | 
			
		||||
		spanID:     spanID,
 | 
			
		||||
		traceFlags: sc.traceFlags,
 | 
			
		||||
		traceState: sc.traceState,
 | 
			
		||||
		remote:     sc.remote,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TraceFlags returns the flags from the SpanContext.
 | 
			
		||||
func (sc SpanContext) TraceFlags() TraceFlags {
 | 
			
		||||
	return sc.traceFlags
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsSampled returns if the sampling bit is set in the SpanContext's TraceFlags.
 | 
			
		||||
func (sc SpanContext) IsSampled() bool {
 | 
			
		||||
	return sc.traceFlags.IsSampled()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WithTraceFlags returns a new SpanContext with the TraceFlags replaced.
 | 
			
		||||
func (sc SpanContext) WithTraceFlags(flags TraceFlags) SpanContext {
 | 
			
		||||
	return SpanContext{
 | 
			
		||||
		traceID:    sc.traceID,
 | 
			
		||||
		spanID:     sc.spanID,
 | 
			
		||||
		traceFlags: flags,
 | 
			
		||||
		traceState: sc.traceState,
 | 
			
		||||
		remote:     sc.remote,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TraceState returns the TraceState from the SpanContext.
 | 
			
		||||
func (sc SpanContext) TraceState() TraceState {
 | 
			
		||||
	return sc.traceState
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WithTraceState returns a new SpanContext with the TraceState replaced.
 | 
			
		||||
func (sc SpanContext) WithTraceState(state TraceState) SpanContext {
 | 
			
		||||
	return SpanContext{
 | 
			
		||||
		traceID:    sc.traceID,
 | 
			
		||||
		spanID:     sc.spanID,
 | 
			
		||||
		traceFlags: sc.traceFlags,
 | 
			
		||||
		traceState: state,
 | 
			
		||||
		remote:     sc.remote,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Equal is a predicate that determines whether two SpanContext values are equal.
 | 
			
		||||
func (sc SpanContext) Equal(other SpanContext) bool {
 | 
			
		||||
	return sc.traceID == other.traceID &&
 | 
			
		||||
		sc.spanID == other.spanID &&
 | 
			
		||||
		sc.traceFlags == other.traceFlags &&
 | 
			
		||||
		sc.traceState.String() == other.traceState.String() &&
 | 
			
		||||
		sc.remote == other.remote
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MarshalJSON implements a custom marshal function to encode a SpanContext.
 | 
			
		||||
func (sc SpanContext) MarshalJSON() ([]byte, error) {
 | 
			
		||||
	return json.Marshal(SpanContextConfig{
 | 
			
		||||
		TraceID:    sc.traceID,
 | 
			
		||||
		SpanID:     sc.spanID,
 | 
			
		||||
		TraceFlags: sc.traceFlags,
 | 
			
		||||
		TraceState: sc.traceState,
 | 
			
		||||
		Remote:     sc.remote,
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Span is the individual component of a trace. It represents a single named
 | 
			
		||||
// and timed operation of a workflow that is traced. A Tracer is used to
 | 
			
		||||
// create a Span and it is then up to the operation the Span represents to
 | 
			
		||||
// properly end the Span when the operation itself ends.
 | 
			
		||||
//
 | 
			
		||||
// Warning: methods may be added to this interface in minor releases.
 | 
			
		||||
type Span interface {
 | 
			
		||||
	// End completes the Span. The Span is considered complete and ready to be
 | 
			
		||||
	// delivered through the rest of the telemetry pipeline after this method
 | 
			
		||||
	// is called. Therefore, updates to the Span are not allowed after this
 | 
			
		||||
	// method has been called.
 | 
			
		||||
	End(options ...SpanEndOption)
 | 
			
		||||
 | 
			
		||||
	// AddEvent adds an event with the provided name and options.
 | 
			
		||||
	AddEvent(name string, options ...EventOption)
 | 
			
		||||
 | 
			
		||||
	// IsRecording returns the recording state of the Span. It will return
 | 
			
		||||
	// true if the Span is active and events can be recorded.
 | 
			
		||||
	IsRecording() bool
 | 
			
		||||
 | 
			
		||||
	// RecordError will record err as an exception span event for this span. An
 | 
			
		||||
	// additional call to SetStatus is required if the Status of the Span should
 | 
			
		||||
	// be set to Error, as this method does not change the Span status. If this
 | 
			
		||||
	// span is not being recorded or err is nil then this method does nothing.
 | 
			
		||||
	RecordError(err error, options ...EventOption)
 | 
			
		||||
 | 
			
		||||
	// SpanContext returns the SpanContext of the Span. The returned SpanContext
 | 
			
		||||
	// is usable even after the End method has been called for the Span.
 | 
			
		||||
	SpanContext() SpanContext
 | 
			
		||||
 | 
			
		||||
	// SetStatus sets the status of the Span in the form of a code and a
 | 
			
		||||
	// description, overriding previous values set. The description is only
 | 
			
		||||
	// included in a status when the code is for an error.
 | 
			
		||||
	SetStatus(code codes.Code, description string)
 | 
			
		||||
 | 
			
		||||
	// SetName sets the Span name.
 | 
			
		||||
	SetName(name string)
 | 
			
		||||
 | 
			
		||||
	// SetAttributes sets kv as attributes of the Span. If a key from kv
 | 
			
		||||
	// already exists for an attribute of the Span it will be overwritten with
 | 
			
		||||
	// the value contained in kv.
 | 
			
		||||
	SetAttributes(kv ...attribute.KeyValue)
 | 
			
		||||
 | 
			
		||||
	// TracerProvider returns a TracerProvider that can be used to generate
 | 
			
		||||
	// additional Spans on the same telemetry pipeline as the current Span.
 | 
			
		||||
	TracerProvider() TracerProvider
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Link is the relationship between two Spans. The relationship can be within
 | 
			
		||||
// the same Trace or across different Traces.
 | 
			
		||||
//
 | 
			
		||||
// For example, a Link is used in the following situations:
 | 
			
		||||
//
 | 
			
		||||
//   1. Batch Processing: A batch of operations may contain operations
 | 
			
		||||
//      associated with one or more traces/spans. Since there can only be one
 | 
			
		||||
//      parent SpanContext, a Link is used to keep reference to the
 | 
			
		||||
//      SpanContext of all operations in the batch.
 | 
			
		||||
//   2. Public Endpoint: A SpanContext for an in incoming client request on a
 | 
			
		||||
//      public endpoint should be considered untrusted. In such a case, a new
 | 
			
		||||
//      trace with its own identity and sampling decision needs to be created,
 | 
			
		||||
//      but this new trace needs to be related to the original trace in some
 | 
			
		||||
//      form. A Link is used to keep reference to the original SpanContext and
 | 
			
		||||
//      track the relationship.
 | 
			
		||||
type Link struct {
 | 
			
		||||
	// SpanContext of the linked Span.
 | 
			
		||||
	SpanContext SpanContext
 | 
			
		||||
 | 
			
		||||
	// Attributes describe the aspects of the link.
 | 
			
		||||
	Attributes []attribute.KeyValue
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// LinkFromContext returns a link encapsulating the SpanContext in the provided ctx.
 | 
			
		||||
func LinkFromContext(ctx context.Context, attrs ...attribute.KeyValue) Link {
 | 
			
		||||
	return Link{
 | 
			
		||||
		SpanContext: SpanContextFromContext(ctx),
 | 
			
		||||
		Attributes:  attrs,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SpanKind is the role a Span plays in a Trace.
 | 
			
		||||
type SpanKind int
 | 
			
		||||
 | 
			
		||||
// As a convenience, these match the proto definition, see
 | 
			
		||||
// https://github.com/open-telemetry/opentelemetry-proto/blob/30d237e1ff3ab7aa50e0922b5bebdd93505090af/opentelemetry/proto/trace/v1/trace.proto#L101-L129
 | 
			
		||||
//
 | 
			
		||||
// The unspecified value is not a valid `SpanKind`. Use `ValidateSpanKind()`
 | 
			
		||||
// to coerce a span kind to a valid value.
 | 
			
		||||
const (
 | 
			
		||||
	// SpanKindUnspecified is an unspecified SpanKind and is not a valid
 | 
			
		||||
	// SpanKind. SpanKindUnspecified should be replaced with SpanKindInternal
 | 
			
		||||
	// if it is received.
 | 
			
		||||
	SpanKindUnspecified SpanKind = 0
 | 
			
		||||
	// SpanKindInternal is a SpanKind for a Span that represents an internal
 | 
			
		||||
	// operation within an application.
 | 
			
		||||
	SpanKindInternal SpanKind = 1
 | 
			
		||||
	// SpanKindServer is a SpanKind for a Span that represents the operation
 | 
			
		||||
	// of handling a request from a client.
 | 
			
		||||
	SpanKindServer SpanKind = 2
 | 
			
		||||
	// SpanKindClient is a SpanKind for a Span that represents the operation
 | 
			
		||||
	// of client making a request to a server.
 | 
			
		||||
	SpanKindClient SpanKind = 3
 | 
			
		||||
	// SpanKindProducer is a SpanKind for a Span that represents the operation
 | 
			
		||||
	// of a producer sending a message to a message broker. Unlike
 | 
			
		||||
	// SpanKindClient and SpanKindServer, there is often no direct
 | 
			
		||||
	// relationship between this kind of Span and a SpanKindConsumer kind. A
 | 
			
		||||
	// SpanKindProducer Span will end once the message is accepted by the
 | 
			
		||||
	// message broker which might not overlap with the processing of that
 | 
			
		||||
	// message.
 | 
			
		||||
	SpanKindProducer SpanKind = 4
 | 
			
		||||
	// SpanKindConsumer is a SpanKind for a Span that represents the operation
 | 
			
		||||
	// of a consumer receiving a message from a message broker. Like
 | 
			
		||||
	// SpanKindProducer Spans, there is often no direct relationship between
 | 
			
		||||
	// this Span and the Span that produced the message.
 | 
			
		||||
	SpanKindConsumer SpanKind = 5
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// ValidateSpanKind returns a valid span kind value.  This will coerce
 | 
			
		||||
// invalid values into the default value, SpanKindInternal.
 | 
			
		||||
func ValidateSpanKind(spanKind SpanKind) SpanKind {
 | 
			
		||||
	switch spanKind {
 | 
			
		||||
	case SpanKindInternal,
 | 
			
		||||
		SpanKindServer,
 | 
			
		||||
		SpanKindClient,
 | 
			
		||||
		SpanKindProducer,
 | 
			
		||||
		SpanKindConsumer:
 | 
			
		||||
		// valid
 | 
			
		||||
		return spanKind
 | 
			
		||||
	default:
 | 
			
		||||
		return SpanKindInternal
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// String returns the specified name of the SpanKind in lower-case.
 | 
			
		||||
func (sk SpanKind) String() string {
 | 
			
		||||
	switch sk {
 | 
			
		||||
	case SpanKindInternal:
 | 
			
		||||
		return "internal"
 | 
			
		||||
	case SpanKindServer:
 | 
			
		||||
		return "server"
 | 
			
		||||
	case SpanKindClient:
 | 
			
		||||
		return "client"
 | 
			
		||||
	case SpanKindProducer:
 | 
			
		||||
		return "producer"
 | 
			
		||||
	case SpanKindConsumer:
 | 
			
		||||
		return "consumer"
 | 
			
		||||
	default:
 | 
			
		||||
		return "unspecified"
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tracer is the creator of Spans.
 | 
			
		||||
//
 | 
			
		||||
// Warning: methods may be added to this interface in minor releases.
 | 
			
		||||
type Tracer interface {
 | 
			
		||||
	// Start creates a span and a context.Context containing the newly-created span.
 | 
			
		||||
	//
 | 
			
		||||
	// If the context.Context provided in `ctx` contains a Span then the newly-created
 | 
			
		||||
	// Span will be a child of that span, otherwise it will be a root span. This behavior
 | 
			
		||||
	// can be overridden by providing `WithNewRoot()` as a SpanOption, causing the
 | 
			
		||||
	// newly-created Span to be a root span even if `ctx` contains a Span.
 | 
			
		||||
	//
 | 
			
		||||
	// When creating a Span it is recommended to provide all known span attributes using
 | 
			
		||||
	// the `WithAttributes()` SpanOption as samplers will only have access to the
 | 
			
		||||
	// attributes provided when a Span is created.
 | 
			
		||||
	//
 | 
			
		||||
	// Any Span that is created MUST also be ended. This is the responsibility of the user.
 | 
			
		||||
	// Implementations of this API may leak memory or other resources if Spans are not ended.
 | 
			
		||||
	Start(ctx context.Context, spanName string, opts ...SpanStartOption) (context.Context, Span)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TracerProvider provides access to instrumentation Tracers.
 | 
			
		||||
//
 | 
			
		||||
// Warning: methods may be added to this interface in minor releases.
 | 
			
		||||
type TracerProvider interface {
 | 
			
		||||
	// Tracer creates an implementation of the Tracer interface.
 | 
			
		||||
	// The instrumentationName must be the name of the library providing
 | 
			
		||||
	// instrumentation. This name may be the same as the instrumented code
 | 
			
		||||
	// only if that code provides built-in instrumentation. If the
 | 
			
		||||
	// instrumentationName is empty, then a implementation defined default
 | 
			
		||||
	// name will be used instead.
 | 
			
		||||
	//
 | 
			
		||||
	// This method must be concurrency safe.
 | 
			
		||||
	Tracer(instrumentationName string, opts ...TracerOption) Tracer
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										217
									
								
								vendor/go.opentelemetry.io/otel/trace/tracestate.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										217
									
								
								vendor/go.opentelemetry.io/otel/trace/tracestate.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,217 @@
 | 
			
		||||
// Copyright The OpenTelemetry Authors
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
//     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
package trace
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"regexp"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	maxListMembers = 32
 | 
			
		||||
 | 
			
		||||
	listDelimiter = ","
 | 
			
		||||
 | 
			
		||||
	// based on the W3C Trace Context specification, see
 | 
			
		||||
	// https://www.w3.org/TR/trace-context-1/#tracestate-header
 | 
			
		||||
	noTenantKeyFormat   = `[a-z][_0-9a-z\-\*\/]{0,255}`
 | 
			
		||||
	withTenantKeyFormat = `[a-z0-9][_0-9a-z\-\*\/]{0,240}@[a-z][_0-9a-z\-\*\/]{0,13}`
 | 
			
		||||
	valueFormat         = `[\x20-\x2b\x2d-\x3c\x3e-\x7e]{0,255}[\x21-\x2b\x2d-\x3c\x3e-\x7e]`
 | 
			
		||||
 | 
			
		||||
	keyRe    = regexp.MustCompile(`^((` + noTenantKeyFormat + `)|(` + withTenantKeyFormat + `))$`)
 | 
			
		||||
	valueRe  = regexp.MustCompile(`^(` + valueFormat + `)$`)
 | 
			
		||||
	memberRe = regexp.MustCompile(`^\s*((` + noTenantKeyFormat + `)|(` + withTenantKeyFormat + `))=(` + valueFormat + `)\s*$`)
 | 
			
		||||
 | 
			
		||||
	errInvalidKey    errorConst = "invalid tracestate key"
 | 
			
		||||
	errInvalidValue  errorConst = "invalid tracestate value"
 | 
			
		||||
	errInvalidMember errorConst = "invalid tracestate list-member"
 | 
			
		||||
	errMemberNumber  errorConst = "too many list-members in tracestate"
 | 
			
		||||
	errDuplicate     errorConst = "duplicate list-member in tracestate"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type member struct {
 | 
			
		||||
	Key   string
 | 
			
		||||
	Value string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newMember(key, value string) (member, error) {
 | 
			
		||||
	if !keyRe.MatchString(key) {
 | 
			
		||||
		return member{}, fmt.Errorf("%w: %s", errInvalidKey, key)
 | 
			
		||||
	}
 | 
			
		||||
	if !valueRe.MatchString(value) {
 | 
			
		||||
		return member{}, fmt.Errorf("%w: %s", errInvalidValue, value)
 | 
			
		||||
	}
 | 
			
		||||
	return member{Key: key, Value: value}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func parseMemeber(m string) (member, error) {
 | 
			
		||||
	matches := memberRe.FindStringSubmatch(m)
 | 
			
		||||
	if len(matches) != 5 {
 | 
			
		||||
		return member{}, fmt.Errorf("%w: %s", errInvalidMember, m)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return member{
 | 
			
		||||
		Key:   matches[1],
 | 
			
		||||
		Value: matches[4],
 | 
			
		||||
	}, nil
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// String encodes member into a string compliant with the W3C Trace Context
 | 
			
		||||
// specification.
 | 
			
		||||
func (m member) String() string {
 | 
			
		||||
	return fmt.Sprintf("%s=%s", m.Key, m.Value)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TraceState provides additional vendor-specific trace identification
 | 
			
		||||
// information across different distributed tracing systems. It represents an
 | 
			
		||||
// immutable list consisting of key/value pairs, each pair is referred to as a
 | 
			
		||||
// list-member.
 | 
			
		||||
//
 | 
			
		||||
// TraceState conforms to the W3C Trace Context specification
 | 
			
		||||
// (https://www.w3.org/TR/trace-context-1). All operations that create or copy
 | 
			
		||||
// a TraceState do so by validating all input and will only produce TraceState
 | 
			
		||||
// that conform to the specification. Specifically, this means that all
 | 
			
		||||
// list-member's key/value pairs are valid, no duplicate list-members exist,
 | 
			
		||||
// and the maximum number of list-members (32) is not exceeded.
 | 
			
		||||
type TraceState struct { //nolint:revive // revive complains about stutter of `trace.TraceState`
 | 
			
		||||
	// list is the members in order.
 | 
			
		||||
	list []member
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var _ json.Marshaler = TraceState{}
 | 
			
		||||
 | 
			
		||||
// ParseTraceState attempts to decode a TraceState from the passed
 | 
			
		||||
// string. It returns an error if the input is invalid according to the W3C
 | 
			
		||||
// Trace Context specification.
 | 
			
		||||
func ParseTraceState(tracestate string) (TraceState, error) {
 | 
			
		||||
	if tracestate == "" {
 | 
			
		||||
		return TraceState{}, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	wrapErr := func(err error) error {
 | 
			
		||||
		return fmt.Errorf("failed to parse tracestate: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var members []member
 | 
			
		||||
	found := make(map[string]struct{})
 | 
			
		||||
	for _, memberStr := range strings.Split(tracestate, listDelimiter) {
 | 
			
		||||
		if len(memberStr) == 0 {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		m, err := parseMemeber(memberStr)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return TraceState{}, wrapErr(err)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if _, ok := found[m.Key]; ok {
 | 
			
		||||
			return TraceState{}, wrapErr(errDuplicate)
 | 
			
		||||
		}
 | 
			
		||||
		found[m.Key] = struct{}{}
 | 
			
		||||
 | 
			
		||||
		members = append(members, m)
 | 
			
		||||
		if n := len(members); n > maxListMembers {
 | 
			
		||||
			return TraceState{}, wrapErr(errMemberNumber)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return TraceState{list: members}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MarshalJSON marshals the TraceState into JSON.
 | 
			
		||||
func (ts TraceState) MarshalJSON() ([]byte, error) {
 | 
			
		||||
	return json.Marshal(ts.String())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// String encodes the TraceState into a string compliant with the W3C
 | 
			
		||||
// Trace Context specification. The returned string will be invalid if the
 | 
			
		||||
// TraceState contains any invalid members.
 | 
			
		||||
func (ts TraceState) String() string {
 | 
			
		||||
	members := make([]string, len(ts.list))
 | 
			
		||||
	for i, m := range ts.list {
 | 
			
		||||
		members[i] = m.String()
 | 
			
		||||
	}
 | 
			
		||||
	return strings.Join(members, listDelimiter)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Get returns the value paired with key from the corresponding TraceState
 | 
			
		||||
// list-member if it exists, otherwise an empty string is returned.
 | 
			
		||||
func (ts TraceState) Get(key string) string {
 | 
			
		||||
	for _, member := range ts.list {
 | 
			
		||||
		if member.Key == key {
 | 
			
		||||
			return member.Value
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return ""
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Insert adds a new list-member defined by the key/value pair to the
 | 
			
		||||
// TraceState. If a list-member already exists for the given key, that
 | 
			
		||||
// list-member's value is updated. The new or updated list-member is always
 | 
			
		||||
// moved to the beginning of the TraceState as specified by the W3C Trace
 | 
			
		||||
// Context specification.
 | 
			
		||||
//
 | 
			
		||||
// If key or value are invalid according to the W3C Trace Context
 | 
			
		||||
// specification an error is returned with the original TraceState.
 | 
			
		||||
//
 | 
			
		||||
// If adding a new list-member means the TraceState would have more members
 | 
			
		||||
// than is allowed an error is returned instead with the original TraceState.
 | 
			
		||||
func (ts TraceState) Insert(key, value string) (TraceState, error) {
 | 
			
		||||
	m, err := newMember(key, value)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return ts, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	cTS := ts.Delete(key)
 | 
			
		||||
	if cTS.Len()+1 > maxListMembers {
 | 
			
		||||
		// TODO (MrAlias): When the second version of the Trace Context
 | 
			
		||||
		// specification is published this needs to not return an error.
 | 
			
		||||
		// Instead it should drop the "right-most" member and insert the new
 | 
			
		||||
		// member at the front.
 | 
			
		||||
		//
 | 
			
		||||
		// https://github.com/w3c/trace-context/pull/448
 | 
			
		||||
		return ts, fmt.Errorf("failed to insert: %w", errMemberNumber)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	cTS.list = append(cTS.list, member{})
 | 
			
		||||
	copy(cTS.list[1:], cTS.list)
 | 
			
		||||
	cTS.list[0] = m
 | 
			
		||||
 | 
			
		||||
	return cTS, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Delete returns a copy of the TraceState with the list-member identified by
 | 
			
		||||
// key removed.
 | 
			
		||||
func (ts TraceState) Delete(key string) TraceState {
 | 
			
		||||
	members := make([]member, ts.Len())
 | 
			
		||||
	copy(members, ts.list)
 | 
			
		||||
	for i, member := range ts.list {
 | 
			
		||||
		if member.Key == key {
 | 
			
		||||
			members = append(members[:i], members[i+1:]...)
 | 
			
		||||
			// TraceState should contain no duplicate members.
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return TraceState{list: members}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Len returns the number of list-members in the TraceState.
 | 
			
		||||
func (ts TraceState) Len() int {
 | 
			
		||||
	return len(ts.list)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										11
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							@@ -11,6 +11,9 @@ github.com/golang/protobuf/ptypes
 | 
			
		||||
github.com/golang/protobuf/ptypes/any
 | 
			
		||||
github.com/golang/protobuf/ptypes/duration
 | 
			
		||||
github.com/golang/protobuf/ptypes/timestamp
 | 
			
		||||
# github.com/hellofresh/health-go/v4 v4.5.0
 | 
			
		||||
## explicit; go 1.15
 | 
			
		||||
github.com/hellofresh/health-go/v4
 | 
			
		||||
# github.com/matttproud/golang_protobuf_extensions v1.0.1
 | 
			
		||||
## explicit
 | 
			
		||||
github.com/matttproud/golang_protobuf_extensions/pbutil
 | 
			
		||||
@@ -33,6 +36,14 @@ github.com/prometheus/common/model
 | 
			
		||||
github.com/prometheus/procfs
 | 
			
		||||
github.com/prometheus/procfs/internal/fs
 | 
			
		||||
github.com/prometheus/procfs/internal/util
 | 
			
		||||
# go.opentelemetry.io/otel v1.0.0
 | 
			
		||||
## explicit; go 1.15
 | 
			
		||||
go.opentelemetry.io/otel/attribute
 | 
			
		||||
go.opentelemetry.io/otel/codes
 | 
			
		||||
go.opentelemetry.io/otel/internal
 | 
			
		||||
# go.opentelemetry.io/otel/trace v1.0.0
 | 
			
		||||
## explicit; go 1.15
 | 
			
		||||
go.opentelemetry.io/otel/trace
 | 
			
		||||
# golang.org/x/sys v0.0.0-20220114195835-da31bd327af9
 | 
			
		||||
## explicit; go 1.17
 | 
			
		||||
golang.org/x/sys/internal/unsafeheader
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user