From bbd5bdda1ef20f95667c8fd54f0f92b0875ad15a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96rnfeldt=20Philip=20=2866140321=29?= Date: Tue, 12 Aug 2025 12:48:34 +0200 Subject: [PATCH 1/5] Central management status added MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Örnfeldt Philip (66140321) --- README.md | 68 +++++++------- pkg/probe/probe.go | 1 + pkg/probe/system_central_management.go | 89 +++++++++++++++++++ pkg/probe/system_central_management_test.go | 47 ++++++++++ .../system-central-management-status.jsonnet | 21 +++++ 5 files changed, 195 insertions(+), 31 deletions(-) create mode 100644 pkg/probe/system_central_management.go create mode 100644 pkg/probe/system_central_management_test.go create mode 100644 pkg/probe/testdata/system-central-management-status.jsonnet diff --git a/README.md b/README.md index 2b843beb..8d6afb1b 100755 --- a/README.md +++ b/README.md @@ -92,6 +92,10 @@ Per-VDOM: * _System/SDNConnector_ * `fortigate_system_sdn_connector_status` * `fortigate_system_sdn_connector_last_update_seconds` + * _/System/CentralManagement/Status_ + * `fortigate_system_central_management_mode` + * `fortigate_system_central_management_status` + * `fortigate_system_central_management_registration_status` * _User/Fsso_ * `fortigate_user_fsso_info` * _VPN/Ssl/Connections_ @@ -399,37 +403,39 @@ To improve security, limit permissions to required ones only (least privilege pr | probe name | permission | API URL | |---|---|---| -| *Default Global* | *any* |api/v2/monitor/system/status | -|BGP/NeighborPaths/IPv4 | netgrp.route-cfg |api/v2/monitor/router/bgp/paths | -|BGP/NeighborPaths/IPv6 | netgrp.route-cfg |api/v2/monitor/router/bgp/paths6 | -|BGP/Neighbors/IPv4 | netgrp.route-cfg |api/v2/monitor/router/bgp/neighbors | -|BGP/Neighbors/IPv6 | netgrp.route-cfg |api/v2/monitor/router/bgp/neighbors6 | -|Firewall/IpPool | fwgrp.policy |api/v2/monitor/firewall/ippool | -|Firewall/LoadBalance | fwgrp.others |api/v2/monitor/firewall/load-balance | -|Firewall/Policies | fwgrp.policy |api/v2/monitor/firewall/policy/select
api/v2/monitor/firewall/policy6/select
api/v2/cmdb/firewall/policy
api/v2/cmdb/firewall/policy6 | -|License/Status | *any* |api/v2/monitor/license/status/select | -|Log/Fortianalyzer/Status | loggrp.config |api/v2/monitor/log/fortianalyzer | -|Log/Fortianalyzer/Queue | loggrp.config |api/v2/monitor/log/fortianalyzer-queue | -|Log/DiskUsage | loggrp.config |api/v2/monitor/log/current-disk-usage | -|System/AvailableCertificates | *any* |api/v2/monitor/system/available-certificates | -|System/Fortimanager/Status | sysgrp.cfg |api/v2/monitor/system/fortimanager/status | -|System/HAStatistics | sysgrp.cfg |api/v2/monitor/system/ha-statistics
api/v2/cmdb/system/ha | -|System/Interface | netgrp.cfg |api/v2/monitor/system/interface/select | -|System/LinkMonitor | sysgrp.cfg |api/v2/monitor/system/link-monitor | -|System/Resource/Usage | sysgrp.cfg |api/v2/monitor/system/resource/usage | -|System/SensorInfo | sysgrp.cfg |api/v2/monitor/system/sensor-info | -|System/Status | *any* |api/v2/monitor/system/status | -|System/Time/Clock | sysgrp.cfg |api/v2/monitor/system/time | -|System/VDOMResources | sysgrp.cfg |api/v2/monitor/system/resource/usage | -|User/Fsso | authgrp |api/v2/monitor/user/fsso | -|VPN/IPSec | vpngrp |api/v2/monitor/vpn/ipsec | -|VPN/Ssl/Connections | vpngrp |api/v2/monitor/vpn/ssl | -|VPN/Ssl/Stats | vpngrp |api/v2/monitor/vpn/ssl/stats | -|VirtualWAN/HealthCheck | netgrp.cfg |api/v2/monitor/virtual-wan/health-check | -|Wifi/APStatus | wifi |api/v2/monitor/wifi/ap_status | -|Wifi/Clients | wifi |api/v2/monitor/wifi/client | -|Wifi/ManagedAP | wifi |api/v2/monitor/wifi/managed_ap | -|Switch/ManagedSwitch | switch |api/v2/monitor/switch-controller/managed-switch| +| *Default Global* | *any* |api/v2/monitor/system/status | +|BGP/NeighborPaths/IPv4 | netgrp.route-cfg |api/v2/monitor/router/bgp/paths | +|BGP/NeighborPaths/IPv6 | netgrp.route-cfg |api/v2/monitor/router/bgp/paths6 | +|BGP/Neighbors/IPv4 | netgrp.route-cfg |api/v2/monitor/router/bgp/neighbors | +|BGP/Neighbors/IPv6 | netgrp.route-cfg |api/v2/monitor/router/bgp/neighbors6 | +|Firewall/IpPool | fwgrp.policy |api/v2/monitor/firewall/ippool | +|Firewall/LoadBalance | fwgrp.others |api/v2/monitor/firewall/load-balance | +|Firewall/Policies | fwgrp.policy |api/v2/monitor/firewall/policy/select
api/v2/monitor/firewall/policy6/select
api/v2/cmdb/firewall/policy
api/v2/cmdb/firewall/policy6 | +|License/Status | *any* |api/v2/monitor/license/status/select | +|Log/Fortianalyzer/Status | loggrp.config |api/v2/monitor/log/fortianalyzer | +|Log/Fortianalyzer/Queue | loggrp.config |api/v2/monitor/log/fortianalyzer-queue | +|Log/DiskUsage | loggrp.config |api/v2/monitor/log/current-disk-usage | +|System/AvailableCertificates | *any* |api/v2/monitor/system/available-certificates | +|System/Central-management/Status | sysgrp.cfg |api/v2/monitor/system/central-management/status| +|System/Fortimanager/Status | sysgrp.cfg |api/v2/monitor/system/fortimanager/status | +|System/HAStatistics | sysgrp.cfg |api/v2/monitor/system/ha-statistics
api/v2/cmdb/system/ha | +|System/Interface | netgrp.cfg |api/v2/monitor/system/interface/select | +|System/LinkMonitor | sysgrp.cfg |api/v2/monitor/system/link-monitor | +|System/Performance/Status | sysgrp.cfg |api/v2/monitor/system/performance/status | +|System/Resource/Usage | sysgrp.cfg |api/v2/monitor/system/resource/usage | +|System/SensorInfo | sysgrp.cfg |api/v2/monitor/system/sensor-info | +|System/Status | *any* |api/v2/monitor/system/status | +|System/Time/Clock | sysgrp.cfg |api/v2/monitor/system/time | +|System/VDOMResources | sysgrp.cfg |api/v2/monitor/system/resource/usage | +|User/Fsso | authgrp |api/v2/monitor/user/fsso | +|VPN/IPSec | vpngrp |api/v2/monitor/vpn/ipsec | +|VPN/Ssl/Connections | vpngrp |api/v2/monitor/vpn/ssl | +|VPN/Ssl/Stats | vpngrp |api/v2/monitor/vpn/ssl/stats | +|VirtualWAN/HealthCheck | netgrp.cfg |api/v2/monitor/virtual-wan/health-check | +|Wifi/APStatus | wifi |api/v2/monitor/wifi/ap_status | +|Wifi/Clients | wifi |api/v2/monitor/wifi/client | +|Wifi/ManagedAP | wifi |api/v2/monitor/wifi/managed_ap | +|Switch/ManagedSwitch | switch |api/v2/monitor/switch-controller/managed-switch| If you omit to grant some of these permissions you will receive log messages warning about 403 errors and relevant metrics will be unavailable, but other metrics will still work. If you do not need some probes to be run, do not grant permission for them and use `include/exclude` feature (see `Usage` section). diff --git a/pkg/probe/probe.go b/pkg/probe/probe.go index 88d76fe6..3eb5e6b0 100644 --- a/pkg/probe/probe.go +++ b/pkg/probe/probe.go @@ -141,6 +141,7 @@ func (p *ProbeCollector) Probe(ctx context.Context, target map[string]string, hc {"Log/Fortianalyzer/Queue", probeLogAnalyzerQueue}, {"Log/DiskUsage", probeLogCurrentDiskUsage}, {"System/AvailableCertificates", probeSystemAvailableCertificates}, + {"System/Central-Management/Status", probeSystemCentralManagementStatus}, {"System/Fortimanager/Status", probeSystemFortimanagerStatus}, {"System/HAStatistics", probeSystemHAStatistics}, {"System/Interface", probeSystemInterface}, diff --git a/pkg/probe/system_central_management.go b/pkg/probe/system_central_management.go new file mode 100644 index 00000000..bb8af715 --- /dev/null +++ b/pkg/probe/system_central_management.go @@ -0,0 +1,89 @@ +// Copyright 2025 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package probe + +import ( + "log" + "strconv" + + "github.com/prometheus-community/fortigate_exporter/pkg/http" + "github.com/prometheus/client_golang/prometheus" +) + +func probeSystemCentralManagementStatus (c http.FortiHTTP, meta *TargetMetadata) ([]prometheus.Metric, bool) { + var ( + mode = prometheus.NewDesc( + "fortigate_system_central_management_mode", + "Operating mode of the central management. (Normal = 1, Backup = 2)", + []string{"server", "mgmt_ip", "mgmt_port", "sn", "pendfortman"}, nil, + ) + status = prometheus.NewDesc( + "fortigate_system_central_management_status", + "Status of the connection from FortiGate to the central management server. (down = 0, up = 1, handshake = 2)", + []string{"server", "mgmt_ip", "mgmt_port", "sn", "pendfortman"}, nil, + ) + registration_status = prometheus.NewDesc( + "fortigate_system_central_management_registration_status", + "Status of the registration from FortiGate to the central management server. (unknown = -1, in_progress = 1, registered = 0, unregistered = 2)", + []string{"server", "mgmt_ip", "mgmt_port", "sn", "pendfortman"}, nil, + ) + ) + + type centralManagementStatus struct { + Mode string `json:"mode"` + Server string `json:"server"` + Status string `json:"status"` + RegStat string `json:"registration_status"` + MgmtIp string `json:"mgmt_ip"` + MgmtPort float64 `json:"mgmt_port"` + Sn string `json:"sn"` + PenFortMan string `json:"pending_fortimanager"` + } + + type centralManagementStatusResult struct { + Result centralManagementStatus `json:"results"` + } + + var res centralManagementStatusResult + if err := c.Get("api/v2/monitor/system/central-management/status", "skip_detect=true", &res); err != nil { + log.Printf("Error: %v", err) + return nil, false + } + + m := []prometheus.Metric{} + if res.Result.Mode == "normal" { + m = append(m, prometheus.MustNewConstMetric(mode, prometheus.GaugeValue, 1, res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + } else { + m = append(m, prometheus.MustNewConstMetric(mode, prometheus.GaugeValue, 2, res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + } + switch res.Result.Status { + case "down": + m = append(m, prometheus.MustNewConstMetric(status, prometheus.GaugeValue, 0, res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + case "up": + m = append(m, prometheus.MustNewConstMetric(status, prometheus.GaugeValue, 1, res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + case "handshake": + m = append(m, prometheus.MustNewConstMetric(status, prometheus.GaugeValue, 2, res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + } + switch res.Result.RegStat { + case "in_progress": + m = append(m, prometheus.MustNewConstMetric(registration_status, prometheus.GaugeValue, 1, res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + case "registered": + m = append(m, prometheus.MustNewConstMetric(registration_status, prometheus.GaugeValue, 0, res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + case "unregistered": + m = append(m, prometheus.MustNewConstMetric(registration_status, prometheus.GaugeValue, 2, res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + default: + m = append(m, prometheus.MustNewConstMetric(registration_status, prometheus.GaugeValue, -1, res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + } + return m, true +} \ No newline at end of file diff --git a/pkg/probe/system_central_management_test.go b/pkg/probe/system_central_management_test.go new file mode 100644 index 00000000..9512962a --- /dev/null +++ b/pkg/probe/system_central_management_test.go @@ -0,0 +1,47 @@ +// Copyright 2025 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package probe + +import ( + "strings" + "testing" + + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/testutil" +) + +func TestSystemCentralManagementStatus(t *testing.T) { + c := newFakeClient() + c.prepare("api/v2/monitor/system/central-management/status", "testdata/system-central-management-status.jsonnet") + r := prometheus.NewPedanticRegistry() + if !testProbe(probeSystemCentralManagementStatus, c, r) { + t.Errorf("probeSystemCentralManagementStatus() returned non-success") + } + + em := ` + # HELP fortigate_system_central_management_mode Operating mode of the central management. (Normal = 1, Backup = 2) + # TYPE fortigate_system_central_management_mode gauge + fortigate_system_central_management_mode{mgmt_ip="127.0.0.1",mgmt_port="0",pendfortman="12.329845.45k3",server="HA-TEST",sn="121748"} 1 + # HELP fortigate_system_central_management_registration_status Status of the registration from FortiGate to the central management server. (unknown = -1, in_progress = 1, registered = 0, unregistered = 2) + # TYPE fortigate_system_central_management_registration_status gauge + fortigate_system_central_management_registration_status{mgmt_ip="127.0.0.1",mgmt_port="0",pendfortman="12.329845.45k3",server="HA-TEST",sn="121748"} -1 + # HELP fortigate_system_central_management_status Status of the connection from FortiGate to the central management server. (down = 0, up = 1, handshake = 2) + # TYPE fortigate_system_central_management_status gauge + fortigate_system_central_management_status{mgmt_ip="127.0.0.1",mgmt_port="0",pendfortman="12.329845.45k3",server="HA-TEST",sn="121748"} 0 + ` + + if err := testutil.GatherAndCompare(r, strings.NewReader(em)); err != nil { + t.Fatalf("metric compare: err %v", err) + } +} \ No newline at end of file diff --git a/pkg/probe/testdata/system-central-management-status.jsonnet b/pkg/probe/testdata/system-central-management-status.jsonnet new file mode 100644 index 00000000..35ddd606 --- /dev/null +++ b/pkg/probe/testdata/system-central-management-status.jsonnet @@ -0,0 +1,21 @@ +{ + "http_method":"GET", + "results":{ + "mode": "normal", + "server": "HA-TEST", + "status": "down", + "registration_status": "unknown", + "mgmt_ip": "127.0.0.1", + "mgmt_port": 0, + "sn": "121748", + "pending_fortimanager": "12.329845.45k3" + }, + "vdom":"root", + "path":"system", + "name":"fortimanager", + "action":"status", + "status":"success", + "serial":"FGT61FT000000000", + "version":"v6.0.10", + "build":365 +} \ No newline at end of file From af6e0f6a32192caef1cba4b6f40269d44fbd083a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96rnfeldt=20Philip=20=2866140321=29?= Date: Wed, 5 Nov 2025 11:02:05 +0100 Subject: [PATCH 2/5] Enum sets MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Örnfeldt Philip (66140321) --- pkg/probe/system_central_management.go | 12 ++++++------ pkg/probe/system_central_management_test.go | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pkg/probe/system_central_management.go b/pkg/probe/system_central_management.go index bb8af715..4ae4cf3a 100644 --- a/pkg/probe/system_central_management.go +++ b/pkg/probe/system_central_management.go @@ -25,7 +25,7 @@ func probeSystemCentralManagementStatus (c http.FortiHTTP, meta *TargetMetadata) var ( mode = prometheus.NewDesc( "fortigate_system_central_management_mode", - "Operating mode of the central management. (Normal = 1, Backup = 2)", + "Operating mode of the central management. (Normal = 1, Backup = 0)", []string{"server", "mgmt_ip", "mgmt_port", "sn", "pendfortman"}, nil, ) status = prometheus.NewDesc( @@ -35,7 +35,7 @@ func probeSystemCentralManagementStatus (c http.FortiHTTP, meta *TargetMetadata) ) registration_status = prometheus.NewDesc( "fortigate_system_central_management_registration_status", - "Status of the registration from FortiGate to the central management server. (unknown = -1, in_progress = 1, registered = 0, unregistered = 2)", + "Status of the registration from FortiGate to the central management server. (unknown = -1, in_progress = 2, registered = 1, unregistered = 0)", []string{"server", "mgmt_ip", "mgmt_port", "sn", "pendfortman"}, nil, ) ) @@ -65,7 +65,7 @@ func probeSystemCentralManagementStatus (c http.FortiHTTP, meta *TargetMetadata) if res.Result.Mode == "normal" { m = append(m, prometheus.MustNewConstMetric(mode, prometheus.GaugeValue, 1, res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) } else { - m = append(m, prometheus.MustNewConstMetric(mode, prometheus.GaugeValue, 2, res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + m = append(m, prometheus.MustNewConstMetric(mode, prometheus.GaugeValue, 0, res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) } switch res.Result.Status { case "down": @@ -77,11 +77,11 @@ func probeSystemCentralManagementStatus (c http.FortiHTTP, meta *TargetMetadata) } switch res.Result.RegStat { case "in_progress": - m = append(m, prometheus.MustNewConstMetric(registration_status, prometheus.GaugeValue, 1, res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + m = append(m, prometheus.MustNewConstMetric(registration_status, prometheus.GaugeValue, 2, res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) case "registered": - m = append(m, prometheus.MustNewConstMetric(registration_status, prometheus.GaugeValue, 0, res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + m = append(m, prometheus.MustNewConstMetric(registration_status, prometheus.GaugeValue, 1, res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) case "unregistered": - m = append(m, prometheus.MustNewConstMetric(registration_status, prometheus.GaugeValue, 2, res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + m = append(m, prometheus.MustNewConstMetric(registration_status, prometheus.GaugeValue, 0, res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) default: m = append(m, prometheus.MustNewConstMetric(registration_status, prometheus.GaugeValue, -1, res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) } diff --git a/pkg/probe/system_central_management_test.go b/pkg/probe/system_central_management_test.go index 9512962a..5867ed0b 100644 --- a/pkg/probe/system_central_management_test.go +++ b/pkg/probe/system_central_management_test.go @@ -30,10 +30,10 @@ func TestSystemCentralManagementStatus(t *testing.T) { } em := ` - # HELP fortigate_system_central_management_mode Operating mode of the central management. (Normal = 1, Backup = 2) + # HELP fortigate_system_central_management_mode Operating mode of the central management. (Normal = 1, Backup = 0) # TYPE fortigate_system_central_management_mode gauge fortigate_system_central_management_mode{mgmt_ip="127.0.0.1",mgmt_port="0",pendfortman="12.329845.45k3",server="HA-TEST",sn="121748"} 1 - # HELP fortigate_system_central_management_registration_status Status of the registration from FortiGate to the central management server. (unknown = -1, in_progress = 1, registered = 0, unregistered = 2) + # HELP fortigate_system_central_management_registration_status Status of the registration from FortiGate to the central management server. (unknown = -1, in_progress = 2, registered = 1, unregistered = 0) # TYPE fortigate_system_central_management_registration_status gauge fortigate_system_central_management_registration_status{mgmt_ip="127.0.0.1",mgmt_port="0",pendfortman="12.329845.45k3",server="HA-TEST",sn="121748"} -1 # HELP fortigate_system_central_management_status Status of the connection from FortiGate to the central management server. (down = 0, up = 1, handshake = 2) From 299d05b1e9afd850e9f4141be6e1a2996226024c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20=C3=96rnfeldt?= <1583206+Philldomd@users.noreply.github.com> Date: Tue, 11 Nov 2025 17:20:34 +0100 Subject: [PATCH 3/5] Update pkg/probe/system_central_management.go MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sorry missed that Co-authored-by: Ben Kochie Signed-off-by: Philip Örnfeldt <1583206+Philldomd@users.noreply.github.com> --- pkg/probe/system_central_management.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/probe/system_central_management.go b/pkg/probe/system_central_management.go index 4ae4cf3a..463105ef 100644 --- a/pkg/probe/system_central_management.go +++ b/pkg/probe/system_central_management.go @@ -33,7 +33,7 @@ func probeSystemCentralManagementStatus (c http.FortiHTTP, meta *TargetMetadata) "Status of the connection from FortiGate to the central management server. (down = 0, up = 1, handshake = 2)", []string{"server", "mgmt_ip", "mgmt_port", "sn", "pendfortman"}, nil, ) - registration_status = prometheus.NewDesc( + registrationStatus = prometheus.NewDesc( "fortigate_system_central_management_registration_status", "Status of the registration from FortiGate to the central management server. (unknown = -1, in_progress = 2, registered = 1, unregistered = 0)", []string{"server", "mgmt_ip", "mgmt_port", "sn", "pendfortman"}, nil, From 8bc89ce058f9af1a322c05dc41e77d0f19590fd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20=C3=96rnfeldt?= Date: Tue, 11 Nov 2025 21:21:49 +0100 Subject: [PATCH 4/5] Reworked metrics to fit state MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Philip Örnfeldt --- README.md | 64 ++++++++++----------- pkg/probe/system_central_management.go | 44 ++++++++------ pkg/probe/system_central_management_test.go | 27 +++++---- 3 files changed, 76 insertions(+), 59 deletions(-) mode change 100755 => 100644 README.md diff --git a/README.md b/README.md old mode 100755 new mode 100644 index 8d6afb1b..a3889d4d --- a/README.md +++ b/README.md @@ -403,39 +403,39 @@ To improve security, limit permissions to required ones only (least privilege pr | probe name | permission | API URL | |---|---|---| -| *Default Global* | *any* |api/v2/monitor/system/status | -|BGP/NeighborPaths/IPv4 | netgrp.route-cfg |api/v2/monitor/router/bgp/paths | -|BGP/NeighborPaths/IPv6 | netgrp.route-cfg |api/v2/monitor/router/bgp/paths6 | -|BGP/Neighbors/IPv4 | netgrp.route-cfg |api/v2/monitor/router/bgp/neighbors | -|BGP/Neighbors/IPv6 | netgrp.route-cfg |api/v2/monitor/router/bgp/neighbors6 | -|Firewall/IpPool | fwgrp.policy |api/v2/monitor/firewall/ippool | -|Firewall/LoadBalance | fwgrp.others |api/v2/monitor/firewall/load-balance | -|Firewall/Policies | fwgrp.policy |api/v2/monitor/firewall/policy/select
api/v2/monitor/firewall/policy6/select
api/v2/cmdb/firewall/policy
api/v2/cmdb/firewall/policy6 | -|License/Status | *any* |api/v2/monitor/license/status/select | -|Log/Fortianalyzer/Status | loggrp.config |api/v2/monitor/log/fortianalyzer | -|Log/Fortianalyzer/Queue | loggrp.config |api/v2/monitor/log/fortianalyzer-queue | -|Log/DiskUsage | loggrp.config |api/v2/monitor/log/current-disk-usage | -|System/AvailableCertificates | *any* |api/v2/monitor/system/available-certificates | +| *Default Global* | *any* |api/v2/monitor/system/status | +|BGP/NeighborPaths/IPv4 | netgrp.route-cfg |api/v2/monitor/router/bgp/paths | +|BGP/NeighborPaths/IPv6 | netgrp.route-cfg |api/v2/monitor/router/bgp/paths6 | +|BGP/Neighbors/IPv4 | netgrp.route-cfg |api/v2/monitor/router/bgp/neighbors | +|BGP/Neighbors/IPv6 | netgrp.route-cfg |api/v2/monitor/router/bgp/neighbors6 | +|Firewall/IpPool | fwgrp.policy |api/v2/monitor/firewall/ippool | +|Firewall/LoadBalance | fwgrp.others |api/v2/monitor/firewall/load-balance | +|Firewall/Policies | fwgrp.policy |api/v2/monitor/firewall/policy/select
api/v2/monitor/firewall/policy6/select
api/v2/cmdb/firewall/policy
api/v2/cmdb/firewall/policy6 | +|License/Status | *any* |api/v2/monitor/license/status/select | +|Log/Fortianalyzer/Status | loggrp.config |api/v2/monitor/log/fortianalyzer | +|Log/Fortianalyzer/Queue | loggrp.config |api/v2/monitor/log/fortianalyzer-queue | +|Log/DiskUsage | loggrp.config |api/v2/monitor/log/current-disk-usage | +|System/AvailableCertificates | *any* |api/v2/monitor/system/available-certificates | |System/Central-management/Status | sysgrp.cfg |api/v2/monitor/system/central-management/status| -|System/Fortimanager/Status | sysgrp.cfg |api/v2/monitor/system/fortimanager/status | -|System/HAStatistics | sysgrp.cfg |api/v2/monitor/system/ha-statistics
api/v2/cmdb/system/ha | -|System/Interface | netgrp.cfg |api/v2/monitor/system/interface/select | -|System/LinkMonitor | sysgrp.cfg |api/v2/monitor/system/link-monitor | -|System/Performance/Status | sysgrp.cfg |api/v2/monitor/system/performance/status | -|System/Resource/Usage | sysgrp.cfg |api/v2/monitor/system/resource/usage | -|System/SensorInfo | sysgrp.cfg |api/v2/monitor/system/sensor-info | -|System/Status | *any* |api/v2/monitor/system/status | -|System/Time/Clock | sysgrp.cfg |api/v2/monitor/system/time | -|System/VDOMResources | sysgrp.cfg |api/v2/monitor/system/resource/usage | -|User/Fsso | authgrp |api/v2/monitor/user/fsso | -|VPN/IPSec | vpngrp |api/v2/monitor/vpn/ipsec | -|VPN/Ssl/Connections | vpngrp |api/v2/monitor/vpn/ssl | -|VPN/Ssl/Stats | vpngrp |api/v2/monitor/vpn/ssl/stats | -|VirtualWAN/HealthCheck | netgrp.cfg |api/v2/monitor/virtual-wan/health-check | -|Wifi/APStatus | wifi |api/v2/monitor/wifi/ap_status | -|Wifi/Clients | wifi |api/v2/monitor/wifi/client | -|Wifi/ManagedAP | wifi |api/v2/monitor/wifi/managed_ap | -|Switch/ManagedSwitch | switch |api/v2/monitor/switch-controller/managed-switch| +|System/Fortimanager/Status | sysgrp.cfg |api/v2/monitor/system/fortimanager/status | +|System/HAStatistics | sysgrp.cfg |api/v2/monitor/system/ha-statistics
api/v2/cmdb/system/ha | +|System/Interface | netgrp.cfg |api/v2/monitor/system/interface/select | +|System/LinkMonitor | sysgrp.cfg |api/v2/monitor/system/link-monitor | +|System/Performance/Status | sysgrp.cfg |api/v2/monitor/system/performance/status | +|System/Resource/Usage | sysgrp.cfg |api/v2/monitor/system/resource/usage | +|System/SensorInfo | sysgrp.cfg |api/v2/monitor/system/sensor-info | +|System/Status | *any* |api/v2/monitor/system/status | +|System/Time/Clock | sysgrp.cfg |api/v2/monitor/system/time | +|System/VDOMResources | sysgrp.cfg |api/v2/monitor/system/resource/usage | +|User/Fsso | authgrp |api/v2/monitor/user/fsso | +|VPN/IPSec | vpngrp |api/v2/monitor/vpn/ipsec | +|VPN/Ssl/Connections | vpngrp |api/v2/monitor/vpn/ssl | +|VPN/Ssl/Stats | vpngrp |api/v2/monitor/vpn/ssl/stats | +|VirtualWAN/HealthCheck | netgrp.cfg |api/v2/monitor/virtual-wan/health-check | +|Wifi/APStatus | wifi |api/v2/monitor/wifi/ap_status | +|Wifi/Clients | wifi |api/v2/monitor/wifi/client | +|Wifi/ManagedAP | wifi |api/v2/monitor/wifi/managed_ap | +|Switch/ManagedSwitch | switch |api/v2/monitor/switch-controller/managed-switch| If you omit to grant some of these permissions you will receive log messages warning about 403 errors and relevant metrics will be unavailable, but other metrics will still work. If you do not need some probes to be run, do not grant permission for them and use `include/exclude` feature (see `Usage` section). diff --git a/pkg/probe/system_central_management.go b/pkg/probe/system_central_management.go index 463105ef..16e7573d 100644 --- a/pkg/probe/system_central_management.go +++ b/pkg/probe/system_central_management.go @@ -25,18 +25,18 @@ func probeSystemCentralManagementStatus (c http.FortiHTTP, meta *TargetMetadata) var ( mode = prometheus.NewDesc( "fortigate_system_central_management_mode", - "Operating mode of the central management. (Normal = 1, Backup = 0)", - []string{"server", "mgmt_ip", "mgmt_port", "sn", "pendfortman"}, nil, + "Operating mode of the central management.", + []string{"mode", "server", "mgmt_ip", "mgmt_port", "sn", "pendfortman"}, nil, ) status = prometheus.NewDesc( "fortigate_system_central_management_status", - "Status of the connection from FortiGate to the central management server. (down = 0, up = 1, handshake = 2)", - []string{"server", "mgmt_ip", "mgmt_port", "sn", "pendfortman"}, nil, + "Status of the connection from FortiGate to the central management server.", + []string{"status", "server", "mgmt_ip", "mgmt_port", "sn", "pendfortman"}, nil, ) registrationStatus = prometheus.NewDesc( "fortigate_system_central_management_registration_status", - "Status of the registration from FortiGate to the central management server. (unknown = -1, in_progress = 2, registered = 1, unregistered = 0)", - []string{"server", "mgmt_ip", "mgmt_port", "sn", "pendfortman"}, nil, + "Status of the registration from FortiGate to the central management server.", + []string{"status", "server", "mgmt_ip", "mgmt_port", "sn", "pendfortman"}, nil, ) ) @@ -62,28 +62,40 @@ func probeSystemCentralManagementStatus (c http.FortiHTTP, meta *TargetMetadata) } m := []prometheus.Metric{} - if res.Result.Mode == "normal" { - m = append(m, prometheus.MustNewConstMetric(mode, prometheus.GaugeValue, 1, res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + var normal, backup, down, up, handshake, inProgress, registered, unregistered, defaultValue float64 + if res.Result.Mode == "normal" { + normal = 1 } else { - m = append(m, prometheus.MustNewConstMetric(mode, prometheus.GaugeValue, 0, res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + backup = 1 } switch res.Result.Status { case "down": - m = append(m, prometheus.MustNewConstMetric(status, prometheus.GaugeValue, 0, res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + down = 1 case "up": - m = append(m, prometheus.MustNewConstMetric(status, prometheus.GaugeValue, 1, res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + up = 1 case "handshake": - m = append(m, prometheus.MustNewConstMetric(status, prometheus.GaugeValue, 2, res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + handshake = 1 } switch res.Result.RegStat { case "in_progress": - m = append(m, prometheus.MustNewConstMetric(registration_status, prometheus.GaugeValue, 2, res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + inProgress = 1 case "registered": - m = append(m, prometheus.MustNewConstMetric(registration_status, prometheus.GaugeValue, 1, res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + registered = 1 case "unregistered": - m = append(m, prometheus.MustNewConstMetric(registration_status, prometheus.GaugeValue, 0, res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + unregistered = 1 default: - m = append(m, prometheus.MustNewConstMetric(registration_status, prometheus.GaugeValue, -1, res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + defaultValue = 1 } + m = append(m, prometheus.MustNewConstMetric(mode, prometheus.GaugeValue, normal, "normal", res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + m = append(m, prometheus.MustNewConstMetric(mode, prometheus.GaugeValue, backup, "backup", res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + m = append(m, prometheus.MustNewConstMetric(status, prometheus.GaugeValue, down, "down", res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + m = append(m, prometheus.MustNewConstMetric(status, prometheus.GaugeValue, up, "up", res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + m = append(m, prometheus.MustNewConstMetric(status, prometheus.GaugeValue, handshake, "handshake", res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + m = append(m, prometheus.MustNewConstMetric(registrationStatus, prometheus.GaugeValue, inProgress, "inprogress", res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + m = append(m, prometheus.MustNewConstMetric(registrationStatus, prometheus.GaugeValue, registered, "registered", res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + m = append(m, prometheus.MustNewConstMetric(registrationStatus, prometheus.GaugeValue, unregistered, "unregistered", res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + m = append(m, prometheus.MustNewConstMetric(registrationStatus, prometheus.GaugeValue, defaultValue, "unknown", res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + + return m, true } \ No newline at end of file diff --git a/pkg/probe/system_central_management_test.go b/pkg/probe/system_central_management_test.go index 5867ed0b..13a53cef 100644 --- a/pkg/probe/system_central_management_test.go +++ b/pkg/probe/system_central_management_test.go @@ -29,17 +29,22 @@ func TestSystemCentralManagementStatus(t *testing.T) { t.Errorf("probeSystemCentralManagementStatus() returned non-success") } - em := ` - # HELP fortigate_system_central_management_mode Operating mode of the central management. (Normal = 1, Backup = 0) - # TYPE fortigate_system_central_management_mode gauge - fortigate_system_central_management_mode{mgmt_ip="127.0.0.1",mgmt_port="0",pendfortman="12.329845.45k3",server="HA-TEST",sn="121748"} 1 - # HELP fortigate_system_central_management_registration_status Status of the registration from FortiGate to the central management server. (unknown = -1, in_progress = 2, registered = 1, unregistered = 0) - # TYPE fortigate_system_central_management_registration_status gauge - fortigate_system_central_management_registration_status{mgmt_ip="127.0.0.1",mgmt_port="0",pendfortman="12.329845.45k3",server="HA-TEST",sn="121748"} -1 - # HELP fortigate_system_central_management_status Status of the connection from FortiGate to the central management server. (down = 0, up = 1, handshake = 2) - # TYPE fortigate_system_central_management_status gauge - fortigate_system_central_management_status{mgmt_ip="127.0.0.1",mgmt_port="0",pendfortman="12.329845.45k3",server="HA-TEST",sn="121748"} 0 - ` + em := `# HELP fortigate_system_central_management_mode Operating mode of the central management. +# TYPE fortigate_system_central_management_mode gauge +fortigate_system_central_management_mode{mgmt_ip="127.0.0.1",mgmt_port="0",mode="backup",pendfortman="12.329845.45k3",server="HA-TEST",sn="121748"} 0 +fortigate_system_central_management_mode{mgmt_ip="127.0.0.1",mgmt_port="0",mode="normal",pendfortman="12.329845.45k3",server="HA-TEST",sn="121748"} 1 +# HELP fortigate_system_central_management_registration_status Status of the registration from FortiGate to the central management server. +# TYPE fortigate_system_central_management_registration_status gauge +fortigate_system_central_management_registration_status{mgmt_ip="127.0.0.1",mgmt_port="0",pendfortman="12.329845.45k3",server="HA-TEST",sn="121748",status="inprogress"} 0 +fortigate_system_central_management_registration_status{mgmt_ip="127.0.0.1",mgmt_port="0",pendfortman="12.329845.45k3",server="HA-TEST",sn="121748",status="registered"} 0 +fortigate_system_central_management_registration_status{mgmt_ip="127.0.0.1",mgmt_port="0",pendfortman="12.329845.45k3",server="HA-TEST",sn="121748",status="unknown"} 1 +fortigate_system_central_management_registration_status{mgmt_ip="127.0.0.1",mgmt_port="0",pendfortman="12.329845.45k3",server="HA-TEST",sn="121748",status="unregistered"} 0 +# HELP fortigate_system_central_management_status Status of the connection from FortiGate to the central management server. +# TYPE fortigate_system_central_management_status gauge +fortigate_system_central_management_status{mgmt_ip="127.0.0.1",mgmt_port="0",pendfortman="12.329845.45k3",server="HA-TEST",sn="121748",status="down"} 1 +fortigate_system_central_management_status{mgmt_ip="127.0.0.1",mgmt_port="0",pendfortman="12.329845.45k3",server="HA-TEST",sn="121748",status="handshake"} 0 +fortigate_system_central_management_status{mgmt_ip="127.0.0.1",mgmt_port="0",pendfortman="12.329845.45k3",server="HA-TEST",sn="121748",status="up"} 0 +` if err := testutil.GatherAndCompare(r, strings.NewReader(em)); err != nil { t.Fatalf("metric compare: err %v", err) From fcc83dc15c328b4c9b73cf2f732ccb7e399cd929 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96rnfeldt=20Philip=20=2866140321=29?= Date: Thu, 13 Nov 2025 20:18:12 +0100 Subject: [PATCH 5/5] Lint MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Örnfeldt Philip (66140321) --- pkg/probe/probe.go | 2 +- pkg/probe/system_central_management.go | 32 +++++----- pkg/probe/system_central_management_test.go | 2 +- pkg/probe/system_vdom-resource.go | 66 ++++++++++----------- 4 files changed, 51 insertions(+), 51 deletions(-) diff --git a/pkg/probe/probe.go b/pkg/probe/probe.go index b6a23e02..31aecf1b 100644 --- a/pkg/probe/probe.go +++ b/pkg/probe/probe.go @@ -156,7 +156,7 @@ func (p *Collector) Probe(ctx context.Context, target map[string]string, hc *htt {"System/SDNConnector", probeSystemSDNConnector}, {"System/SensorInfo", probeSystemSensorInfo}, {"System/Status", probeSystemStatus}, - {"System/VDOMResource",probeSystemVdomResource}, + {"System/VDOMResource", probeSystemVdomResource}, {"System/HAChecksum", probeSystemHAChecksum}, {"User/Fsso", probeUserFsso}, {"VPN/IPSec", probeVPNIPSec}, diff --git a/pkg/probe/system_central_management.go b/pkg/probe/system_central_management.go index 16e7573d..b123d824 100644 --- a/pkg/probe/system_central_management.go +++ b/pkg/probe/system_central_management.go @@ -17,11 +17,12 @@ import ( "log" "strconv" - "github.com/prometheus-community/fortigate_exporter/pkg/http" "github.com/prometheus/client_golang/prometheus" + + "github.com/prometheus-community/fortigate_exporter/pkg/http" ) -func probeSystemCentralManagementStatus (c http.FortiHTTP, meta *TargetMetadata) ([]prometheus.Metric, bool) { +func probeSystemCentralManagementStatus(c http.FortiHTTP, _ *TargetMetadata) ([]prometheus.Metric, bool) { var ( mode = prometheus.NewDesc( "fortigate_system_central_management_mode", @@ -45,7 +46,7 @@ func probeSystemCentralManagementStatus (c http.FortiHTTP, meta *TargetMetadata) Server string `json:"server"` Status string `json:"status"` RegStat string `json:"registration_status"` - MgmtIp string `json:"mgmt_ip"` + MgmtIP string `json:"mgmt_ip"` MgmtPort float64 `json:"mgmt_port"` Sn string `json:"sn"` PenFortMan string `json:"pending_fortimanager"` @@ -62,7 +63,7 @@ func probeSystemCentralManagementStatus (c http.FortiHTTP, meta *TargetMetadata) } m := []prometheus.Metric{} - var normal, backup, down, up, handshake, inProgress, registered, unregistered, defaultValue float64 + var normal, backup, down, up, handshake, inProgress, registered, unregistered, defaultValue float64 if res.Result.Mode == "normal" { normal = 1 } else { @@ -86,16 +87,15 @@ func probeSystemCentralManagementStatus (c http.FortiHTTP, meta *TargetMetadata) default: defaultValue = 1 } - m = append(m, prometheus.MustNewConstMetric(mode, prometheus.GaugeValue, normal, "normal", res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) - m = append(m, prometheus.MustNewConstMetric(mode, prometheus.GaugeValue, backup, "backup", res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) - m = append(m, prometheus.MustNewConstMetric(status, prometheus.GaugeValue, down, "down", res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) - m = append(m, prometheus.MustNewConstMetric(status, prometheus.GaugeValue, up, "up", res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) - m = append(m, prometheus.MustNewConstMetric(status, prometheus.GaugeValue, handshake, "handshake", res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) - m = append(m, prometheus.MustNewConstMetric(registrationStatus, prometheus.GaugeValue, inProgress, "inprogress", res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) - m = append(m, prometheus.MustNewConstMetric(registrationStatus, prometheus.GaugeValue, registered, "registered", res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) - m = append(m, prometheus.MustNewConstMetric(registrationStatus, prometheus.GaugeValue, unregistered, "unregistered", res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) - m = append(m, prometheus.MustNewConstMetric(registrationStatus, prometheus.GaugeValue, defaultValue, "unknown", res.Result.Server, res.Result.MgmtIp, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) - - + m = append(m, prometheus.MustNewConstMetric(mode, prometheus.GaugeValue, normal, "normal", res.Result.Server, res.Result.MgmtIP, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + m = append(m, prometheus.MustNewConstMetric(mode, prometheus.GaugeValue, backup, "backup", res.Result.Server, res.Result.MgmtIP, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + m = append(m, prometheus.MustNewConstMetric(status, prometheus.GaugeValue, down, "down", res.Result.Server, res.Result.MgmtIP, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + m = append(m, prometheus.MustNewConstMetric(status, prometheus.GaugeValue, up, "up", res.Result.Server, res.Result.MgmtIP, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + m = append(m, prometheus.MustNewConstMetric(status, prometheus.GaugeValue, handshake, "handshake", res.Result.Server, res.Result.MgmtIP, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + m = append(m, prometheus.MustNewConstMetric(registrationStatus, prometheus.GaugeValue, inProgress, "inprogress", res.Result.Server, res.Result.MgmtIP, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + m = append(m, prometheus.MustNewConstMetric(registrationStatus, prometheus.GaugeValue, registered, "registered", res.Result.Server, res.Result.MgmtIP, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + m = append(m, prometheus.MustNewConstMetric(registrationStatus, prometheus.GaugeValue, unregistered, "unregistered", res.Result.Server, res.Result.MgmtIP, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + m = append(m, prometheus.MustNewConstMetric(registrationStatus, prometheus.GaugeValue, defaultValue, "unknown", res.Result.Server, res.Result.MgmtIP, strconv.FormatFloat(res.Result.MgmtPort, 'f', -1, 64), res.Result.Sn, res.Result.PenFortMan)) + return m, true -} \ No newline at end of file +} diff --git a/pkg/probe/system_central_management_test.go b/pkg/probe/system_central_management_test.go index 13a53cef..bf39286b 100644 --- a/pkg/probe/system_central_management_test.go +++ b/pkg/probe/system_central_management_test.go @@ -49,4 +49,4 @@ fortigate_system_central_management_status{mgmt_ip="127.0.0.1",mgmt_port="0",pen if err := testutil.GatherAndCompare(r, strings.NewReader(em)); err != nil { t.Fatalf("metric compare: err %v", err) } -} \ No newline at end of file +} diff --git a/pkg/probe/system_vdom-resource.go b/pkg/probe/system_vdom-resource.go index c955a61a..a37e76c9 100644 --- a/pkg/probe/system_vdom-resource.go +++ b/pkg/probe/system_vdom-resource.go @@ -16,12 +16,12 @@ package probe import ( "log" - "github.com/prometheus-community/fortigate_exporter/pkg/http" "github.com/prometheus/client_golang/prometheus" + + "github.com/prometheus-community/fortigate_exporter/pkg/http" ) -func probeSystemVdomResource(c http.FortiHTTP, meta *TargetMetadata) ([]prometheus.Metric, bool) { - +func probeSystemVdomResource(c http.FortiHTTP, _ *TargetMetadata) ([]prometheus.Metric, bool) { vdomDesc := make(map[string]*prometheus.Desc) vdomDesc["cpu"] = prometheus.NewDesc( "fortigate_vdom_resource_cpu_usage_ratio", @@ -46,12 +46,12 @@ func probeSystemVdomResource(c http.FortiHTTP, meta *TargetMetadata) ([]promethe vdomDesc["id"] = prometheus.NewDesc( "fortigate_vdom_resource_object_id", "Object Resource ID", - []string{"vdom", "object"},nil, + []string{"vdom", "object"}, nil, ) vdomDesc["custom_max"] = prometheus.NewDesc( "fortigate_vdom_resource_object_custom_max", "Object Custom Max", - []string{"vdom", "object"},nil, + []string{"vdom", "object"}, nil, ) vdomDesc["min_custom_value"] = prometheus.NewDesc( "fortigate_vdom_resource_object_custom_min_value", @@ -61,42 +61,42 @@ func probeSystemVdomResource(c http.FortiHTTP, meta *TargetMetadata) ([]promethe vdomDesc["max_custom_value"] = prometheus.NewDesc( "fortigate_vdom_resource_object_custom_max_value", "Object Maximum custom value", - []string{"vdom", "object"},nil, + []string{"vdom", "object"}, nil, ) vdomDesc["guaranteed"] = prometheus.NewDesc( "fortigate_vdom_resource_object_guaranteed", "Object Guaranteed", - []string{"vdom", "object"},nil, + []string{"vdom", "object"}, nil, ) vdomDesc["min_guaranteed_value"] = prometheus.NewDesc( "fortigate_vdom_resource_object_guaranteed_max_value", "Object Minimum guaranteed value", - []string{"vdom", "object"},nil, + []string{"vdom", "object"}, nil, ) vdomDesc["max_guaranteed_value"] = prometheus.NewDesc( "fortigate_vdom_resource_object_guaranteed_min_value", "Object Maximum guaranteed value", - []string{"vdom", "object"},nil, + []string{"vdom", "object"}, nil, ) vdomDesc["global_max"] = prometheus.NewDesc( "fortigate_vdom_resource_object_global_max", "Object Global max", - []string{"vdom", "object"},nil, + []string{"vdom", "object"}, nil, ) vdomDesc["current_usage"] = prometheus.NewDesc( "fortigate_vdom_resource_object_current_usage", "Object Current usage", - []string{"vdom", "object"},nil, + []string{"vdom", "object"}, nil, ) vdomDesc["usage_percent"] = prometheus.NewDesc( "fortigate_vdom_resource_object_usage_ratio", "Object Usage percentage", - []string{"vdom", "object"},nil, + []string{"vdom", "object"}, nil, ) type VDOMResourceResult struct { - Result interface{} `json:"results"` - Vdom string `json:"vdom"` + Result any `json:"results"` + Vdom string `json:"vdom"` } var res []VDOMResourceResult @@ -107,7 +107,7 @@ func probeSystemVdomResource(c http.FortiHTTP, meta *TargetMetadata) ([]promethe m := []prometheus.Metric{} for _, result := range res { - for k, elem := range result.Result.(map[string]interface{}) { + for k, elem := range result.Result.(map[string]any) { switch k { case "cpu", "memory", "setup_rate": m = append(m, prometheus.MustNewConstMetric(vdomDesc[k], prometheus.GaugeValue, elem.(float64), result.Vdom)) @@ -118,24 +118,24 @@ func probeSystemVdomResource(c http.FortiHTTP, meta *TargetMetadata) ([]promethe m = append(m, prometheus.MustNewConstMetric(vdomDesc[k], prometheus.GaugeValue, 0, result.Vdom)) } case "session", - "ipsec-phase1", - "ipsec-phase2", - "ipsec-phase1-interface", - "ipsec-phase2-interface", - "dialup-tunnel", - "firewall-policy", - "firewall-address", - "firewall-addrgrp", - "custom-service", - "service-group", - "onetime-schedule", - "recurring-schedule", - "user", - "user-group", - "sslvpn", - "proxy", - "log-disk-quota": - for val, e := range elem.(map[string]interface{}) { + "ipsec-phase1", + "ipsec-phase2", + "ipsec-phase1-interface", + "ipsec-phase2-interface", + "dialup-tunnel", + "firewall-policy", + "firewall-address", + "firewall-addrgrp", + "custom-service", + "service-group", + "onetime-schedule", + "recurring-schedule", + "user", + "user-group", + "sslvpn", + "proxy", + "log-disk-quota": + for val, e := range elem.(map[string]any) { m = append(m, prometheus.MustNewConstMetric(vdomDesc[val], prometheus.GaugeValue, e.(float64), result.Vdom, k)) } default: