Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
61 changes: 56 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,59 @@ func main() {
collector := ovsexporter.New(c)
prometheus.MustRegister(collector)

// Optionally register conntrack collector
if *enableConntrack {
conntrackCollector, conntrackAggregator, err := conntrack.NewCollector()
if err != nil {
log.Printf("Warning: Failed to create conntrack collector: %v", err)
} else {
prometheus.MustRegister(conntrackCollector)
defer func() {
if conntrackAggregator != nil {
if err := conntrackAggregator.Stop(); err != nil {
log.Printf("Conntrack aggregator shutdown error: %v", err)
}
}
}()
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, syscall.SIGTERM)

if err := http.ListenAndServe(*metricsAddr, mux); err != nil {
log.Fatalf("cannot start Open vSwitch exporter: %v", err)
// 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
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)
}

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