Skip to content
Open
Show file tree
Hide file tree
Changes from 17 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 8 additions & 5 deletions .github/workflows/go.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,17 @@ jobs:
- uses: actions/checkout@v2

- name: Set up Go
uses: actions/setup-go@v2
uses: actions/setup-go@v6
with:
go-version: 1.15
go-version: 1.25

- name: Get tooling
- name: Install tooling
run: |
go get golang.org/x/lint/golint
go get honnef.co/go/tools/cmd/staticcheck
# Install analysis tools. staticcheck @latest for Go 1.24 compatibility.
go install honnef.co/go/tools/cmd/staticcheck@latest
# golint is deprecated; keep temporarily (will remove in follow-up)
go install golang.org/x/lint/golint@latest || echo "golint install failed (deprecated)"
echo "$(go env GOPATH)/bin" >> "$GITHUB_PATH"

- name: Build
run: go build -v -tags=gofuzz ./...
Expand Down
80 changes: 75 additions & 5 deletions cmd/openvswitch_exporter/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,27 @@
package main

import (
"context"
"flag"
"log"
"net/http"
"os"
"os/signal"
"syscall"
"time"

"github.com/digitalocean/go-openvswitch/ovsnl"
"github.com/digitalocean/openvswitch_exporter/internal/conntrack"
"github.com/digitalocean/openvswitch_exporter/internal/ovsexporter"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)

func main() {
var (
metricsAddr = flag.String("metrics.addr", ":9310", "address for Open vSwitch exporter")
metricsPath = flag.String("metrics.path", "/metrics", "URL path for surfacing collected metrics")
metricsAddr = flag.String("metrics.addr", ":9310", "address for Open vSwitch exporter")
metricsPath = flag.String("metrics.path", "/metrics", "URL path for surfacing collected metrics")
enableConntrack = flag.Bool("enable.conntrack", true, "enable conntrack metrics exporter")
)

flag.Parse()
Expand All @@ -32,15 +39,78 @@ func main() {
collector := ovsexporter.New(c)
prometheus.MustRegister(collector)

// Optionally register conntrack collector
var conntrackAggregator conntrack.MarkZoneAggregator
if *enableConntrack {
conntrackCollector, agg, err := conntrack.NewCollector()
if err != nil {
log.Printf("Warning: Failed to create conntrack collector: %v", err)
} else {
prometheus.MustRegister(conntrackCollector)
conntrackAggregator = agg
log.Printf("Conntrack metrics exporter enabled")
}
}

mux := http.NewServeMux()
mux.Handle(*metricsPath, promhttp.Handler())
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, *metricsPath, http.StatusMovedPermanently)
})

log.Printf("starting Open vSwitch exporter on %q", *metricsAddr)
// Create HTTP server
server := &http.Server{
Addr: *metricsAddr,
Handler: mux,
}

// Handle shutdown signals
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan,
syscall.SIGINT, // Ctrl+C
syscall.SIGTERM, // Termination request
syscall.SIGHUP, // Hang up (config reload)
syscall.SIGQUIT, // Quit signal
)

// Start server in goroutine
go func() {
log.Printf("starting Open vSwitch exporter on %q", *metricsAddr)
if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("cannot start Open vSwitch exporter: %v", err)
}
}()

// Wait for shutdown signal
sig := <-sigChan

if err := http.ListenAndServe(*metricsAddr, mux); err != nil {
log.Fatalf("cannot start Open vSwitch exporter: %v", err)
switch sig {
case syscall.SIGHUP:
log.Printf("Received SIGHUP, reloading config...")
// TODO: Add config reload logic here
log.Printf("Config reloaded")
return

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if we're not going to support this now (which i don't think we really need to), let's just not handle SIGHUP

case syscall.SIGQUIT:

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

doesn't seem like we're actually treating SIGQUIT any differently than the other signals in practice

also, generally handling SIQQUIT gracefully is a bit weird. The Go runtime already does the "correct" thing , which is to dump a stack trace and exit.

let's remove handling for this, and just leave the standard SIGINT and SIGTERM for graceful termination

log.Printf("Received SIGQUIT, shutting down immediately...")
// Immediate shutdown for SIGQUIT
default:
log.Printf("Received signal %v, stopping gracefully...", sig)
}

// Graceful shutdown with 15 second timeout
ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second)
defer cancel()

if err := server.Shutdown(ctx); err != nil {
log.Printf("Server shutdown error: %v", err)
}

// Stop conntrack aggregator if it was enabled
if conntrackAggregator != nil {
if err := conntrackAggregator.Stop(); err != nil {
log.Printf("Conntrack aggregator shutdown error: %v", err)
}
}

log.Printf("Exporter stopped")
}
32 changes: 22 additions & 10 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,18 +1,30 @@
module github.com/digitalocean/openvswitch_exporter

go 1.15
go 1.25

require (
github.com/digitalocean/go-openvswitch v0.0.0-20201214180534-ce0f183468d8
github.com/google/go-cmp v0.5.4 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
github.com/mdlayher/netlink v1.3.2 // indirect
github.com/prometheus/client_golang v1.9.0
github.com/prometheus/common v0.17.0 // indirect
github.com/prometheus/procfs v0.6.0 // indirect
github.com/prometheus/prometheus v2.2.1-0.20180315085919-58e2a31db8de+incompatible
golang.org/x/net v0.0.0-20210222171744-9060382bd457 // indirect
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
golang.org/x/sys v0.0.0-20210223095934-7937bea0104d // indirect
google.golang.org/protobuf v1.25.0 // indirect
github.com/ti-mo/conntrack v0.6.0
github.com/ti-mo/netfilter v0.5.3
golang.org/x/sync v0.17.0
)

require (
github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.1.1 // indirect
github.com/golang/protobuf v1.4.3 // indirect
github.com/google/go-cmp v0.7.0 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
github.com/mdlayher/genetlink v1.3.2 // indirect
github.com/mdlayher/netlink v1.8.0 // indirect
github.com/mdlayher/socket v0.5.1 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/prometheus/client_model v0.2.0 // indirect
github.com/prometheus/common v0.15.0 // indirect
github.com/prometheus/procfs v0.2.0 // indirect
golang.org/x/net v0.46.0 // indirect
golang.org/x/sys v0.37.0 // indirect
google.golang.org/protobuf v1.23.0 // indirect
)
Loading