Using unix domain sockets for docker syslog collector
This commit is contained in:
parent
a5d5919664
commit
b18cbaa416
|
@ -238,7 +238,7 @@ func (d *DockerDriver) createContainer(ctx *ExecContext, task *structs.Task,
|
|||
LogConfig: docker.LogConfig{
|
||||
Type: "syslog",
|
||||
Config: map[string]string{
|
||||
"syslog-address": fmt.Sprintf("tcp://%v", syslogAddr),
|
||||
"syslog-address": syslogAddr,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
|
|
@ -5,9 +5,12 @@ package logging
|
|||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"log/syslog"
|
||||
"net"
|
||||
"os"
|
||||
"runtime"
|
||||
|
||||
"github.com/hashicorp/nomad/client/allocdir"
|
||||
cstructs "github.com/hashicorp/nomad/client/driver/structs"
|
||||
|
@ -105,7 +108,8 @@ func (s *SyslogCollector) LaunchCollector(ctx *LogCollectorContext) (*SyslogColl
|
|||
s.lre = lre
|
||||
|
||||
go s.collectLogs(lre, lro)
|
||||
return &SyslogCollectorState{Addr: l.Addr().String()}, nil
|
||||
syslogAddr := fmt.Sprintf("%s://%s", l.Addr().Network(), l.Addr().String())
|
||||
return &SyslogCollectorState{Addr: syslogAddr}, nil
|
||||
}
|
||||
|
||||
func (s *SyslogCollector) collectLogs(we io.Writer, wo io.Writer) {
|
||||
|
@ -160,6 +164,16 @@ func (s *SyslogCollector) configureTaskDir() error {
|
|||
// getFreePort returns a free port ready to be listened on between upper and
|
||||
// lower bounds
|
||||
func (s *SyslogCollector) getListener(lowerBound uint, upperBound uint) (net.Listener, error) {
|
||||
if runtime.GOOS == "windows" {
|
||||
return s.listenerTCP(lowerBound, upperBound)
|
||||
}
|
||||
|
||||
return s.listenerUnix()
|
||||
}
|
||||
|
||||
// listenerTCP creates a TCP listener using an unused port between an upper and
|
||||
// lower bound
|
||||
func (s *SyslogCollector) listenerTCP(lowerBound uint, upperBound uint) (net.Listener, error) {
|
||||
for i := lowerBound; i <= upperBound; i++ {
|
||||
addr, err := net.ResolveTCPAddr("tcp", fmt.Sprintf("localhost:%v", i))
|
||||
if err != nil {
|
||||
|
@ -173,3 +187,21 @@ func (s *SyslogCollector) getListener(lowerBound uint, upperBound uint) (net.Lis
|
|||
}
|
||||
return nil, fmt.Errorf("No free port found")
|
||||
}
|
||||
|
||||
// listenerUnix creates a Unix domain socket
|
||||
func (s *SyslogCollector) listenerUnix() (net.Listener, error) {
|
||||
f, err := ioutil.TempFile("", "plugin")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
path := f.Name()
|
||||
|
||||
if err := f.Close(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := os.Remove(path); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return net.Listen("unix", path)
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@ import (
|
|||
"net"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
|
@ -260,9 +261,11 @@ func (a *Agent) setupClient() error {
|
|||
return fmt.Errorf("client setup failed: %v", err)
|
||||
}
|
||||
|
||||
// Reserve some ports for the plugins
|
||||
if err := a.reservePortsForClient(conf); err != nil {
|
||||
return err
|
||||
// Reserve some ports for the plugins if we are on Windows
|
||||
if runtime.GOOS == "windows" {
|
||||
if err := a.reservePortsForClient(conf); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// Create the client
|
||||
|
|
Loading…
Reference in a new issue