mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 00:12:25 -05:00 
			
		
		
		
	feat: initial tracing support (#1623)
This commit is contained in:
		
					parent
					
						
							
								878ed48de3
							
						
					
				
			
			
				commit
				
					
						6392e00653
					
				
			
		
					 472 changed files with 102600 additions and 12 deletions
				
			
		
							
								
								
									
										135
									
								
								vendor/google.golang.org/grpc/encoding/encoding.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								vendor/google.golang.org/grpc/encoding/encoding.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,135 @@ | |||
| /* | ||||
|  * | ||||
|  * Copyright 2017 gRPC 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 encoding defines the interface for the compressor and codec, and | ||||
| // functions to register and retrieve compressors and codecs. | ||||
| // | ||||
| // # Experimental | ||||
| // | ||||
| // Notice: This package is EXPERIMENTAL and may be changed or removed in a | ||||
| // later release. | ||||
| package encoding | ||||
| 
 | ||||
| import ( | ||||
| 	"io" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"google.golang.org/grpc/internal/grpcutil" | ||||
| ) | ||||
| 
 | ||||
| // Identity specifies the optional encoding for uncompressed streams. | ||||
| // It is intended for grpc internal use only. | ||||
| const Identity = "identity" | ||||
| 
 | ||||
| // Compressor is used for compressing and decompressing when sending or | ||||
| // receiving messages. | ||||
| type Compressor interface { | ||||
| 	// Compress writes the data written to wc to w after compressing it.  If an | ||||
| 	// error occurs while initializing the compressor, that error is returned | ||||
| 	// instead. | ||||
| 	Compress(w io.Writer) (io.WriteCloser, error) | ||||
| 	// Decompress reads data from r, decompresses it, and provides the | ||||
| 	// uncompressed data via the returned io.Reader.  If an error occurs while | ||||
| 	// initializing the decompressor, that error is returned instead. | ||||
| 	Decompress(r io.Reader) (io.Reader, error) | ||||
| 	// Name is the name of the compression codec and is used to set the content | ||||
| 	// coding header.  The result must be static; the result cannot change | ||||
| 	// between calls. | ||||
| 	Name() string | ||||
| 	// If a Compressor implements | ||||
| 	// DecompressedSize(compressedBytes []byte) int, gRPC will call it | ||||
| 	// to determine the size of the buffer allocated for the result of decompression. | ||||
| 	// Return -1 to indicate unknown size. | ||||
| 	// | ||||
| 	// Experimental | ||||
| 	// | ||||
| 	// Notice: This API is EXPERIMENTAL and may be changed or removed in a | ||||
| 	// later release. | ||||
| } | ||||
| 
 | ||||
| var registeredCompressor = make(map[string]Compressor) | ||||
| 
 | ||||
| // RegisterCompressor registers the compressor with gRPC by its name.  It can | ||||
| // be activated when sending an RPC via grpc.UseCompressor().  It will be | ||||
| // automatically accessed when receiving a message based on the content coding | ||||
| // header.  Servers also use it to send a response with the same encoding as | ||||
| // the request. | ||||
| // | ||||
| // NOTE: this function must only be called during initialization time (i.e. in | ||||
| // an init() function), and is not thread-safe.  If multiple Compressors are | ||||
| // registered with the same name, the one registered last will take effect. | ||||
| func RegisterCompressor(c Compressor) { | ||||
| 	registeredCompressor[c.Name()] = c | ||||
| 	if !grpcutil.IsCompressorNameRegistered(c.Name()) { | ||||
| 		grpcutil.RegisteredCompressorNames = append(grpcutil.RegisteredCompressorNames, c.Name()) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // GetCompressor returns Compressor for the given compressor name. | ||||
| func GetCompressor(name string) Compressor { | ||||
| 	return registeredCompressor[name] | ||||
| } | ||||
| 
 | ||||
| // Codec defines the interface gRPC uses to encode and decode messages.  Note | ||||
| // that implementations of this interface must be thread safe; a Codec's | ||||
| // methods can be called from concurrent goroutines. | ||||
| type Codec interface { | ||||
| 	// Marshal returns the wire format of v. | ||||
| 	Marshal(v interface{}) ([]byte, error) | ||||
| 	// Unmarshal parses the wire format into v. | ||||
| 	Unmarshal(data []byte, v interface{}) error | ||||
| 	// Name returns the name of the Codec implementation. The returned string | ||||
| 	// will be used as part of content type in transmission.  The result must be | ||||
| 	// static; the result cannot change between calls. | ||||
| 	Name() string | ||||
| } | ||||
| 
 | ||||
| var registeredCodecs = make(map[string]Codec) | ||||
| 
 | ||||
| // RegisterCodec registers the provided Codec for use with all gRPC clients and | ||||
| // servers. | ||||
| // | ||||
| // The Codec will be stored and looked up by result of its Name() method, which | ||||
| // should match the content-subtype of the encoding handled by the Codec.  This | ||||
| // is case-insensitive, and is stored and looked up as lowercase.  If the | ||||
| // result of calling Name() is an empty string, RegisterCodec will panic. See | ||||
| // Content-Type on | ||||
| // https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests for | ||||
| // more details. | ||||
| // | ||||
| // NOTE: this function must only be called during initialization time (i.e. in | ||||
| // an init() function), and is not thread-safe.  If multiple Codecs are | ||||
| // registered with the same name, the one registered last will take effect. | ||||
| func RegisterCodec(codec Codec) { | ||||
| 	if codec == nil { | ||||
| 		panic("cannot register a nil Codec") | ||||
| 	} | ||||
| 	if codec.Name() == "" { | ||||
| 		panic("cannot register Codec with empty string result for Name()") | ||||
| 	} | ||||
| 	contentSubtype := strings.ToLower(codec.Name()) | ||||
| 	registeredCodecs[contentSubtype] = codec | ||||
| } | ||||
| 
 | ||||
| // GetCodec gets a registered Codec by content-subtype, or nil if no Codec is | ||||
| // registered for the content-subtype. | ||||
| // | ||||
| // The content-subtype is expected to be lowercase. | ||||
| func GetCodec(contentSubtype string) Codec { | ||||
| 	return registeredCodecs[contentSubtype] | ||||
| } | ||||
							
								
								
									
										132
									
								
								vendor/google.golang.org/grpc/encoding/gzip/gzip.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								vendor/google.golang.org/grpc/encoding/gzip/gzip.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,132 @@ | |||
| /* | ||||
|  * | ||||
|  * Copyright 2017 gRPC 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 gzip implements and registers the gzip compressor | ||||
| // during the initialization. | ||||
| // | ||||
| // # Experimental | ||||
| // | ||||
| // Notice: This package is EXPERIMENTAL and may be changed or removed in a | ||||
| // later release. | ||||
| package gzip | ||||
| 
 | ||||
| import ( | ||||
| 	"compress/gzip" | ||||
| 	"encoding/binary" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"sync" | ||||
| 
 | ||||
| 	"google.golang.org/grpc/encoding" | ||||
| ) | ||||
| 
 | ||||
| // Name is the name registered for the gzip compressor. | ||||
| const Name = "gzip" | ||||
| 
 | ||||
| func init() { | ||||
| 	c := &compressor{} | ||||
| 	c.poolCompressor.New = func() interface{} { | ||||
| 		return &writer{Writer: gzip.NewWriter(io.Discard), pool: &c.poolCompressor} | ||||
| 	} | ||||
| 	encoding.RegisterCompressor(c) | ||||
| } | ||||
| 
 | ||||
| type writer struct { | ||||
| 	*gzip.Writer | ||||
| 	pool *sync.Pool | ||||
| } | ||||
| 
 | ||||
| // SetLevel updates the registered gzip compressor to use the compression level specified (gzip.HuffmanOnly is not supported). | ||||
| // NOTE: this function must only be called during initialization time (i.e. in an init() function), | ||||
| // and is not thread-safe. | ||||
| // | ||||
| // The error returned will be nil if the specified level is valid. | ||||
| func SetLevel(level int) error { | ||||
| 	if level < gzip.DefaultCompression || level > gzip.BestCompression { | ||||
| 		return fmt.Errorf("grpc: invalid gzip compression level: %d", level) | ||||
| 	} | ||||
| 	c := encoding.GetCompressor(Name).(*compressor) | ||||
| 	c.poolCompressor.New = func() interface{} { | ||||
| 		w, err := gzip.NewWriterLevel(io.Discard, level) | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| 		return &writer{Writer: w, pool: &c.poolCompressor} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| func (c *compressor) Compress(w io.Writer) (io.WriteCloser, error) { | ||||
| 	z := c.poolCompressor.Get().(*writer) | ||||
| 	z.Writer.Reset(w) | ||||
| 	return z, nil | ||||
| } | ||||
| 
 | ||||
| func (z *writer) Close() error { | ||||
| 	defer z.pool.Put(z) | ||||
| 	return z.Writer.Close() | ||||
| } | ||||
| 
 | ||||
| type reader struct { | ||||
| 	*gzip.Reader | ||||
| 	pool *sync.Pool | ||||
| } | ||||
| 
 | ||||
| func (c *compressor) Decompress(r io.Reader) (io.Reader, error) { | ||||
| 	z, inPool := c.poolDecompressor.Get().(*reader) | ||||
| 	if !inPool { | ||||
| 		newZ, err := gzip.NewReader(r) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		return &reader{Reader: newZ, pool: &c.poolDecompressor}, nil | ||||
| 	} | ||||
| 	if err := z.Reset(r); err != nil { | ||||
| 		c.poolDecompressor.Put(z) | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return z, nil | ||||
| } | ||||
| 
 | ||||
| func (z *reader) Read(p []byte) (n int, err error) { | ||||
| 	n, err = z.Reader.Read(p) | ||||
| 	if err == io.EOF { | ||||
| 		z.pool.Put(z) | ||||
| 	} | ||||
| 	return n, err | ||||
| } | ||||
| 
 | ||||
| // RFC1952 specifies that the last four bytes "contains the size of | ||||
| // the original (uncompressed) input data modulo 2^32." | ||||
| // gRPC has a max message size of 2GB so we don't need to worry about wraparound. | ||||
| func (c *compressor) DecompressedSize(buf []byte) int { | ||||
| 	last := len(buf) | ||||
| 	if last < 4 { | ||||
| 		return -1 | ||||
| 	} | ||||
| 	return int(binary.LittleEndian.Uint32(buf[last-4 : last])) | ||||
| } | ||||
| 
 | ||||
| func (c *compressor) Name() string { | ||||
| 	return Name | ||||
| } | ||||
| 
 | ||||
| type compressor struct { | ||||
| 	poolCompressor   sync.Pool | ||||
| 	poolDecompressor sync.Pool | ||||
| } | ||||
							
								
								
									
										58
									
								
								vendor/google.golang.org/grpc/encoding/proto/proto.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								vendor/google.golang.org/grpc/encoding/proto/proto.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,58 @@ | |||
| /* | ||||
|  * | ||||
|  * Copyright 2018 gRPC 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 proto defines the protobuf codec. Importing this package will | ||||
| // register the codec. | ||||
| package proto | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 
 | ||||
| 	"github.com/golang/protobuf/proto" | ||||
| 	"google.golang.org/grpc/encoding" | ||||
| ) | ||||
| 
 | ||||
| // Name is the name registered for the proto compressor. | ||||
| const Name = "proto" | ||||
| 
 | ||||
| func init() { | ||||
| 	encoding.RegisterCodec(codec{}) | ||||
| } | ||||
| 
 | ||||
| // codec is a Codec implementation with protobuf. It is the default codec for gRPC. | ||||
| type codec struct{} | ||||
| 
 | ||||
| func (codec) Marshal(v interface{}) ([]byte, error) { | ||||
| 	vv, ok := v.(proto.Message) | ||||
| 	if !ok { | ||||
| 		return nil, fmt.Errorf("failed to marshal, message is %T, want proto.Message", v) | ||||
| 	} | ||||
| 	return proto.Marshal(vv) | ||||
| } | ||||
| 
 | ||||
| func (codec) Unmarshal(data []byte, v interface{}) error { | ||||
| 	vv, ok := v.(proto.Message) | ||||
| 	if !ok { | ||||
| 		return fmt.Errorf("failed to unmarshal, message is %T, want proto.Message", v) | ||||
| 	} | ||||
| 	return proto.Unmarshal(data, vv) | ||||
| } | ||||
| 
 | ||||
| func (codec) Name() string { | ||||
| 	return Name | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue