feat: adds the ability to define a port in the scrape target
This commit is contained in:
parent
10c99e8e59
commit
42756d7340
80
main.go
80
main.go
@ -5,6 +5,7 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
@ -101,11 +102,59 @@ type iperfResult struct {
|
|||||||
} `json:"end"`
|
} `json:"end"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func runIperf(ctx context.Context, target string, cmdArgs []string, logger zerolog.Logger) (iperfResult, error) {
|
type Target struct {
|
||||||
|
Host string
|
||||||
|
Port int
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
ErrEmptyTarget = errors.New("empty target")
|
||||||
|
ErrCouldNotDetermineTarget = errors.New("could not determine target")
|
||||||
|
)
|
||||||
|
|
||||||
|
func NewTarget(t string) (Target, error) {
|
||||||
|
targetParts := strings.Split(t, ":")
|
||||||
|
|
||||||
|
var trg Target
|
||||||
|
|
||||||
|
//nolint:gomnd
|
||||||
|
switch s := len(targetParts); {
|
||||||
|
case s > 2:
|
||||||
|
// http.Error(w, "could not determine host and port", http.StatusUnprocessableEntity)
|
||||||
|
return trg, ErrCouldNotDetermineTarget
|
||||||
|
case s == 2:
|
||||||
|
p, err := strconv.Atoi(targetParts[1])
|
||||||
|
if err != nil {
|
||||||
|
return trg, fmt.Errorf("could not convert port string to int: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
trg = Target{
|
||||||
|
Host: targetParts[0],
|
||||||
|
Port: p,
|
||||||
|
}
|
||||||
|
case s == 1:
|
||||||
|
// Using default port.
|
||||||
|
trg = Target{
|
||||||
|
Host: targetParts[0],
|
||||||
|
Port: 5201,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for empty struct.
|
||||||
|
if trg.Host == "" || trg.Port == 0 {
|
||||||
|
return Target{}, ErrEmptyTarget
|
||||||
|
}
|
||||||
|
|
||||||
|
return trg, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func runIperf(ctx context.Context, t Target, cmdArgs []string, logger zerolog.Logger) (iperfResult, error) {
|
||||||
args := []string{
|
args := []string{
|
||||||
"-J",
|
"-J",
|
||||||
"-c",
|
"-c",
|
||||||
target,
|
t.Host,
|
||||||
|
"-p",
|
||||||
|
fmt.Sprintf("%d", t.Port),
|
||||||
"-t", strconv.Itoa(c.Iperf3.Time),
|
"-t", strconv.Itoa(c.Iperf3.Time),
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,10 +187,10 @@ func runIperf(ctx context.Context, target string, cmdArgs []string, logger zerol
|
|||||||
return p, nil
|
return p, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func download(ctx context.Context, target string, logger zerolog.Logger) error {
|
func download(ctx context.Context, t Target, logger zerolog.Logger) error {
|
||||||
r, err := runIperf(
|
r, err := runIperf(
|
||||||
ctx,
|
ctx,
|
||||||
target,
|
t,
|
||||||
[]string{"-R"},
|
[]string{"-R"},
|
||||||
logger,
|
logger,
|
||||||
)
|
)
|
||||||
@ -160,10 +209,10 @@ func download(ctx context.Context, target string, logger zerolog.Logger) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func upload(ctx context.Context, target string, logger zerolog.Logger) error {
|
func upload(ctx context.Context, t Target, logger zerolog.Logger) error {
|
||||||
r, err := runIperf(
|
r, err := runIperf(
|
||||||
ctx,
|
ctx,
|
||||||
target,
|
t,
|
||||||
[]string{},
|
[]string{},
|
||||||
logger,
|
logger,
|
||||||
)
|
)
|
||||||
@ -186,23 +235,30 @@ func probeHandler(w http.ResponseWriter, r *http.Request) {
|
|||||||
logger := logginghandler.Logger(r)
|
logger := logginghandler.Logger(r)
|
||||||
|
|
||||||
// Extract target.
|
// Extract target.
|
||||||
target := r.URL.Query().Get("target")
|
trgt := r.URL.Query().Get("target")
|
||||||
|
|
||||||
if target == "" {
|
if trgt == "" {
|
||||||
logger.Error().Msg("could not find target in url params")
|
logger.Error().Msg("could not find target in url params")
|
||||||
http.Error(w, "could not find target in url params", http.StatusUnprocessableEntity)
|
http.Error(w, "could not find target in url params", http.StatusUnprocessableEntity)
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.Debug().Str("target", target).Msg("extracted target from url params")
|
logger.Debug().Str("trgt", trgt).Msg("extracted target from url params")
|
||||||
|
|
||||||
|
// Extract port and host for target.
|
||||||
|
t, err := NewTarget(trgt)
|
||||||
|
if err != nil {
|
||||||
|
logger.Error().Err(err).Msg("could not determine target")
|
||||||
|
http.Error(w, "could not determine target", http.StatusUnprocessableEntity)
|
||||||
|
}
|
||||||
|
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), c.Exporter.Timeout)
|
ctx, cancel := context.WithTimeout(context.Background(), c.Exporter.Timeout)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
logger.Info().Msg("getting download metrics")
|
logger.Info().Msg("getting download metrics")
|
||||||
|
|
||||||
if err := download(ctx, target, logger); err != nil {
|
if err := download(ctx, t, logger); err != nil {
|
||||||
logger.Error().Err(err).Msg("could not create download metrics")
|
logger.Error().Err(err).Msg("could not create download metrics")
|
||||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||||
|
|
||||||
@ -211,7 +267,7 @@ func probeHandler(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
logger.Info().Msg("getting upload metrics")
|
logger.Info().Msg("getting upload metrics")
|
||||||
|
|
||||||
if err := upload(ctx, target, logger); err != nil {
|
if err := upload(ctx, t, logger); err != nil {
|
||||||
logger.Error().Err(err).Msg("could not create upload metrics")
|
logger.Error().Err(err).Msg("could not create upload metrics")
|
||||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||||
|
|
||||||
@ -257,7 +313,7 @@ func init() { //nolint:gochecknoinits,funlen
|
|||||||
log.Fatal().Err(err).Msg("could not bind flag")
|
log.Fatal().Err(err).Msg("could not bind flag")
|
||||||
}
|
}
|
||||||
|
|
||||||
viper.SetDefault("exporter.processmetrics", true)
|
viper.SetDefault("exporter.process_metrics", true)
|
||||||
|
|
||||||
// Log.JSON.
|
// Log.JSON.
|
||||||
rootCmd.PersistentFlags().Bool("log-json", false, "JSON log output")
|
rootCmd.PersistentFlags().Bool("log-json", false, "JSON log output")
|
||||||
|
Loading…
Reference in New Issue
Block a user