Page MenuHomePhabricator
Paste P17091

https://phabricator.wikimedia.org/T210137
ActivePublic

Authored by fgiunchedi on Aug 27 2021, 9:39 AM.
Tags
None
Referenced Files
F34621814: https://phabricator.wikimedia.org/T210137
Aug 27 2021, 9:39 AM
Subscribers
None
commit 98403f1c2411ce68fba449aad1d9bac3a6e9d1b9
Author: Filippo Giunchedi <filippo@wikimedia.org>
Date: Fri Aug 27 11:38:13 2021 +0200
Add omfwd support
Change-Id: I80d85d802ecbaef5ace30ba1c723f139302a7bcf
diff --git a/exporter.go b/exporter.go
index 5ee725c..c2a0630 100644
--- a/exporter.go
+++ b/exporter.go
@@ -22,6 +22,7 @@ const (
rsyslogDynStat
rsyslogDynafileCache
rsyslogInputIMDUP
+ rsyslogForward
)
type rsyslogExporter struct {
@@ -112,6 +113,14 @@ func (re *rsyslogExporter) handleStatLine(rawbuf []byte) error {
for _, p := range d.toPoints() {
re.set(p)
}
+ case rsyslogForward:
+ f, err := newForwardFromJSON(buf)
+ if err != nil {
+ return err
+ }
+ for _, p := range f.toPoints() {
+ re.set(p)
+ }
default:
return fmt.Errorf("unknown pstat type: %v", pstatType)
diff --git a/forward.go b/forward.go
new file mode 100644
index 0000000..557e6f3
--- /dev/null
+++ b/forward.go
@@ -0,0 +1,35 @@
+package main
+
+import (
+ "encoding/json"
+ "fmt"
+)
+
+type forward struct {
+ Name string `json:"name"`
+ BytesSent int64 `json:"bytes.sent"`
+}
+
+func newForwardFromJSON(b []byte) (*forward, error) {
+ var pstat forward
+ err := json.Unmarshal(b, &pstat)
+ if err != nil {
+ return nil, fmt.Errorf("failed to decode forward stat `%v`: %v", string(b), err)
+ }
+ return &pstat, nil
+}
+
+func (f *forward) toPoints() []*point {
+ points := make([]*point, 1)
+
+ points[0] = &point{
+ Name: "forward_bytes_total",
+ Type: counter,
+ Value: f.BytesSent,
+ Description: "bytes forwarded to destination",
+ LabelName: "destination",
+ LabelValue: f.Name,
+ }
+
+ return points
+}
diff --git a/forward_test.go b/forward_test.go
new file mode 100644
index 0000000..62acb6f
--- /dev/null
+++ b/forward_test.go
@@ -0,0 +1,52 @@
+package main
+
+import "testing"
+
+var (
+ forwardLog = []byte(`{ "name": "TCP-FQDN-6514", "origin": "omfwd", "bytes.sent": 666 }`)
+)
+
+func TestNewForwardFromJSON(t *testing.T) {
+ logType := getStatType(forwardLog)
+ if logType != rsyslogForward {
+ t.Errorf("detected pstat type should be %d but is %d", rsyslogAction, logType)
+ }
+
+ pstat, err := newForwardFromJSON([]byte(forwardLog))
+ if err != nil {
+ t.Fatalf("expected parsing action not to fail, got: %v", err)
+ }
+
+ if want, got := "TCP-FQDN-6514", pstat.Name; want != got {
+ t.Errorf("wanted '%s', got '%s'", want, got)
+ }
+
+ if want, got := int64(666), pstat.BytesSent; want != got {
+ t.Errorf("wanted '%d', got '%d'", want, got)
+ }
+}
+
+func TestForwardToPoints(t *testing.T) {
+ pstat, err := newForwardFromJSON([]byte(forwardLog))
+ if err != nil {
+ t.Fatalf("expected parsing action not to fail, got: %v", err)
+ }
+ points := pstat.toPoints()
+
+ point := points[0]
+ if want, got := "forward_bytes_total", point.Name; want != got {
+ t.Errorf("wanted '%s', got '%s'", want, got)
+ }
+
+ if want, got := int64(666), point.Value; want != got {
+ t.Errorf("wanted '%d', got '%d'", want, got)
+ }
+
+ if want, got := counter, point.Type; want != got {
+ t.Errorf("wanted '%d', got '%d'", want, got)
+ }
+
+ if want, got := "TCP-FQDN-6514", point.LabelValue; want != got {
+ t.Errorf("wanted '%s', got '%s'", want, got)
+ }
+}
diff --git a/utils.go b/utils.go
index 1cd38e8..624fd28 100644
--- a/utils.go
+++ b/utils.go
@@ -18,6 +18,8 @@ func getStatType(buf []byte) rsyslogType {
return rsyslogDynStat
} else if strings.Contains(line, "dynafile cache") {
return rsyslogDynafileCache
+ } else if strings.Contains(line, "omfwd") {
+ return rsyslogForward
}
return rsyslogUnknown
}