swarm: integrate OpenTracing; propagate ctx to internal APIs (#17169)
* swarm: propagate ctx, enable opentracing * swarm/tracing: log error when tracing is misconfigured
This commit is contained in:
		
				
					committed by
					
						
						Balint Gabor
					
				
			
			
				
	
			
			
			
						parent
						
							f7d3678c28
						
					
				
				
					commit
					7c9314f231
				
			
							
								
								
									
										101
									
								
								vendor/github.com/uber/jaeger-client-go/internal/baggage/remote/options.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								vendor/github.com/uber/jaeger-client-go/internal/baggage/remote/options.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,101 @@
 | 
			
		||||
// Copyright (c) 2017 Uber Technologies, Inc.
 | 
			
		||||
//
 | 
			
		||||
// 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 remote
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/uber/jaeger-client-go"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	defaultMaxValueLength  = 2048
 | 
			
		||||
	defaultRefreshInterval = time.Minute
 | 
			
		||||
	defaultHostPort        = "localhost:5778"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Option is a function that sets some option on the RestrictionManager
 | 
			
		||||
type Option func(options *options)
 | 
			
		||||
 | 
			
		||||
// Options is a factory for all available options
 | 
			
		||||
var Options options
 | 
			
		||||
 | 
			
		||||
type options struct {
 | 
			
		||||
	denyBaggageOnInitializationFailure bool
 | 
			
		||||
	metrics                            *jaeger.Metrics
 | 
			
		||||
	logger                             jaeger.Logger
 | 
			
		||||
	hostPort                           string
 | 
			
		||||
	refreshInterval                    time.Duration
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DenyBaggageOnInitializationFailure creates an Option that determines the startup failure mode of RestrictionManager.
 | 
			
		||||
// If DenyBaggageOnInitializationFailure is true, RestrictionManager will not allow any baggage to be written until baggage
 | 
			
		||||
// restrictions have been retrieved from agent.
 | 
			
		||||
// If DenyBaggageOnInitializationFailure is false, RestrictionManager will allow any baggage to be written until baggage
 | 
			
		||||
// restrictions have been retrieved from agent.
 | 
			
		||||
func (options) DenyBaggageOnInitializationFailure(b bool) Option {
 | 
			
		||||
	return func(o *options) {
 | 
			
		||||
		o.denyBaggageOnInitializationFailure = b
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Metrics creates an Option that initializes Metrics on the RestrictionManager, which is used to emit statistics.
 | 
			
		||||
func (options) Metrics(m *jaeger.Metrics) Option {
 | 
			
		||||
	return func(o *options) {
 | 
			
		||||
		o.metrics = m
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Logger creates an Option that sets the logger used by the RestrictionManager.
 | 
			
		||||
func (options) Logger(logger jaeger.Logger) Option {
 | 
			
		||||
	return func(o *options) {
 | 
			
		||||
		o.logger = logger
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HostPort creates an Option that sets the hostPort of the local agent that contains the baggage restrictions.
 | 
			
		||||
func (options) HostPort(hostPort string) Option {
 | 
			
		||||
	return func(o *options) {
 | 
			
		||||
		o.hostPort = hostPort
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RefreshInterval creates an Option that sets how often the RestrictionManager will poll local agent for
 | 
			
		||||
// the baggage restrictions.
 | 
			
		||||
func (options) RefreshInterval(refreshInterval time.Duration) Option {
 | 
			
		||||
	return func(o *options) {
 | 
			
		||||
		o.refreshInterval = refreshInterval
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func applyOptions(o ...Option) options {
 | 
			
		||||
	opts := options{}
 | 
			
		||||
	for _, option := range o {
 | 
			
		||||
		option(&opts)
 | 
			
		||||
	}
 | 
			
		||||
	if opts.metrics == nil {
 | 
			
		||||
		opts.metrics = jaeger.NewNullMetrics()
 | 
			
		||||
	}
 | 
			
		||||
	if opts.logger == nil {
 | 
			
		||||
		opts.logger = jaeger.NullLogger
 | 
			
		||||
	}
 | 
			
		||||
	if opts.hostPort == "" {
 | 
			
		||||
		opts.hostPort = defaultHostPort
 | 
			
		||||
	}
 | 
			
		||||
	if opts.refreshInterval == 0 {
 | 
			
		||||
		opts.refreshInterval = defaultRefreshInterval
 | 
			
		||||
	}
 | 
			
		||||
	return opts
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										157
									
								
								vendor/github.com/uber/jaeger-client-go/internal/baggage/remote/restriction_manager.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										157
									
								
								vendor/github.com/uber/jaeger-client-go/internal/baggage/remote/restriction_manager.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,157 @@
 | 
			
		||||
// Copyright (c) 2017 Uber Technologies, Inc.
 | 
			
		||||
//
 | 
			
		||||
// 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 remote
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net/url"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/uber/jaeger-client-go/internal/baggage"
 | 
			
		||||
	thrift "github.com/uber/jaeger-client-go/thrift-gen/baggage"
 | 
			
		||||
	"github.com/uber/jaeger-client-go/utils"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type httpBaggageRestrictionManagerProxy struct {
 | 
			
		||||
	url string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newHTTPBaggageRestrictionManagerProxy(hostPort, serviceName string) *httpBaggageRestrictionManagerProxy {
 | 
			
		||||
	v := url.Values{}
 | 
			
		||||
	v.Set("service", serviceName)
 | 
			
		||||
	return &httpBaggageRestrictionManagerProxy{
 | 
			
		||||
		url: fmt.Sprintf("http://%s/baggageRestrictions?%s", hostPort, v.Encode()),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *httpBaggageRestrictionManagerProxy) GetBaggageRestrictions(serviceName string) ([]*thrift.BaggageRestriction, error) {
 | 
			
		||||
	var out []*thrift.BaggageRestriction
 | 
			
		||||
	if err := utils.GetJSON(s.url, &out); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return out, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RestrictionManager manages baggage restrictions by retrieving baggage restrictions from agent
 | 
			
		||||
type RestrictionManager struct {
 | 
			
		||||
	options
 | 
			
		||||
 | 
			
		||||
	mux                sync.RWMutex
 | 
			
		||||
	serviceName        string
 | 
			
		||||
	restrictions       map[string]*baggage.Restriction
 | 
			
		||||
	thriftProxy        thrift.BaggageRestrictionManager
 | 
			
		||||
	pollStopped        sync.WaitGroup
 | 
			
		||||
	stopPoll           chan struct{}
 | 
			
		||||
	invalidRestriction *baggage.Restriction
 | 
			
		||||
	validRestriction   *baggage.Restriction
 | 
			
		||||
 | 
			
		||||
	// Determines if the manager has successfully retrieved baggage restrictions from agent
 | 
			
		||||
	initialized bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewRestrictionManager returns a BaggageRestrictionManager that polls the agent for the latest
 | 
			
		||||
// baggage restrictions.
 | 
			
		||||
func NewRestrictionManager(serviceName string, options ...Option) *RestrictionManager {
 | 
			
		||||
	// TODO there is a developing use case where a single tracer can generate traces on behalf of many services.
 | 
			
		||||
	// restrictionsMap will need to exist per service
 | 
			
		||||
	opts := applyOptions(options...)
 | 
			
		||||
	m := &RestrictionManager{
 | 
			
		||||
		serviceName:        serviceName,
 | 
			
		||||
		options:            opts,
 | 
			
		||||
		restrictions:       make(map[string]*baggage.Restriction),
 | 
			
		||||
		thriftProxy:        newHTTPBaggageRestrictionManagerProxy(opts.hostPort, serviceName),
 | 
			
		||||
		stopPoll:           make(chan struct{}),
 | 
			
		||||
		invalidRestriction: baggage.NewRestriction(false, 0),
 | 
			
		||||
		validRestriction:   baggage.NewRestriction(true, defaultMaxValueLength),
 | 
			
		||||
	}
 | 
			
		||||
	m.pollStopped.Add(1)
 | 
			
		||||
	go m.pollManager()
 | 
			
		||||
	return m
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// isReady returns true if the manager has retrieved baggage restrictions from the remote source.
 | 
			
		||||
func (m *RestrictionManager) isReady() bool {
 | 
			
		||||
	m.mux.RLock()
 | 
			
		||||
	defer m.mux.RUnlock()
 | 
			
		||||
	return m.initialized
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetRestriction implements RestrictionManager#GetRestriction.
 | 
			
		||||
func (m *RestrictionManager) GetRestriction(service, key string) *baggage.Restriction {
 | 
			
		||||
	m.mux.RLock()
 | 
			
		||||
	defer m.mux.RUnlock()
 | 
			
		||||
	if !m.initialized {
 | 
			
		||||
		if m.denyBaggageOnInitializationFailure {
 | 
			
		||||
			return m.invalidRestriction
 | 
			
		||||
		}
 | 
			
		||||
		return m.validRestriction
 | 
			
		||||
	}
 | 
			
		||||
	if restriction, ok := m.restrictions[key]; ok {
 | 
			
		||||
		return restriction
 | 
			
		||||
	}
 | 
			
		||||
	return m.invalidRestriction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Close stops remote polling and closes the RemoteRestrictionManager.
 | 
			
		||||
func (m *RestrictionManager) Close() error {
 | 
			
		||||
	close(m.stopPoll)
 | 
			
		||||
	m.pollStopped.Wait()
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *RestrictionManager) pollManager() {
 | 
			
		||||
	defer m.pollStopped.Done()
 | 
			
		||||
	// attempt to initialize baggage restrictions
 | 
			
		||||
	if err := m.updateRestrictions(); err != nil {
 | 
			
		||||
		m.logger.Error(fmt.Sprintf("Failed to initialize baggage restrictions: %s", err.Error()))
 | 
			
		||||
	}
 | 
			
		||||
	ticker := time.NewTicker(m.refreshInterval)
 | 
			
		||||
	defer ticker.Stop()
 | 
			
		||||
 | 
			
		||||
	for {
 | 
			
		||||
		select {
 | 
			
		||||
		case <-ticker.C:
 | 
			
		||||
			if err := m.updateRestrictions(); err != nil {
 | 
			
		||||
				m.logger.Error(fmt.Sprintf("Failed to update baggage restrictions: %s", err.Error()))
 | 
			
		||||
			}
 | 
			
		||||
		case <-m.stopPoll:
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *RestrictionManager) updateRestrictions() error {
 | 
			
		||||
	restrictions, err := m.thriftProxy.GetBaggageRestrictions(m.serviceName)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		m.metrics.BaggageRestrictionsUpdateFailure.Inc(1)
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	newRestrictions := m.parseRestrictions(restrictions)
 | 
			
		||||
	m.metrics.BaggageRestrictionsUpdateSuccess.Inc(1)
 | 
			
		||||
	m.mux.Lock()
 | 
			
		||||
	defer m.mux.Unlock()
 | 
			
		||||
	m.initialized = true
 | 
			
		||||
	m.restrictions = newRestrictions
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *RestrictionManager) parseRestrictions(restrictions []*thrift.BaggageRestriction) map[string]*baggage.Restriction {
 | 
			
		||||
	setters := make(map[string]*baggage.Restriction, len(restrictions))
 | 
			
		||||
	for _, restriction := range restrictions {
 | 
			
		||||
		setters[restriction.BaggageKey] = baggage.NewRestriction(true, int(restriction.MaxValueLength))
 | 
			
		||||
	}
 | 
			
		||||
	return setters
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user