@@ -22,21 +22,21 @@ import (
2222 "github.com/prometheus-community/fortigate_exporter/pkg/http"
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 http.FortiHTTP , meta * TargetMetadata ) ([]prometheus.Metric , bool ) {
39+ func probeBGPNeighborsIPv47_4 (c http.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 http.FortiHTTP, meta *TargetMetadata) ([]prometheus
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 http.FortiHTTP, meta *TargetMetadata) ([]prometheus
6565 return m , true
6666}
6767
68- func probeBGPNeighborsIPv6 (c http.FortiHTTP , meta * TargetMetadata ) ([]prometheus.Metric , bool ) {
68+ func probeBGPNeighborsIPv67_4 (c http.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 http.FortiHTTP, meta *TargetMetadata) ([]prometheus
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 http.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 http.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