repo_description: 🛑 This library is DEPRECATED!
repo_topics: distributed-tracing microservices monitoring opentracing
code: // 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 jaeger
  
  import opentracing "github.com/opentracing/opentracing-go"
  
  // Observer can be registered with the Tracer to receive notifications about
  // new Spans.
  //
  // Deprecated: use jaeger.ContribObserver instead.
  type Observer interface {
  	OnStartSpan(operationName string, options opentracing.StartSpanOptions) SpanObserver
  }
  
  // SpanObserver is created by the Observer and receives notifications about
  // other Span events.
  //
  // Deprecated: use jaeger.ContribSpanObserver instead.
  type SpanObserver interface {
  	OnSetOperationName(operationName string)
  	OnSetTag(key string, value interface{})
  	OnFinish(options opentracing.FinishOptions)
  }
  
  // compositeObserver is a dispatcher to other observers
  type compositeObserver struct {
  	observers []ContribObserver
  }
  
  // compositeSpanObserver is a dispatcher to other span observers
  type compositeSpanObserver struct {
  	observers []ContribSpanObserver
  }
  
  // noopSpanObserver is used when there are no observers registered
  // on the Tracer or none of them returns span observers from OnStartSpan.
  var noopSpanObserver = &compositeSpanObserver{}
  
  func (o *compositeObserver) append(contribObserver ContribObserver) {
  	o.observers = append(o.observers, contribObserver)
  }
  
  func (o *compositeObserver) OnStartSpan(sp opentracing.Span, operationName string, options opentracing.StartSpanOptions) ContribSpanObserver {
  	var spanObservers []ContribSpanObserver
  	for _, obs := range o.observers {
  		spanObs, ok := obs.OnStartSpan(sp, operationName, options)
  		if ok {
  			if spanObservers == nil {
  				spanObservers = make([]ContribSpanObserver, 0, len(o.observers))
  			}
  			spanObservers = append(spanObservers, spanObs)
  		}
  	}
  	if len(spanObservers) == 0 {
  		return noopSpanObserver
  	}
  	return &compositeSpanObserver{observers: spanObservers}
  }
  
  func (o *compositeSpanObserver) OnSetOperationName(operationName string) {
  	for _, obs := range o.observers {
  		obs.OnSetOperationName(operationName)
  	}
  }
  
  func (o *compositeSpanObserver) OnSetTag(key string, value interface{}) {
  	for _, obs := range o.observers {
  		obs.OnSetTag(key, value)
  	}
  }
  
  func (o *compositeSpanObserver) OnFinish(options opentracing.FinishOptions) {
  	for _, obs := range o.observers {
  		obs.OnFinish(options)
  	}
  }
  