module/apmot/context.go (43 lines of code) (raw):
// Licensed to Elasticsearch B.V. under one or more contributor
// license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright
// ownership. Elasticsearch B.V. licenses this file to you 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 apmot // import "go.elastic.co/apm/module/apmot/v2"
import (
"time"
opentracing "github.com/opentracing/opentracing-go"
"go.elastic.co/apm/v2"
)
type spanContext struct {
tracer *otTracer // for origin of tx/span
tx *apm.Transaction
traceContext apm.TraceContext
startTime time.Time
}
// TraceContext returns the trace context for the transaction or span
// associated with this span context.
func (s *spanContext) TraceContext() apm.TraceContext {
return s.traceContext
}
// Transaction returns the transaction associated with this span context.
func (s *spanContext) Transaction() *apm.Transaction {
return s.tx
}
// ForeachBaggageItem is a no-op; we do not support baggage propagation.
func (*spanContext) ForeachBaggageItem(handler func(k, v string) bool) {}
func (t *otTracer) parentSpanContext(refs []opentracing.SpanReference) (*spanContext, bool) {
for _, ref := range refs {
if !t.isValidSpanRef(ref) {
continue
}
if ctx, ok := ref.ReferencedContext.(*spanContext); ok {
return ctx, ok
}
if apmSpanContext, ok := ref.ReferencedContext.(interface {
Transaction() *apm.Transaction
TraceContext() apm.TraceContext
}); ok {
// The span context is (probably) one of the
// native Elastic APM span/transaction wrapper
// types. Synthesize a spanContext so we can
// automatically correlate the events created
// through our native API and the OpenTracing API.
spanContext := &spanContext{
tx: apmSpanContext.Transaction(),
traceContext: apmSpanContext.TraceContext(),
}
return spanContext, true
}
}
return nil, false
}
// NOTE(axw) we currently support only "child-of" span references, but we make
// it possible to override them using options in order to appease the OT test
// harness in one specific test case: TestStartSpanWithParent, which tests
// both child-of and follows-from.
func isChildOfSpanRef(ref opentracing.SpanReference) bool {
return ref.Type == opentracing.ChildOfRef
}