Skip to content

Commit 62da407

Browse files
authored
feat(probe): status of SDN Connectors (#210)
* Adding functionality for querying the status of SDN Connectors
1 parent 22a6ee8 commit 62da407

File tree

5 files changed

+142
-0
lines changed

5 files changed

+142
-0
lines changed

Diff for: README.md

+3
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ Per-VDOM:
7575
* `fortigate_interface_receive_bytes_total`
7676
* `fortigate_interface_transmit_errors_total`
7777
* `fortigate_interface_receive_errors_total`
78+
* _System/SDNConnector_
79+
* `fortigate_system_sdn_connector_status`
80+
* `fortigate_system_sdn_connector_last_update_seconds`
7881
* _User/Fsso_
7982
* `fortigate_user_fsso_info`
8083
* _VPN/Ssl/Connections_

Diff for: pkg/probe/probe.go

+1
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ func (p *ProbeCollector) Probe(ctx context.Context, target map[string]string, hc
132132
{"System/Interface", probeSystemInterface},
133133
{"System/LinkMonitor", probeSystemLinkMonitor},
134134
{"System/Resource/Usage", probeSystemResourceUsage},
135+
{"System/SDNConnector", probeSystemSDNConnector},
135136
{"System/SensorInfo", probeSystemSensorInfo},
136137
{"System/Status", probeSystemStatus},
137138
{"System/VDOMResources", probeSystemVDOMResources},

Diff for: pkg/probe/system_sdn_connector.go

+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package probe
2+
3+
import (
4+
"log"
5+
6+
"github.com/bluecmd/fortigate_exporter/pkg/http"
7+
"github.com/prometheus/client_golang/prometheus"
8+
)
9+
10+
type SystemSDNConnectorResults struct {
11+
Name string `json:"name"`
12+
Type string `json:"type"`
13+
Status string `json:"status"`
14+
Updating bool `json:"updating"`
15+
LastUpdate int `json:"last_update"`
16+
}
17+
18+
type SystemSDNConnector struct {
19+
Results []SystemSDNConnectorResults `json:"results"`
20+
VDOM string `json:"vdom"`
21+
}
22+
23+
func probeSystemSDNConnector(c http.FortiHTTP, meta *TargetMetadata) ([]prometheus.Metric, bool) {
24+
var (
25+
SDNConnectorsStatus = prometheus.NewDesc(
26+
"fortigate_system_sdn_connector_status",
27+
"Status of SDN connectors (0=Disabled, 1=Down, 2=Unknown, 3=Up, 4=Updating)",
28+
[]string{"vdom", "name", "type"}, nil,
29+
)
30+
SDNConnectorsLastUpdate = prometheus.NewDesc(
31+
"fortigate_system_sdn_connector_last_update_seconds",
32+
"Last update time for SDN connectors (in seconds from epoch)",
33+
[]string{"vdom", "name", "type"}, nil,
34+
)
35+
)
36+
37+
var res []SystemSDNConnector
38+
if err := c.Get("api/v2/monitor/system/sdn-connector/status", "vdom=*", &res); err != nil {
39+
log.Printf("Error: %v", err)
40+
return nil, false
41+
}
42+
43+
m := []prometheus.Metric{}
44+
for _, r := range res {
45+
for _, sdnConn := range r.Results {
46+
if sdnConn.Status == "Disabled" {
47+
m = append(m, prometheus.MustNewConstMetric(SDNConnectorsStatus, prometheus.GaugeValue, float64(0), r.VDOM, sdnConn.Name, sdnConn.Type))
48+
} else if sdnConn.Status == "Down" {
49+
m = append(m, prometheus.MustNewConstMetric(SDNConnectorsStatus, prometheus.GaugeValue, float64(1), r.VDOM, sdnConn.Name, sdnConn.Type))
50+
} else if sdnConn.Status == "Unknown" {
51+
m = append(m, prometheus.MustNewConstMetric(SDNConnectorsStatus, prometheus.GaugeValue, float64(2), r.VDOM, sdnConn.Name, sdnConn.Type))
52+
} else if sdnConn.Status == "Up" {
53+
m = append(m, prometheus.MustNewConstMetric(SDNConnectorsStatus, prometheus.GaugeValue, float64(3), r.VDOM, sdnConn.Name, sdnConn.Type))
54+
} else if sdnConn.Status == "Updating" {
55+
m = append(m, prometheus.MustNewConstMetric(SDNConnectorsStatus, prometheus.GaugeValue, float64(4), r.VDOM, sdnConn.Name, sdnConn.Type))
56+
}
57+
m = append(m, prometheus.MustNewConstMetric(SDNConnectorsLastUpdate, prometheus.GaugeValue, float64(sdnConn.LastUpdate), r.VDOM, sdnConn.Name, sdnConn.Type))
58+
}
59+
}
60+
61+
return m, true
62+
}

Diff for: pkg/probe/system_sdn_connector_test.go

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package probe
2+
3+
import (
4+
"strings"
5+
"testing"
6+
7+
"github.com/prometheus/client_golang/prometheus"
8+
"github.com/prometheus/client_golang/prometheus/testutil"
9+
)
10+
11+
func TestSystemSDNConnector(t *testing.T) {
12+
c := newFakeClient()
13+
c.prepare("api/v2/monitor/system/sdn-connector/status", "testdata/system-sdn-connector.jsonnet")
14+
r := prometheus.NewPedanticRegistry()
15+
if !testProbe(probeSystemSDNConnector, c, r) {
16+
t.Errorf("probeSystemSDNConnector() returned non-success")
17+
}
18+
19+
em := `
20+
# HELP fortigate_system_sdn_connector_status Status of SDN connectors (0=Disabled, 1=Down, 2=Unknown, 3=Up, 4=Updating)
21+
# TYPE fortigate_system_sdn_connector_status gauge
22+
fortigate_system_sdn_connector_status{name="AWS Infra",type="aws",vdom="root"} 3
23+
fortigate_system_sdn_connector_status{name="GCP Infra",type="gcp",vdom="google"} 1
24+
# HELP fortigate_system_sdn_connector_last_update_seconds Last update time for SDN connectors (in seconds from epoch)
25+
# TYPE fortigate_system_sdn_connector_last_update_seconds gauge
26+
fortigate_system_sdn_connector_last_update_seconds{name="AWS Infra",type="aws",vdom="root"} 1680708575
27+
fortigate_system_sdn_connector_last_update_seconds{name="GCP Infra",type="gcp",vdom="google"} 1680708001
28+
`
29+
30+
if err := testutil.GatherAndCompare(r, strings.NewReader(em)); err != nil {
31+
t.Fatalf("metric compare: err %v", err)
32+
}
33+
}

Diff for: pkg/probe/testdata/system-sdn-connector.jsonnet

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# api/v2/system/sdn-connector/status?vdom=*
2+
[
3+
{
4+
"http_method":"GET",
5+
"results":[
6+
{
7+
"name":"AWS Infra",
8+
"type":"aws",
9+
"status":"Up",
10+
"updating":false,
11+
"last_update":1680708575
12+
}
13+
],
14+
"vdom":"root",
15+
"path":"system",
16+
"name":"sdn-connector",
17+
"action":"status",
18+
"status":"success",
19+
"serial":"FGABCDEF12345678",
20+
"version":"v7.0.9",
21+
"build":444
22+
},
23+
{
24+
"http_method":"GET",
25+
"results":[
26+
{
27+
"name":"GCP Infra",
28+
"type":"gcp",
29+
"status":"Down",
30+
"updating":false,
31+
"last_update":1680708001
32+
}
33+
],
34+
"vdom":"google",
35+
"path":"system",
36+
"name":"sdn-connector",
37+
"action":"status",
38+
"status":"success",
39+
"serial":"FGABCDEF12345678",
40+
"version":"v7.0.9",
41+
"build":444
42+
}
43+
]

0 commit comments

Comments
 (0)