123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- // Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
- //
- // This Source Code Form is subject to the terms of the MIT License.
- // If a copy of the MIT was not distributed with this file,
- // You can obtain one at https://github.com/gogf/gf.
- // Package gctx wraps context.Context and provides extra context features.
- package gctx
- import (
- "context"
- "os"
- "strings"
- "go.opentelemetry.io/otel"
- "go.opentelemetry.io/otel/propagation"
- "github.com/gogf/gf/v2/net/gtrace"
- )
- type (
- Ctx = context.Context // Ctx is short name alias for context.Context.
- StrKey string // StrKey is a type for warps basic type string as context key.
- )
- var (
- // initCtx is the context initialized from process environment.
- initCtx context.Context
- )
- func init() {
- // All environment key-value pairs.
- m := make(map[string]string)
- i := 0
- for _, s := range os.Environ() {
- i = strings.IndexByte(s, '=')
- if i == -1 {
- continue
- }
- m[s[0:i]] = s[i+1:]
- }
- // OpenTelemetry from environments.
- initCtx = otel.GetTextMapPropagator().Extract(
- context.Background(),
- propagation.MapCarrier(m),
- )
- initCtx = WithCtx(initCtx)
- }
- // New creates and returns a context which contains context id.
- func New() context.Context {
- return WithCtx(context.Background())
- }
- // WithCtx creates and returns a context containing context id upon given parent context `ctx`.
- func WithCtx(ctx context.Context) context.Context {
- if CtxId(ctx) != "" {
- return ctx
- }
- var span *gtrace.Span
- ctx, span = gtrace.NewSpan(ctx, "gctx.WithCtx")
- defer span.End()
- return ctx
- }
- // CtxId retrieves and returns the context id from context.
- func CtxId(ctx context.Context) string {
- return gtrace.GetTraceID(ctx)
- }
- // SetInitCtx sets custom initialization context.
- // Note that this function cannot be called in multiple goroutines.
- func SetInitCtx(ctx context.Context) {
- initCtx = ctx
- }
- // GetInitCtx returns the initialization context.
- // Initialization context is used in `main` or `init` functions.
- func GetInitCtx() context.Context {
- return initCtx
- }
|