package resource
import (
"context"
"fmt"
"os"
"path/filepath"
"github.com/google/uuid"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/sdk"
semconv "go.opentelemetry.io/otel/semconv/v1.37.0"
)
type (
telemetrySDK struct {}
host struct {}
stringDetector struct {
schemaURL string
K attribute .Key
F func () (string , error )
}
defaultServiceNameDetector struct {}
defaultServiceInstanceIDDetector struct {}
)
var (
_ Detector = telemetrySDK {}
_ Detector = host {}
_ Detector = stringDetector {}
_ Detector = defaultServiceNameDetector {}
_ Detector = defaultServiceInstanceIDDetector {}
)
func (telemetrySDK ) Detect (context .Context ) (*Resource , error ) {
return NewWithAttributes (
semconv .SchemaURL ,
semconv .TelemetrySDKName ("opentelemetry" ),
semconv .TelemetrySDKLanguageGo ,
semconv .TelemetrySDKVersion (sdk .Version ()),
), nil
}
func (host ) Detect (ctx context .Context ) (*Resource , error ) {
return StringDetector (semconv .SchemaURL , semconv .HostNameKey , os .Hostname ).Detect (ctx )
}
func StringDetector (schemaURL string , k attribute .Key , f func () (string , error )) Detector {
return stringDetector {schemaURL : schemaURL , K : k , F : f }
}
func (sd stringDetector ) Detect (context .Context ) (*Resource , error ) {
value , err := sd .F ()
if err != nil {
return nil , fmt .Errorf ("%s: %w" , string (sd .K ), err )
}
a := sd .K .String (value )
if !a .Valid () {
return nil , fmt .Errorf ("invalid attribute: %q -> %q" , a .Key , a .Value .Emit ())
}
return NewWithAttributes (sd .schemaURL , sd .K .String (value )), nil
}
func (defaultServiceNameDetector ) Detect (ctx context .Context ) (*Resource , error ) {
return StringDetector (
semconv .SchemaURL ,
semconv .ServiceNameKey ,
func () (string , error ) {
executable , err := os .Executable ()
if err != nil {
return "unknown_service:go" , nil
}
return "unknown_service:" + filepath .Base (executable ), nil
},
).Detect (ctx )
}
func (defaultServiceInstanceIDDetector ) Detect (ctx context .Context ) (*Resource , error ) {
return StringDetector (
semconv .SchemaURL ,
semconv .ServiceInstanceIDKey ,
func () (string , error ) {
version4Uuid , err := uuid .NewRandom ()
if err != nil {
return "" , err
}
return version4Uuid .String (), nil
},
).Detect (ctx )
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .