master
go 124 lines 3.25 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package portcheck
4
5 import (
6 "fmt"
7 "strconv"
8
9 "github.com/netdata/netdata/go/plugins/plugin/framework/collectorapi"
10 )
11
12 const (
13 prioCheckStatus = collectorapi.Priority + iota
14 prioCheckInStatusDuration
15 prioCheckLatency
16
17 prioUDPCheckStatus
18 prioUDPCheckInStatusDuration
19 )
20
21 var tcpPortChartsTmpl = collectorapi.Charts{
22 tcpPortCheckStatusChartTmpl.Copy(),
23 tcpPortCheckInStateDurationChartTmpl.Copy(),
24 tcpPortCheckConnectionLatencyChartTmpl.Copy(),
25 }
26
27 var udpPortChartsTmpl = collectorapi.Charts{
28 udpPortCheckStatusChartTmpl.Copy(),
29 udpPortCheckInStatusDurationChartTmpl.Copy(),
30 }
31
32 var (
33 tcpPortCheckStatusChartTmpl = collectorapi.Chart{
34 ID: "port_%d_status",
35 Title: "TCP Check Status",
36 Units: "boolean",
37 Fam: "status",
38 Ctx: "portcheck.status",
39 Priority: prioCheckStatus,
40 Dims: collectorapi.Dims{
41 {ID: "tcp_port_%d_success", Name: "success"},
42 {ID: "tcp_port_%d_failed", Name: "failed"},
43 {ID: "tcp_port_%d_timeout", Name: "timeout"},
44 },
45 }
46 tcpPortCheckInStateDurationChartTmpl = collectorapi.Chart{
47 ID: "port_%d_current_state_duration",
48 Title: "Current State Duration",
49 Units: "seconds",
50 Fam: "status duration",
51 Ctx: "portcheck.state_duration",
52 Priority: prioCheckInStatusDuration,
53 Dims: collectorapi.Dims{
54 {ID: "tcp_port_%d_current_state_duration", Name: "time"},
55 },
56 }
57 tcpPortCheckConnectionLatencyChartTmpl = collectorapi.Chart{
58 ID: "port_%d_connection_latency",
59 Title: "TCP Connection Latency",
60 Units: "ms",
61 Fam: "latency",
62 Ctx: "portcheck.latency",
63 Priority: prioCheckLatency,
64 Dims: collectorapi.Dims{
65 {ID: "tcp_port_%d_latency", Name: "time"},
66 },
67 }
68 )
69
70 var (
71 udpPortCheckStatusChartTmpl = collectorapi.Chart{
72 ID: "udp_port_%d_check_status",
73 Title: "UDP Port Check Status",
74 Units: "status",
75 Fam: "status",
76 Ctx: "portcheck.udp_port_status",
77 Priority: prioUDPCheckStatus,
78 Dims: collectorapi.Dims{
79 {ID: "udp_port_%d_open_filtered", Name: "open/filtered"},
80 {ID: "udp_port_%d_closed", Name: "closed"},
81 },
82 }
83 udpPortCheckInStatusDurationChartTmpl = collectorapi.Chart{
84 ID: "udp_port_%d_current_status_duration",
85 Title: "UDP Port Current Status Duration",
86 Units: "seconds",
87 Fam: "status duration",
88 Ctx: "portcheck.udp_port_status_duration",
89 Priority: prioUDPCheckInStatusDuration,
90 Dims: collectorapi.Dims{
91 {ID: "udp_port_%d_current_status_duration", Name: "time"},
92 },
93 }
94 )
95
96 func (c *Collector) addTCPPortCharts(port *tcpPort) {
97 charts := newPortCharts(c.Host, port.number, tcpPortChartsTmpl.Copy())
98
99 if err := c.Charts().Add(*charts...); err != nil {
100 c.Warning(err)
101 }
102 }
103
104 func (c *Collector) addUDPPortCharts(port *udpPort) {
105 charts := newPortCharts(c.Host, port.number, udpPortChartsTmpl.Copy())
106
107 if err := c.Charts().Add(*charts...); err != nil {
108 c.Warning(err)
109 }
110 }
111
112 func newPortCharts(host string, port int, charts *collectorapi.Charts) *collectorapi.Charts {
113 for _, chart := range *charts {
114 chart.Labels = []collectorapi.Label{
115 {Key: "host", Value: host},
116 {Key: "port", Value: strconv.Itoa(port)},
117 }
118 chart.ID = fmt.Sprintf(chart.ID, port)
119 for _, dim := range chart.Dims {
120 dim.ID = fmt.Sprintf(dim.ID, port)
121 }
122 }
123 return charts
124 }