trace

package module
v0.2.0 Latest Latest
Warning

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

Go to latest
Published: Jul 3, 2023 License: MIT Imports: 16 Imported by: 6

Documentation

Overview

Example
package main

import (
	"context"
	"log"
	"time"

	"github.com/Bofry/trace"
)

func main() {
	tp, err := trace.JaegerProvider("http://localhost:14268/api/traces",
		trace.ServiceName("trace-demo"),
		trace.Environment("go-test"),
		trace.Pid(),
	)
	if err != nil {
		log.Fatal(err)
	}

	// Register our TracerProvider as the global so any imported
	// instrumentation in the future will default to using it.
	trace.SetTracerProvider(tp)

	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()

	// Cleanly shutdown and flush telemetry when the application exits.
	defer func(ctx context.Context) {
		// Do not make the application hang when it is shutdown.
		ctx, cancel = context.WithTimeout(ctx, time.Second*5)
		defer cancel()
		if err := tp.Shutdown(ctx); err != nil {
			log.Fatal(err)
		}
	}(ctx)

	tr := tp.Tracer("example-main")

	sp := tr.Open(ctx, "example()")
	defer sp.End()

	sp.Info("example starting")
}
Output:

Index

Examples

Constants

View Source
const (
	// SpanKindUnspecified is an unspecified SpanKind and is not a valid
	// SpanKind. SpanKindUnspecified should be replaced with SpanKindInternal
	// if it is received.
	SpanKindUnspecified = trace.SpanKindUnspecified
	// SpanKindInternal is a SpanKind for a Span that represents an internal
	// operation within an application.
	SpanKindInternal = trace.SpanKindInternal
	// SpanKindServer is a SpanKind for a Span that represents the operation
	// of handling a request from a client.
	SpanKindServer = trace.SpanKindServer
	// SpanKindClient is a SpanKind for a Span that represents the operation
	// of client making a request to a server.
	SpanKindClient = trace.SpanKindClient
	// SpanKindProducer is a SpanKind for a Span that represents the operation
	// of a producer sending a message to a message broker. Unlike
	// SpanKindClient and SpanKindServer, there is often no direct
	// relationship between this kind of Span and a SpanKindConsumer kind. A
	// SpanKindProducer Span will end once the message is accepted by the
	// message broker which might not overlap with the processing of that
	// message.
	SpanKindProducer = trace.SpanKindProducer
	// SpanKindConsumer is a SpanKind for a Span that represents the operation
	// of a consumer receiving a message from a message broker. Like
	// SpanKindProducer Spans, there is often no direct relationship between
	// this Span and the Span that produced the message.
	SpanKindConsumer = trace.SpanKindConsumer
)
View Source
const (

	// FlagsSampled is a bitmask with the sampled bit set. A SpanContext
	// with the sampling bit set means the span is sampled.
	FlagsSampled = trace.FlagsSampled
)

Variables

This section is empty.

Functions

func ContextWithSpan

func ContextWithSpan(parent context.Context, span *SeveritySpan) context.Context

func GetTextMapPropagator

func GetTextMapPropagator() propagation.TextMapPropagator

func IsNoopSeveritySpan

func IsNoopSeveritySpan(span *SeveritySpan) bool

func IsOtelNoopSpan

func IsOtelNoopSpan(span trace.Span) bool

func OtelSpanFromSeveritySpan

func OtelSpanFromSeveritySpan(span *SeveritySpan) trace.Span

func OtelTracerFromTracer

func OtelTracerFromTracer(tr *SeverityTracer) trace.Tracer

func SetSpanExtractor

func SetSpanExtractor(extractor SpanExtractor)

func SetSpanInjector

func SetSpanInjector(injector SpanInjector)

func SetTextMapPropagator

func SetTextMapPropagator(propagator propagation.TextMapPropagator)

func SetTracerProvider

func SetTracerProvider(tp *SeverityTracerProvider)

func SpanToContext

func SpanToContext(ctx context.Context, span *SeveritySpan) context.Context

func WithInstrumentationVersion

func WithInstrumentationVersion(version string) trace.TracerOption
func WithLinks(links ...Link) trace.SpanStartOption

func WithNewRoot

func WithNewRoot() trace.SpanStartOption

func WithSchemaURL

func WithSchemaURL(schemaURL string) trace.TracerOption

func WithSpanKind

func WithSpanKind(kind SpanKind) trace.SpanStartOption

func WithStackTrace

func WithStackTrace(b bool) trace.SpanEndEventOption

Types

type CompositeSpanExtractor

type CompositeSpanExtractor []SpanExtractor

func NewCompositeSpanExtractor

func NewCompositeSpanExtractor(extractors ...SpanExtractor) CompositeSpanExtractor

func (CompositeSpanExtractor) Extract

Extract implements SpanExtractor

type Key

type Key = attribute.Key

type KeyValue

type KeyValue = attribute.KeyValue

func BrokerIP

func BrokerIP(v string) KeyValue

func ConsumerGroup

func ConsumerGroup(v string) KeyValue

func Environment

func Environment(v string) KeyValue

func Facility

func Facility(v string) KeyValue

func HttpMethod

func HttpMethod(v string) KeyValue

func HttpRequest

func HttpRequest(v string) KeyValue

func HttpRequestPath

func HttpRequestPath(v string) KeyValue

func HttpResponse

func HttpResponse(v string) KeyValue

func HttpStatusCode

func HttpStatusCode(v int) KeyValue

func HttpUserAgent

func HttpUserAgent(v string) KeyValue

func Infer

func Infer(name string, s interface{}) KeyValue

func MessageID

func MessageID(v string) KeyValue

func OS

func OS() KeyValue

func Pid

func Pid() KeyValue

func ServiceName

func ServiceName(v string) KeyValue

func Signature

func Signature(v string) KeyValue

func Stream

func Stream(v string) KeyValue

func Stringer

func Stringer(name string, o interface{}) KeyValue

func Topic

func Topic(v string) KeyValue

func Version

func Version(v string) KeyValue
type Link = trace.Link

type NoopSpanInjector

type NoopSpanInjector int

func (NoopSpanInjector) Inject

Inject implements SpanInjector.

type NopEvent

type NopEvent int

func (NopEvent) Error

func (NopEvent) Error(err error)

Error implements SpanEvent

func (NopEvent) Flush

func (NopEvent) Flush()

Flush implements SpanEvent

func (NopEvent) IsRecording

func (NopEvent) IsRecording() bool

IsRecording implements SpanEvent

func (NopEvent) Tags

func (NopEvent) Tags(tags ...KeyValue)

Tags implements SpanEvent

func (NopEvent) Vars

func (NopEvent) Vars(v interface{})

Vars implements SpanEvent

type ReplyCode

type ReplyCode string
const (
	PASS  ReplyCode = ReplyCode("pass")
	FAIL  ReplyCode = ReplyCode("fail")
	UNSET ReplyCode = ReplyCode("")
)

type Severity

type Severity int8

Severity

const (
	DEBUG  Severity = iota // severity : 0
	INFO                   // severity : 1
	NOTICE                 // severity : 2
	WARN                   // severity : 3
	ERR                    // severity : 4
	CRIT                   // severity : 5
	ALERT                  // severity : 6
	EMERG                  // severity : 7

	NONE Severity = -1
)

func ParseSeverity

func ParseSeverity(name string) Severity

func (Severity) IsValid

func (s Severity) IsValid() bool

func (Severity) Name

func (s Severity) Name() string

func (Severity) String

func (s Severity) String() string

func (Severity) Value

func (s Severity) Value() int

type SeverityEvent

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

func (*SeverityEvent) Error

func (s *SeverityEvent) Error(err error)

Error implements SpanEvent

func (*SeverityEvent) Flush

func (s *SeverityEvent) Flush()

Flush implements SpanEvent

func (*SeverityEvent) IsRecording

func (s *SeverityEvent) IsRecording() bool

IsRecording implements SpanEvent

func (*SeverityEvent) Tags

func (s *SeverityEvent) Tags(tags ...KeyValue)

Tags implements SpanEvent

func (*SeverityEvent) Vars

func (s *SeverityEvent) Vars(v interface{})

Vars implements SpanEvent

type SeveritySpan

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

func CreateSeveritySpan

func CreateSeveritySpan(ctx context.Context) *SeveritySpan

func SpanFromContext

func SpanFromContext(ctx context.Context, extractors ...SpanExtractor) *SeveritySpan

func (*SeveritySpan) Alert

func (s *SeveritySpan) Alert(reason string, v ...interface{}) SpanEvent

func (*SeveritySpan) Argv

func (s *SeveritySpan) Argv(v interface{})

func (*SeveritySpan) Context

func (s *SeveritySpan) Context() context.Context

func (*SeveritySpan) Crit

func (s *SeveritySpan) Crit(reason string, v ...interface{}) SpanEvent

func (*SeveritySpan) Debug

func (s *SeveritySpan) Debug(message string, v ...interface{}) SpanEvent

func (*SeveritySpan) Disable

func (s *SeveritySpan) Disable(disabled bool)

func (*SeveritySpan) Emerg

func (s *SeveritySpan) Emerg(reason string, v ...interface{}) SpanEvent

func (*SeveritySpan) End

func (s *SeveritySpan) End(opts ...trace.SpanEndOption)

func (*SeveritySpan) Err

func (s *SeveritySpan) Err(err error)

func (*SeveritySpan) HasSpanID

func (s *SeveritySpan) HasSpanID() bool

func (*SeveritySpan) HasTraceID

func (s *SeveritySpan) HasTraceID() bool

func (*SeveritySpan) Info

func (s *SeveritySpan) Info(message string, v ...interface{}) SpanEvent

func (*SeveritySpan) Inject

func (*SeveritySpan) IsDisabled

func (s *SeveritySpan) IsDisabled() bool
func (s *SeveritySpan) Link() Link

func (*SeveritySpan) Notice

func (s *SeveritySpan) Notice(message string, v ...interface{}) SpanEvent

func (*SeveritySpan) Reply

func (s *SeveritySpan) Reply(code ReplyCode, v interface{})

func (*SeveritySpan) SpanID

func (s *SeveritySpan) SpanID() trace.SpanID

func (*SeveritySpan) Tags

func (s *SeveritySpan) Tags(tags ...KeyValue)

func (*SeveritySpan) TraceFlags

func (s *SeveritySpan) TraceFlags() trace.TraceFlags

func (*SeveritySpan) TraceID

func (s *SeveritySpan) TraceID() trace.TraceID

func (*SeveritySpan) TraceState

func (s *SeveritySpan) TraceState() trace.TraceState

func (*SeveritySpan) Warning

func (s *SeveritySpan) Warning(reason string, v ...interface{}) SpanEvent

type SeverityTracer

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

func CreateSeverityTracer

func CreateSeverityTracer(tr trace.Tracer) *SeverityTracer

func Tracer

func Tracer(name string, opts ...trace.TracerOption) *SeverityTracer

func (*SeverityTracer) Extract

func (s *SeverityTracer) Extract(
	ctx context.Context,
	carrier propagation.TextMapCarrier,
	spanName string,
	opts ...trace.SpanStartOption) *SeveritySpan

func (*SeverityTracer) ExtractWithPropagator

func (s *SeverityTracer) ExtractWithPropagator(
	ctx context.Context,
	propagator propagation.TextMapPropagator,
	carrier propagation.TextMapCarrier,
	spanName string,
	opts ...trace.SpanStartOption) *SeveritySpan
Example
package main

import (
	"context"
	"log"
	"time"

	"github.com/Bofry/trace"
	"go.opentelemetry.io/otel/propagation"
)

func main() {
	tp, err := trace.JaegerProvider("http://localhost:14268/api/traces",
		trace.ServiceName("trace-demo"),
		trace.Environment("go-test"),
		trace.Pid(),
	)
	if err != nil {
		log.Fatal(err)
	}

	// Register our TracerProvider as the global so any imported
	// instrumentation in the future will default to using it.
	trace.SetTracerProvider(tp)

	trace.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(
		propagation.TraceContext{},
		propagation.Baggage{},
	))

	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()

	// Cleanly shutdown and flush telemetry when the application exits.
	defer func(ctx context.Context) {
		// Do not make the application hang when it is shutdown.
		ctx, cancel = context.WithTimeout(ctx, time.Second*10)
		defer cancel()
		if err := tp.Shutdown(ctx); err != nil {
			log.Fatal(err)
		}
	}(ctx)

	tr := tp.Tracer("example-main")

	sp := tr.Open(ctx, "example()")
	defer sp.End()

	sp.Info("example starting")

	// subroutine
	var bar = func(carrier propagation.TextMapCarrier, arg string) {
		bartp, err := trace.JaegerProvider("http://localhost:14268/api/traces",
			trace.ServiceName("trace-demo-outside-boundary"),
			trace.Environment("go-test"),
			trace.Pid(),
		)
		if err != nil {
			log.Fatal(err)
		}

		bartpctx, cancel := context.WithCancel(context.Background())
		defer cancel()

		// Cleanly shutdown and flush telemetry when the application exits.
		defer func(ctx context.Context) {
			// Do not make the application hang when it is shutdown.
			ctx, cancel = context.WithTimeout(ctx, time.Second*5)
			defer cancel()
			if err := bartp.Shutdown(ctx); err != nil {
				log.Fatal(err)
			}
		}(bartpctx)

		propagator := trace.GetTextMapPropagator()

		bartr := bartp.Tracer("example-bar")
		barctx := context.Background() // can use nil instead of context.Background()
		barsp := bartr.ExtractWithPropagator(barctx, propagator, carrier, "bar()")
		defer barsp.End()

		barsp.Argv(arg)
		barsp.Reply(trace.PASS, "OK")
	}

	/* NOTE: the following statements also can be written as
	 *
	 *  way 1:
	 *    carrier := make(propagation.MapCarrier)
	 *    propagator := trace.GetTextMapPropagator()
	 *    propagator.Inject(sp.Context(), carrier)
	 *
	 *  way 2:
	 *    carrier := make(propagation.MapCarrier)
	 *    propagator := trace.GetTextMapPropagator()
	 *    tr.InjectWithPropagator(sp.Context(), propagator, carrier)
	 *
	 *  way 3:
	 *    carrier := make(propagation.MapCarrier)
	 *    tr.Inject(sp.Context(), carrier)
	 */
	carrier := make(propagation.MapCarrier)
	propagator := trace.GetTextMapPropagator()
	sp.Inject(propagator, carrier)

	// call subroutine
	bar(carrier, "foo")
}
Output:

func (*SeverityTracer) Inject

func (s *SeverityTracer) Inject(
	ctx context.Context,
	carrier propagation.TextMapCarrier)

func (*SeverityTracer) InjectWithPropagator

func (s *SeverityTracer) InjectWithPropagator(
	ctx context.Context,
	propagator propagation.TextMapPropagator,
	carrier propagation.TextMapCarrier)
func (s *SeverityTracer) Link(
	ctx context.Context,
	link Link,
	spanName string,
	opts ...trace.SpanStartOption) *SeveritySpan

func (*SeverityTracer) Open

func (s *SeverityTracer) Open(
	ctx context.Context,
	spanName string,
	opts ...trace.SpanStartOption) *SeveritySpan

func (*SeverityTracer) Start

func (s *SeverityTracer) Start(
	ctx context.Context,
	spanName string,
	opts ...trace.SpanStartOption) *SeveritySpan
Example
package main

import (
	"context"
	"fmt"
	"log"
	"time"

	"github.com/Bofry/trace"
)

func main() {
	tp, err := trace.JaegerProvider("http://localhost:14268/api/traces",
		trace.ServiceName("trace-demo"),
		trace.Environment("go-test"),
		trace.Pid(),
	)
	if err != nil {
		log.Fatal(err)
	}

	// Register our TracerProvider as the global so any imported
	// instrumentation in the future will default to using it.
	trace.SetTracerProvider(tp)

	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()

	// Cleanly shutdown and flush telemetry when the application exits.
	defer func(ctx context.Context) {
		// Do not make the application hang when it is shutdown.
		ctx, cancel = context.WithTimeout(ctx, time.Second*5)
		defer cancel()
		if err := tp.Shutdown(ctx); err != nil {
			log.Fatal(err)
		}
	}(ctx)

	tr := tp.Tracer("example-main")

	sp := tr.Open(ctx, "example()")
	defer sp.End()

	sp.Info("example starting")

	// subroutine
	var bar = func(ctx context.Context, arg string) {
		barsp := tr.Start(ctx, "bar()")
		defer barsp.End()

		barsp.Argv(arg)
		barsp.Reply(trace.PASS, "OK")
	}

	ok := trace.IsNoopSeveritySpan(sp)
	sp.Debug("check IsNoopSeveritySpan()").Tags(
		trace.Key("IsNoopSeveritySpan").Bool(ok),
	)

	sp.Debug("log an error").Error(fmt.Errorf("some error"))

	// call subroutine
	bar(sp.Context(), "foo")
}
Output:

type SeverityTracerProvider

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

func CreateSeverityTracerProvider

func CreateSeverityTracerProvider(provider trace.TracerProvider) *SeverityTracerProvider

func GetTracerProvider

func GetTracerProvider() *SeverityTracerProvider

func JaegerProvider

func JaegerProvider(url string, attrs ...KeyValue) (*SeverityTracerProvider, error)

func NoopProvider

func NoopProvider() (*SeverityTracerProvider, error)

func (*SeverityTracerProvider) Shutdown

func (p *SeverityTracerProvider) Shutdown(ctx context.Context) error

func (*SeverityTracerProvider) Tracer

func (*SeverityTracerProvider) TracerProvider

func (p *SeverityTracerProvider) TracerProvider() trace.TracerProvider

type SpanEvent

type SpanEvent interface {
	IsRecording() bool
	Flush()
	Error(err error)
	Tags(tags ...KeyValue)
	Vars(v interface{})
}

type SpanExtractor

type SpanExtractor interface {
	Extract(ctx context.Context) *SeveritySpan
}

func GetSpanExtractor

func GetSpanExtractor() SpanExtractor

type SpanID

type SpanID = trace.SpanID

type SpanInjector

type SpanInjector interface {
	Inject(ctx context.Context, span *SeveritySpan) context.Context
}

func GetSpanInjector

func GetSpanInjector() SpanInjector

type SpanKind

type SpanKind = trace.SpanKind

type TraceFlags

type TraceFlags = trace.TraceFlags

type TraceID

type TraceID = trace.TraceID

type TracerTagBuilder

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

func (*TracerTagBuilder) Bool

func (builder *TracerTagBuilder) Bool(name string, v bool)

func (*TracerTagBuilder) BoolSlice

func (builder *TracerTagBuilder) BoolSlice(name string, v []bool)

func (*TracerTagBuilder) Float64

func (builder *TracerTagBuilder) Float64(name string, v float64)

func (*TracerTagBuilder) Float64Slice

func (builder *TracerTagBuilder) Float64Slice(name string, v []float64)

func (*TracerTagBuilder) Int

func (builder *TracerTagBuilder) Int(name string, v int)

func (*TracerTagBuilder) Int64

func (builder *TracerTagBuilder) Int64(name string, v int64)

func (*TracerTagBuilder) Int64Slice

func (builder *TracerTagBuilder) Int64Slice(name string, v []int64)

func (*TracerTagBuilder) IntSlice

func (builder *TracerTagBuilder) IntSlice(name string, v []int)

func (*TracerTagBuilder) Result

func (builder *TracerTagBuilder) Result() []KeyValue

func (*TracerTagBuilder) String

func (builder *TracerTagBuilder) String(name string, v string)

func (*TracerTagBuilder) StringSlice

func (builder *TracerTagBuilder) StringSlice(name string, v []string)

func (*TracerTagBuilder) Value

func (builder *TracerTagBuilder) Value(name string, v interface{})

type TracerTagMarshaler

type TracerTagMarshaler interface {
	MarshalTracerTag(builder *TracerTagBuilder) error
}

type ValueContext

type ValueContext interface {
	context.Context

	SetValue(key, value interface{})
}

type VarsBuilder

type VarsBuilder map[string]interface{}

func Argv

func Argv() VarsBuilder

func Vars

func Vars() VarsBuilder

func (VarsBuilder) Delete

func (b VarsBuilder) Delete(key string) VarsBuilder

func (VarsBuilder) MarshalTracerTag

func (b VarsBuilder) MarshalTracerTag(builder *TracerTagBuilder) error

func (VarsBuilder) Put

func (b VarsBuilder) Put(key string, value interface{}) VarsBuilder

func (VarsBuilder) Set

func (b VarsBuilder) Set(key string, value interface{}) VarsBuilder

Jump to

Keyboard shortcuts

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