-
Notifications
You must be signed in to change notification settings - Fork 10
GATEWAYS-4306: exporting metrics for conntrack per zone #21
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from 17 commits
16b12d1
f33d105
30b6d58
79cd030
f4b2a6b
b98892f
901ac81
a4ae2cd
836243b
ed8d851
78c7134
71644e4
b21f8d5
a33ec5d
8d4ce2d
f6ea39e
f67d1a8
6f7a802
4883f1e
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -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() | ||
|
|
@@ -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 | ||
|
||
| case syscall.SIGQUIT: | ||
|
||
| 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) | ||
| } | ||
| } | ||
shrouti1995 marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| log.Printf("Exporter stopped") | ||
| } | ||
| 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 | ||
| ) |
Uh oh!
There was an error while loading. Please reload this page.