Fix tracing listener on Windows

Signed-off-by: Gabriel Adrian Samfira <gsamfira@cloudbasesolutions.com>
This commit is contained in:
Gabriel Adrian Samfira
2023-01-28 17:04:43 -08:00
parent fd0c25c747
commit 7d6bee2627
6 changed files with 77 additions and 15 deletions

View File

@@ -630,7 +630,7 @@ func newController(c *cli.Context, cfg *config.Config) (*control.Controller, err
var traceSocket string
if tc != nil {
traceSocket = filepath.Join(cfg.Root, "otel-grpc.sock")
traceSocket = traceSocketPath(cfg.Root)
if err := runTraceController(traceSocket, tc); err != nil {
return nil, err
}
@@ -813,14 +813,9 @@ func parseBoolOrAuto(s string) (*bool, error) {
func runTraceController(p string, exp sdktrace.SpanExporter) error {
server := grpc.NewServer()
tracev1.RegisterTraceServiceServer(server, &traceCollector{exporter: exp})
uid := os.Getuid()
l, err := sys.GetLocalListener(p, uid, uid)
l, err := getLocalListener(p)
if err != nil {
return err
}
if err := os.Chmod(p, 0666); err != nil {
l.Close()
return err
return errors.Wrap(err, "creating trace controller listener")
}
go server.Serve(l)
return nil

View File

@@ -6,8 +6,11 @@ package main
import (
"crypto/tls"
"net"
"os"
"path/filepath"
"syscall"
"github.com/containerd/containerd/sys"
"github.com/coreos/go-systemd/v22/activation"
"github.com/pkg/errors"
)
@@ -43,3 +46,20 @@ func listenFD(addr string, tlsConfig *tls.Config) (net.Listener, error) {
//TODO: systemd fd selection (default is 3)
return nil, errors.New("not supported yet")
}
func traceSocketPath(root string) string {
return filepath.Join(root, "otel-grpc.sock")
}
func getLocalListener(listenerPath string) (net.Listener, error) {
uid := os.Getuid()
l, err := sys.GetLocalListener(listenerPath, uid, uid)
if err != nil {
return nil, err
}
if err := os.Chmod(listenerPath, 0666); err != nil {
l.Close()
return nil, err
}
return l, nil
}

View File

@@ -7,10 +7,36 @@ import (
"crypto/tls"
"net"
"github.com/Microsoft/go-winio"
_ "github.com/moby/buildkit/solver/llbsolver/ops"
"github.com/pkg/errors"
)
const (
defaultTraceSocketPath = `\\.\pipe\otel-grpc`
)
func listenFD(addr string, tlsConfig *tls.Config) (net.Listener, error) {
return nil, errors.New("listening server on fd not supported on windows")
}
func traceSocketPath(root string) string {
return defaultTraceSocketPath
}
func getLocalListener(listenerPath string) (net.Listener, error) {
pc := &winio.PipeConfig{
// Allow generic read and generic write access to authenticated users
// and system users. On Linux, this pipe seems to be given rw access to
// user, group and others (666).
// TODO(gabriel-samfira): should we restrict access to this pipe to just
// authenticated users? Or Administrators group?
SecurityDescriptor: "D:P(A;;GRGW;;;AU)(A;;GRGW;;;SY)",
}
listener, err := winio.ListenPipe(listenerPath, pc)
if err != nil {
return nil, errors.Wrap(err, "creating listener")
}
return listener, nil
}

View File

@@ -4,6 +4,7 @@ import (
"context"
"path"
"path/filepath"
"runtime"
"strings"
"sync"
@@ -112,7 +113,7 @@ func GenerateSpec(ctx context.Context, meta executor.Meta, mounts []executor.Mou
if tracingSocket != "" {
// https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/exporter.md
meta.Env = append(meta.Env, "OTEL_TRACES_EXPORTER=otlp", "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=unix:///dev/otel-grpc.sock", "OTEL_EXPORTER_OTLP_TRACES_PROTOCOL=grpc")
meta.Env = append(meta.Env, tracingEnvVars...)
meta.Env = append(meta.Env, traceexec.Environ(ctx)...)
}
@@ -183,12 +184,20 @@ func GenerateSpec(ctx context.Context, meta executor.Meta, mounts []executor.Mou
}
if tracingSocket != "" {
s.Mounts = append(s.Mounts, specs.Mount{
Destination: "/dev/otel-grpc.sock",
Type: "bind",
Source: tracingSocket,
Options: []string{"ro", "rbind"},
})
if runtime.GOOS == "windows" {
s.Mounts = append(s.Mounts, specs.Mount{
Destination: `\\.\pipe\otel-grpc`,
Source: tracingSocket,
Options: []string{"ro"},
})
} else {
s.Mounts = append(s.Mounts, specs.Mount{
Destination: "/dev/otel-grpc.sock",
Type: "bind",
Source: tracingSocket,
Options: []string{"ro", "rbind"},
})
}
}
s.Mounts = dedupMounts(s.Mounts)

View File

@@ -21,6 +21,12 @@ import (
"github.com/pkg/errors"
)
var tracingEnvVars = []string{
"OTEL_TRACES_EXPORTER=otlp",
"OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=unix:///dev/otel-grpc.sock",
"OTEL_EXPORTER_OTLP_TRACES_PROTOCOL=grpc",
}
func generateMountOpts(resolvConf, hostsFile string) ([]oci.SpecOpts, error) {
return []oci.SpecOpts{
// https://github.com/moby/buildkit/issues/429

View File

@@ -10,6 +10,12 @@ import (
"github.com/pkg/errors"
)
var tracingEnvVars = []string{
"OTEL_TRACES_EXPORTER=otlp",
"OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=npipe:////./pipe/otel-grpc",
"OTEL_EXPORTER_OTLP_TRACES_PROTOCOL=grpc",
}
func generateMountOpts(resolvConf, hostsFile string) ([]oci.SpecOpts, error) {
return nil, nil
}