Skip to content
Merged
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
4 changes: 0 additions & 4 deletions .dockerignore

This file was deleted.

63 changes: 0 additions & 63 deletions .github/workflows/docker.yml

This file was deleted.

32 changes: 0 additions & 32 deletions .github/workflows/go.yml

This file was deleted.

32 changes: 32 additions & 0 deletions .github/workflows/run-tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
name: run-tests

on:
push:
branches:
- main

pull_request:
branches:
- main

jobs:

run-tests:

runs-on: ubuntu-latest

permissions:
contents: read

steps:

- name: Checkout repository
uses: actions/checkout@v6

- name: Setup Go
uses: actions/setup-go@v6
with:
go-version: stable

- name: Run tests
run: go test -v ./...
38 changes: 0 additions & 38 deletions Dockerfile

This file was deleted.

2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
module netexp

go 1.21.4
go 1.25
9 changes: 6 additions & 3 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,14 @@ import (
"net/http"
"netexp/netdev"
"netexp/pipeline"
"netexp/rcu"
"os"
"time"
)

var (
version = "0.3.8"
metrics []byte
metrics rcu.RCU[[]byte]
listen string
getver bool
)
Expand Down Expand Up @@ -45,7 +46,7 @@ func serve() {
})

http.HandleFunc("/metrics", func(w http.ResponseWriter, r *http.Request) {
w.Write(metrics)
w.Write(*metrics.Load())
})

go func() {
Expand All @@ -72,7 +73,9 @@ func gather() {
panic(fmt.Errorf("could not get traffic: %w", err))
}

metrics = p.Step(recv, trns)
buf := p.Step(recv, trns)

metrics.Store(&buf)

time.Sleep(time.Second)
}
Expand Down
9 changes: 4 additions & 5 deletions pipeline/pipeline.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package pipeline

import (
"fmt"
"netexp/math"
"netexp/series"
)

Expand Down Expand Up @@ -53,8 +52,8 @@ func (p *Pipeline) Step(recv, trns int64) []byte {
for _, r := range p.ranges {
// Check if there exists enough sample data for the current duration range 'r'
if p.trns_series.Length() >= r+1 {
trns_rate := math.Rate(p.trns_series.Samples, r+1)
recv_rate := math.Rate(p.recv_series.Samples, r+1)
trns_rate := series.Rate(p.trns_series.Samples, r+1)
recv_rate := series.Rate(p.recv_series.Samples, r+1)

p.trns_rates_series[r].Record(trns_rate)
p.recv_rates_series[r].Record(recv_rate)
Expand All @@ -69,8 +68,8 @@ func (p *Pipeline) Step(recv, trns int64) []byte {
if m > r && p.trns_rates_series[r].Length() >= m {
trns_name := fmt.Sprintf("netexp_transmit_rate_%ds_max_%ds_bps", r, m)
recv_name := fmt.Sprintf("netexp_receive_rate_%ds_max_%ds_bps", r, m)
register(trns_name, math.Max(p.trns_rates_series[r].Samples, m))
register(recv_name, math.Max(p.recv_rates_series[r].Samples, m))
register(trns_name, series.Max(p.trns_rates_series[r].Samples, m))
register(recv_name, series.Max(p.recv_rates_series[r].Samples, m))
}
}
}
Expand Down
15 changes: 15 additions & 0 deletions rcu/rcu.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package rcu

import "sync/atomic"

type RCU[T any] struct {
p atomic.Pointer[T]
}

func (r *RCU[T]) Store(t *T) {
r.p.Store(t)
}

func (r *RCU[T]) Load() *T {
return r.p.Load()
}
2 changes: 1 addition & 1 deletion math/math.go → series/math.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package math
package series

func Max(series []int64, head int) int64 {
var max int64
Expand Down
8 changes: 4 additions & 4 deletions math/math_test.go → series/math_test.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package math_test
package series_test

import (
"netexp/math"
"netexp/series"
"strconv"
"testing"
)
Expand All @@ -20,7 +20,7 @@ func TestMax(t *testing.T) {

for i, tc := range tests {
t.Run(strconv.Itoa(i), func(t *testing.T) {
got := math.Max(tc.series, tc.head)
got := series.Max(tc.series, tc.head)
if got != tc.want {
t.Errorf("incorrect max; got %d want %d", got, tc.want)
}
Expand All @@ -42,7 +42,7 @@ func TestRate(t *testing.T) {

for i, tc := range tests {
t.Run(strconv.Itoa(i), func(t *testing.T) {
got := math.Rate(tc.series, tc.head)
got := series.Rate(tc.series, tc.head)
if got != tc.want {
t.Errorf("incorrect rate; got %d want %d", got, tc.want)
}
Expand Down
Loading