diff --git a/.env b/.env new file mode 100644 index 0000000..ad2723a --- /dev/null +++ b/.env @@ -0,0 +1 @@ +COMPOSE_PROJECT_NAME=logvac diff --git a/.gitignore b/.gitignore index 0188506..9749a38 100644 --- a/.gitignore +++ b/.gitignore @@ -32,4 +32,5 @@ logvac.json *.cover* db vendor/*/ - +*.secret +dist diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..7127c79 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,19 @@ +FROM golang:1.10 + +RUN apt-get update && \ + apt-get install -y \ + # build tools, for compiling + build-essential \ + # install curl to fetch dev things + curl \ + # we'll need git for fetching golang deps + git \ + # we need aws-cli to publish + awscli + +# install dep (not using it yet, but probably will switch to it) +RUN curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh + +# setup the app dir/working directory +RUN mkdir -p /go/src/github.com/nanopack/logvac +WORKDIR /go/src/github.com/nanopack/logvac diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..7cf6d04 --- /dev/null +++ b/Makefile @@ -0,0 +1,14 @@ +.PHONY: build deps #release run test + +# directory to output build +DIST_DIR=./dist +# get the date and time to use as a buildstamp +DATE=$$(TZ=":US/Mountain" date '+%Y-%m-%d') +TIME=$$(TZ=":US/Mountain" date '+%I:%M:%S%p') +LDFLAGS="-s -w -X main.buildDate=$(DATE) -X main.buildTime=$(TIME)" + +build: + @go build --ldflags=$(LDFLAGS) -o $(DIST_DIR)/logvac main.go + +deps: + @go get -t -v ./... diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..20990c1 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,12 @@ +version: '3.1' + +services: + dev: + build: + context: . + dockerfile: Dockerfile + volumes: + - .:/go/src/github.com/nanopack/logvac + env_file: + - '.env' + - '.env.secret' diff --git a/drain/datadog.go b/drain/datadog.go index 6fc1438..6415ae7 100644 --- a/drain/datadog.go +++ b/drain/datadog.go @@ -1,74 +1,74 @@ package drain -import ( - "fmt" - "net" - "time" - - "github.com/DataDog/datadog-agent/pkg/logs/sender" - - "github.com/nanopack/logvac/core" -) - -// Datadog drain implements the publisher interface for publishing logs to datadog. -type Datadog struct { - connManager *sender.ConnectionManager - Conn net.Conn - Key string // datadog api key -} - -// NewDatadogClient creates a new mist publisher -func NewDatadogClient(key string) (*Datadog, error) { - _, err := net.ResolveTCPAddr("tcp", "intake.logs.datadoghq.com:10514") - if err != nil { - return nil, fmt.Errorf("Failed to resolve datadog address - %s", err.Error()) - } - - cm := sender.NewConnectionManager("intake.logs.datadoghq.com", 10514, true) - conn := cm.NewConnection() - - return &Datadog{Key: key, connManager: cm, Conn: conn}, nil -} - -// Init initializes a connection to mist -func (p Datadog) Init() error { - - // add drain - logvac.AddDrain("datadog", p.Publish) - - return nil -} - -// Publish utilizes mist's Publish to "drain" a log message -func (p *Datadog) Publish(msg logvac.Message) { - msg.PubTries++ - - if p.Conn == nil { - fmt.Println("Redialing datadog") - p.Conn = p.connManager.NewConnection() // doesn't block (don't goroutine call to Publish) - } - - var ms []byte - if len(msg.Raw) > 4 { - ms = append(append([]byte(p.Key+" "), msg.Raw[4:]...), []byte("\n")...) - } else { - ms = append(append([]byte(p.Key+" "), msg.Raw...), []byte("\n")...) - } - - _, err := p.Conn.Write(ms) - if err != nil { - fmt.Printf("Failed writing log - %s %d\n", err.Error(), msg.PubTries) - p.connManager.CloseConnection(p.Conn) - p.Conn = nil - if msg.PubTries <= 3 { - time.Sleep(2 * time.Second) - p.Publish(msg) - } - } -} - -// Close closes the connection to datadog. -func (p *Datadog) Close() error { - p.connManager.CloseConnection(p.Conn) - return nil -} +// import ( +// "fmt" +// "net" +// "time" +// +// "github.com/DataDog/datadog-agent/pkg/logs/sender" +// +// "github.com/nanopack/logvac/core" +// ) +// +// // Datadog drain implements the publisher interface for publishing logs to datadog. +// type Datadog struct { +// connManager *sender.ConnectionManager +// Conn net.Conn +// Key string // datadog api key +// } +// +// // NewDatadogClient creates a new mist publisher +// func NewDatadogClient(key string) (*Datadog, error) { +// _, err := net.ResolveTCPAddr("tcp", "intake.logs.datadoghq.com:10514") +// if err != nil { +// return nil, fmt.Errorf("Failed to resolve datadog address - %s", err.Error()) +// } +// +// cm := sender.NewConnectionManager("intake.logs.datadoghq.com", 10514, true) +// conn := cm.NewConnection() +// +// return &Datadog{Key: key, connManager: cm, Conn: conn}, nil +// } +// +// // Init initializes a connection to mist +// func (p Datadog) Init() error { +// +// // add drain +// logvac.AddDrain("datadog", p.Publish) +// +// return nil +// } +// +// // Publish utilizes mist's Publish to "drain" a log message +// func (p *Datadog) Publish(msg logvac.Message) { +// msg.PubTries++ +// +// if p.Conn == nil { +// fmt.Println("Redialing datadog") +// p.Conn = p.connManager.NewConnection() // doesn't block (don't goroutine call to Publish) +// } +// +// var ms []byte +// if len(msg.Raw) > 4 { +// ms = append(append([]byte(p.Key+" "), msg.Raw[4:]...), []byte("\n")...) +// } else { +// ms = append(append([]byte(p.Key+" "), msg.Raw...), []byte("\n")...) +// } +// +// _, err := p.Conn.Write(ms) +// if err != nil { +// fmt.Printf("Failed writing log - %s %d\n", err.Error(), msg.PubTries) +// p.connManager.CloseConnection(p.Conn) +// p.Conn = nil +// if msg.PubTries <= 3 { +// time.Sleep(2 * time.Second) +// p.Publish(msg) +// } +// } +// } +// +// // Close closes the connection to datadog. +// func (p *Datadog) Close() error { +// p.connManager.CloseConnection(p.Conn) +// return nil +// } diff --git a/drain/drain.go b/drain/drain.go index 524dad3..96c93f0 100644 --- a/drain/drain.go +++ b/drain/drain.go @@ -196,21 +196,21 @@ func AddDrain(d logvac.Drain) error { } drains["papertrail"] = pTrail drainCfg["papertrail"] = d - case "datadog": - // if it already exists, close it and create a new one - if _, ok := drains["datadog"]; ok { - drains["datadog"].Close() - } - dDog, err := NewDatadogClient(d.AuthKey) - if err != nil { - return fmt.Errorf("Failed to create datadog client - %s", err) - } - err = dDog.Init() - if err != nil { - return fmt.Errorf("Datadog failed to initialize - %s", err) - } - drains["datadog"] = dDog - drainCfg["datadog"] = d + // case "datadog": + // // if it already exists, close it and create a new one + // if _, ok := drains["datadog"]; ok { + // drains["datadog"].Close() + // } + // dDog, err := NewDatadogClient(d.AuthKey) + // if err != nil { + // return fmt.Errorf("Failed to create datadog client - %s", err) + // } + // err = dDog.Init() + // if err != nil { + // return fmt.Errorf("Datadog failed to initialize - %s", err) + // } + // drains["datadog"] = dDog + // drainCfg["datadog"] = d default: return fmt.Errorf("Drain type not supported") }