Skip to content

Commit cba89cd

Browse files
committed
Merge branch 'main' into feature/rename-http-client-pkg
Signed-off-by: Örnfeldt Philip (66140321) <philip.ornfeldt@forsakringskassan.se>
2 parents af8098b + 8ffe94e commit cba89cd

21 files changed

+752
-30
lines changed

.github/workflows/golangci-lint.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ jobs:
2828
with:
2929
persist-credentials: false
3030
- name: Install Go
31-
uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0
31+
uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
3232
with:
3333
go-version: 1.25.x
3434
- name: Install snmp_exporter/generator dependencies

MAINTAINERS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
* Ben Kochie <superq@gmail.com> @SuperQ
2+
* Basti Schubert <basti@schubert.digital> @bastischubert

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ To improve security, limit permissions to required ones only (least privilege pr
178178
|System/AvailableCertificates | *any* |api/v2/monitor/system/available-certificates |
179179
|System/Central-management/Status | sysgrp.cfg |api/v2/monitor/system/central-management/status|
180180
|System/Fortimanager/Status | sysgrp.cfg |api/v2/monitor/system/fortimanager/status |
181+
|System/Global/Location | sysgrp.cfg |api/v2/cmdb/system/global |
181182
|System/HAStatistics | sysgrp.cfg |api/v2/monitor/system/ha-statistics<br>api/v2/cmdb/system/ha |
182183
|System/Ha-peer | sysgrp.cfg |api/v2/monitor/system/ha-peer |
183184
|System/Interface | netgrp.cfg |api/v2/monitor/system/interface/select |

metrics.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ Global:
44

55
* _Network/Dns/Latency_
66
* `fortigate_network_dns_latency_`
7+
* _System/Global/Location_
8+
* `fortigate_location_info`
79
* _System/SensorInfo_
810
* `fortigate_sensor_alarm_status`
911
* `fortigate_sensor_fan_rpm`
@@ -12,6 +14,7 @@ Global:
1214
* `fortigate_sensor_thresholds`
1315
* _System/Status_
1416
* `fortigate_version_info`
17+
* `fortigate_system_status_log_disk_state`
1518
* _System/Transceivers_
1619
* `fortigate_interface_transceivers`
1720
* _System/Time/Clock_
@@ -89,6 +92,7 @@ Per-VDOM:
8992
* _System/Interface/Transceivers_
9093
* `fortigate_inteface_transceivers_info`
9194
* _System/SDNConnector_
95+
* `fortigate_system_sdn_connector_state`
9296
* `fortigate_system_sdn_connector_status`
9397
* `fortigate_system_sdn_connector_last_update_seconds`
9498
* _/System/CentralManagement/Status_
@@ -178,8 +182,10 @@ Per-VDOM:
178182
Per-BGP-Neighbor and VDOM:
179183
* _BGP/Neighbors/IPv4_
180184
* `fortigate_bgp_neighbor_ipv4_info`
185+
* `fortigate_bgp_neighbor_ipv4_state`
181186
* _BGP/Neighbors/IPv6_
182187
* `fortigate_bgp_neighbor_ipv6_info`
188+
* `fortigate_bgp_neighbor_ipv6_state`
183189
* _BGP/NeighborPaths/IPv4_
184190
* `fortigate_bgp_neighbor_ipv4_paths`
185191
* `fortigate_bgp_neighbor_ipv4_best_paths`

pkg/probe/bgp_neighbors.go

Lines changed: 125 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,21 +22,21 @@ import (
2222
"github.com/prometheus-community/fortigate_exporter/pkg/fortigatehttpclient"
2323
)
2424

25-
type BGPNeighbor struct {
25+
type BGPNeighbor7_4 struct {
2626
NeighborIP string `json:"neighbor_ip"`
2727
LocalIP string `json:"local_ip"`
2828
RemoteAS int `json:"remote_as"`
2929
AdminStatus bool `json:"admin_status"`
3030
State string `json:"state"`
3131
}
3232

33-
type BGPNeighborResponse struct {
34-
Results []BGPNeighbor `json:"results"`
35-
VDOM string `json:"vdom"`
36-
Version string `json:"version"`
33+
type BGPNeighborResponse7_4 struct {
34+
Results []BGPNeighbor7_4 `json:"results"`
35+
VDOM string `json:"vdom"`
36+
Version string `json:"version"`
3737
}
3838

39-
func probeBGPNeighborsIPv4(c fortigatehttpclient.FortiHTTP, meta *TargetMetadata) ([]prometheus.Metric, bool) {
39+
func probeBGPNeighborsIPv47_4(c fortigatehttpclient.FortiHTTP, meta *TargetMetadata) ([]prometheus.Metric, bool) {
4040
if meta.VersionMajor < 7 {
4141
// not supported version. Before 7.0.0 the requested endpoint doesn't exist
4242
return nil, true
@@ -47,7 +47,7 @@ func probeBGPNeighborsIPv4(c fortigatehttpclient.FortiHTTP, meta *TargetMetadata
4747
[]string{"vdom", "remote_as", "state", "admin_status", "local_ip", "neighbor_ip"}, nil,
4848
)
4949

50-
var rs []BGPNeighborResponse
50+
var rs []BGPNeighborResponse7_4
5151

5252
if err := c.Get("api/v2/monitor/router/bgp/neighbors", "vdom=*", &rs); err != nil {
5353
log.Printf("Error: %v", err)
@@ -65,7 +65,7 @@ func probeBGPNeighborsIPv4(c fortigatehttpclient.FortiHTTP, meta *TargetMetadata
6565
return m, true
6666
}
6767

68-
func probeBGPNeighborsIPv6(c fortigatehttpclient.FortiHTTP, meta *TargetMetadata) ([]prometheus.Metric, bool) {
68+
func probeBGPNeighborsIPv67_4(c fortigatehttpclient.FortiHTTP, meta *TargetMetadata) ([]prometheus.Metric, bool) {
6969
if meta.VersionMajor < 7 {
7070
// not supported version. Before 7.0.0 the requested endpoint doesn't exist
7171
return nil, true
@@ -77,7 +77,7 @@ func probeBGPNeighborsIPv6(c fortigatehttpclient.FortiHTTP, meta *TargetMetadata
7777
[]string{"vdom", "remote_as", "state", "admin_status", "local_ip", "neighbor_ip"}, nil,
7878
)
7979

80-
var rs []BGPNeighborResponse
80+
var rs []BGPNeighborResponse7_4
8181

8282
if err := c.Get("api/v2/monitor/router/bgp/neighbors6", "vdom=*", &rs); err != nil {
8383
log.Printf("Error: %v", err)
@@ -113,3 +113,119 @@ func bgpStateToNumber(bgpState string) float64 {
113113
return 0
114114
}
115115
}
116+
117+
type BGPNeighbor struct {
118+
NeighborIP string `json:"neighbor_ip"`
119+
LocalIP string `json:"local_ip"`
120+
RemoteAS string `json:"remote_as"`
121+
AdminStatus bool `json:"admin_status"`
122+
State string `json:"state"`
123+
}
124+
125+
type BGPNeighborResponse struct {
126+
Results []BGPNeighbor `json:"results"`
127+
VDOM string `json:"vdom"`
128+
Version string `json:"version"`
129+
}
130+
131+
func probeBGPNeighborsIPv4(c fortigatehttpclient.FortiHTTP, meta *TargetMetadata) ([]prometheus.Metric, bool) {
132+
if meta.VersionMajor == 7 && meta.VersionMinor < 6 {
133+
return probeBGPNeighborsIPv47_4(c, meta)
134+
}
135+
136+
mBGPNeighborState := prometheus.NewDesc(
137+
"fortigate_bgp_neighbor_ipv4_state",
138+
"Configured bgp neighbor over ipv4 state",
139+
[]string{"vdom", "remote_as", "admin_status", "local_ip", "neighbor_ip", "state"}, nil,
140+
)
141+
142+
var rs []BGPNeighborResponse
143+
144+
if err := c.Get("api/v2/monitor/router/bgp/neighbors", "vdom=*", &rs); err != nil {
145+
log.Printf("Error: %v", err)
146+
return nil, false
147+
}
148+
149+
m := []prometheus.Metric{}
150+
151+
for _, r := range rs {
152+
for _, peer := range r.Results {
153+
t := []prometheus.Metric{
154+
prometheus.MustNewConstMetric(mBGPNeighborState, prometheus.GaugeValue, 0.0, r.VDOM, peer.RemoteAS, strconv.FormatBool(peer.AdminStatus), peer.LocalIP, peer.NeighborIP, "Idle"),
155+
prometheus.MustNewConstMetric(mBGPNeighborState, prometheus.GaugeValue, 0.0, r.VDOM, peer.RemoteAS, strconv.FormatBool(peer.AdminStatus), peer.LocalIP, peer.NeighborIP, "Connect"),
156+
prometheus.MustNewConstMetric(mBGPNeighborState, prometheus.GaugeValue, 0.0, r.VDOM, peer.RemoteAS, strconv.FormatBool(peer.AdminStatus), peer.LocalIP, peer.NeighborIP, "Active"),
157+
prometheus.MustNewConstMetric(mBGPNeighborState, prometheus.GaugeValue, 0.0, r.VDOM, peer.RemoteAS, strconv.FormatBool(peer.AdminStatus), peer.LocalIP, peer.NeighborIP, "Open sent"),
158+
prometheus.MustNewConstMetric(mBGPNeighborState, prometheus.GaugeValue, 0.0, r.VDOM, peer.RemoteAS, strconv.FormatBool(peer.AdminStatus), peer.LocalIP, peer.NeighborIP, "Open confirm"),
159+
prometheus.MustNewConstMetric(mBGPNeighborState, prometheus.GaugeValue, 0.0, r.VDOM, peer.RemoteAS, strconv.FormatBool(peer.AdminStatus), peer.LocalIP, peer.NeighborIP, "Established"),
160+
}
161+
switch peer.State {
162+
case "Idle":
163+
t[0] = prometheus.MustNewConstMetric(mBGPNeighborState, prometheus.GaugeValue, 1.0, r.VDOM, peer.RemoteAS, strconv.FormatBool(peer.AdminStatus), peer.LocalIP, peer.NeighborIP, peer.State)
164+
case "Connect":
165+
t[1] = prometheus.MustNewConstMetric(mBGPNeighborState, prometheus.GaugeValue, 1.0, r.VDOM, peer.RemoteAS, strconv.FormatBool(peer.AdminStatus), peer.LocalIP, peer.NeighborIP, peer.State)
166+
case "Active":
167+
t[2] = prometheus.MustNewConstMetric(mBGPNeighborState, prometheus.GaugeValue, 1.0, r.VDOM, peer.RemoteAS, strconv.FormatBool(peer.AdminStatus), peer.LocalIP, peer.NeighborIP, peer.State)
168+
case "Open sent":
169+
t[3] = prometheus.MustNewConstMetric(mBGPNeighborState, prometheus.GaugeValue, 1.0, r.VDOM, peer.RemoteAS, strconv.FormatBool(peer.AdminStatus), peer.LocalIP, peer.NeighborIP, peer.State)
170+
case "Open confirm":
171+
t[4] = prometheus.MustNewConstMetric(mBGPNeighborState, prometheus.GaugeValue, 1.0, r.VDOM, peer.RemoteAS, strconv.FormatBool(peer.AdminStatus), peer.LocalIP, peer.NeighborIP, peer.State)
172+
case "Established":
173+
t[5] = prometheus.MustNewConstMetric(mBGPNeighborState, prometheus.GaugeValue, 1.0, r.VDOM, peer.RemoteAS, strconv.FormatBool(peer.AdminStatus), peer.LocalIP, peer.NeighborIP, peer.State)
174+
}
175+
m = append(m, t...)
176+
}
177+
}
178+
179+
return m, true
180+
}
181+
182+
func probeBGPNeighborsIPv6(c fortigatehttpclient.FortiHTTP, meta *TargetMetadata) ([]prometheus.Metric, bool) {
183+
if meta.VersionMajor == 7 && meta.VersionMinor < 6 {
184+
return probeBGPNeighborsIPv67_4(c, meta)
185+
}
186+
187+
mBGPNeighborState := prometheus.NewDesc(
188+
"fortigate_bgp_neighbor_ipv6_state",
189+
"Configured bgp neighbor over ipv6 state",
190+
[]string{"vdom", "remote_as", "admin_status", "local_ip", "neighbor_ip", "state"}, nil,
191+
)
192+
193+
var rs []BGPNeighborResponse
194+
195+
if err := c.Get("api/v2/monitor/router/bgp/neighbors6", "vdom=*", &rs); err != nil {
196+
log.Printf("Error: %v", err)
197+
return nil, false
198+
}
199+
200+
m := []prometheus.Metric{}
201+
202+
for _, r := range rs {
203+
for _, peer := range r.Results {
204+
t := []prometheus.Metric{
205+
prometheus.MustNewConstMetric(mBGPNeighborState, prometheus.GaugeValue, 0.0, r.VDOM, peer.RemoteAS, strconv.FormatBool(peer.AdminStatus), peer.LocalIP, peer.NeighborIP, "Idle"),
206+
prometheus.MustNewConstMetric(mBGPNeighborState, prometheus.GaugeValue, 0.0, r.VDOM, peer.RemoteAS, strconv.FormatBool(peer.AdminStatus), peer.LocalIP, peer.NeighborIP, "Connect"),
207+
prometheus.MustNewConstMetric(mBGPNeighborState, prometheus.GaugeValue, 0.0, r.VDOM, peer.RemoteAS, strconv.FormatBool(peer.AdminStatus), peer.LocalIP, peer.NeighborIP, "Active"),
208+
prometheus.MustNewConstMetric(mBGPNeighborState, prometheus.GaugeValue, 0.0, r.VDOM, peer.RemoteAS, strconv.FormatBool(peer.AdminStatus), peer.LocalIP, peer.NeighborIP, "Open sent"),
209+
prometheus.MustNewConstMetric(mBGPNeighborState, prometheus.GaugeValue, 0.0, r.VDOM, peer.RemoteAS, strconv.FormatBool(peer.AdminStatus), peer.LocalIP, peer.NeighborIP, "Open confirm"),
210+
prometheus.MustNewConstMetric(mBGPNeighborState, prometheus.GaugeValue, 0.0, r.VDOM, peer.RemoteAS, strconv.FormatBool(peer.AdminStatus), peer.LocalIP, peer.NeighborIP, "Established"),
211+
}
212+
switch peer.State {
213+
case "Idle":
214+
t[0] = prometheus.MustNewConstMetric(mBGPNeighborState, prometheus.GaugeValue, 1.0, r.VDOM, peer.RemoteAS, strconv.FormatBool(peer.AdminStatus), peer.LocalIP, peer.NeighborIP, peer.State)
215+
case "Connect":
216+
t[1] = prometheus.MustNewConstMetric(mBGPNeighborState, prometheus.GaugeValue, 1.0, r.VDOM, peer.RemoteAS, strconv.FormatBool(peer.AdminStatus), peer.LocalIP, peer.NeighborIP, peer.State)
217+
case "Active":
218+
t[2] = prometheus.MustNewConstMetric(mBGPNeighborState, prometheus.GaugeValue, 1.0, r.VDOM, peer.RemoteAS, strconv.FormatBool(peer.AdminStatus), peer.LocalIP, peer.NeighborIP, peer.State)
219+
case "Open sent":
220+
t[3] = prometheus.MustNewConstMetric(mBGPNeighborState, prometheus.GaugeValue, 1.0, r.VDOM, peer.RemoteAS, strconv.FormatBool(peer.AdminStatus), peer.LocalIP, peer.NeighborIP, peer.State)
221+
case "Open confirm":
222+
t[4] = prometheus.MustNewConstMetric(mBGPNeighborState, prometheus.GaugeValue, 1.0, r.VDOM, peer.RemoteAS, strconv.FormatBool(peer.AdminStatus), peer.LocalIP, peer.NeighborIP, peer.State)
223+
case "Established":
224+
t[5] = prometheus.MustNewConstMetric(mBGPNeighborState, prometheus.GaugeValue, 1.0, r.VDOM, peer.RemoteAS, strconv.FormatBool(peer.AdminStatus), peer.LocalIP, peer.NeighborIP, peer.State)
225+
}
226+
m = append(m, t...)
227+
}
228+
}
229+
230+
return m, true
231+
}

0 commit comments

Comments
 (0)