grpc_ctxtags

package
v0.0.0-...-fb1b862 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 13, 2017 License: Apache-2.0 Imports: 6 Imported by: 0

Documentation

Overview

`grpc_ctxtags` adds a Tag object to the context that can be used by other middleware to add context about a request.

Request Context Tags

Tags describe information about the request, and can be set and used by other middleware, or handlers. Tags are used for logging and tracing of requests. Tags are populated both upwards, *and* downwards in the interceptor-handler stack.

You can automatically extract tags (in `grpc.request.<field_name>`) from request payloads (in unary and server-streaming) by passing in the `WithFieldExtractor` option.

If a user doesn't use the interceptors that initialize the `Tags` object, all operations following from an `Extract(ctx)` will be no-ops. This is to ensure that code doesn't panic if the interceptors weren't used.

Tags fields are typed, and shallow and should follow the OpenTracing semantics convention: https://github.com/opentracing/specification/blob/master/semantic_conventions.md

Example (Initialization)

Simple example of server initialization code, with data automatically populated from `log_fields` Golang tags.

opts := []grpc_ctxtags.Option{
	grpc_ctxtags.WithFieldExtractor(grpc_ctxtags.TagBasedRequestFieldExtractor("log_fields")),
}
server := grpc.NewServer(
	grpc.StreamInterceptor(grpc_ctxtags.StreamServerInterceptor(opts...)),
	grpc.UnaryInterceptor(grpc_ctxtags.UnaryServerInterceptor(opts...)),
)
return server
Output:

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func CodeGenRequestFieldExtractor

func CodeGenRequestFieldExtractor(fullMethod string, req interface{}) map[string]interface{}

CodeGenRequestFieldExtractor is a function that relies on code-generated functions that export log fields from requests. These are usually coming from a protoc-plugin that generates additional information based on custom field options.

func StreamServerInterceptor

func StreamServerInterceptor(opts ...Option) grpc.StreamServerInterceptor

StreamServerInterceptor returns a new streaming server interceptor that sets the values for request tags.

func UnaryServerInterceptor

func UnaryServerInterceptor(opts ...Option) grpc.UnaryServerInterceptor

UnaryServerInterceptor returns a new unary server interceptors that sets the values for request tags.

Types

type Option

type Option func(*options)

func WithFieldExtractor

func WithFieldExtractor(f RequestFieldExtractorFunc) Option

WithFieldExtractor customizes the function for extracting log fields from protobuf messages.

type RequestFieldExtractorFunc

type RequestFieldExtractorFunc func(fullMethod string, req interface{}) map[string]interface{}

RequestFieldExtractorFunc is a user-provided function that extracts field information from a gRPC request. It is called from tags middleware on arrival of unary request or a server-stream request. Keys and values will be added to the context tags of the request. If there are no fields, you should return a nil.

func TagBasedRequestFieldExtractor

func TagBasedRequestFieldExtractor(tagName string) RequestFieldExtractorFunc

TagedRequestFiledExtractor is a function that relies on Go struct tags to export log fields from requests. These are usualy coming from a protoc-plugin, such as Gogo protobuf.

message Metadata {
   repeated string tags = 1 [ (gogoproto.moretags) = "log_field:\"meta_tags\"" ];
}

The tagName is configurable using the tagName variable. Here it would be "log_field".

type Tags

type Tags struct {
	// contains filtered or unexported fields
}

Tags is the struct used for storing request tags between Context calls. This object is *not* thread safe, and should be handled only in the context of the request.

func Extract

func Extract(ctx context.Context) *Tags

Extracts returns a pre-existing Tags object in the Context. If the context wasn't set in a tag interceptor, a no-op Tag storage is returned that will *not* be propagated in context.

func (*Tags) Has

func (t *Tags) Has(key string) bool

Has checks if the given key exists.

func (*Tags) Set

func (t *Tags) Set(key string, value interface{}) *Tags

Set sets the given key in the metadata tags.

func (*Tags) Values

func (t *Tags) Values() map[string]interface{}

Values returns a map of key to values. Do not modify the underlying map, please use Set instead.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL