github.com/netdata/go.d.plugin@v0.58.1/modules/ntpd/charts.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package ntpd 4 5 import ( 6 "fmt" 7 "strings" 8 9 "github.com/netdata/go.d.plugin/agent/module" 10 ) 11 12 const ( 13 prioSystemOffset = module.Priority + iota 14 prioSystemJitter 15 prioSystemFrequency 16 prioSystemWander 17 prioSystemRootDelay 18 prioSystemRootDispersion 19 prioSystemStratum 20 prioSystemTimeConstant 21 prioSystemPrecision 22 23 prioPeerOffset 24 prioPeerDelay 25 prioPeerDispersion 26 prioPeerJitter 27 prioPeerXleave 28 prioPeerRootDelay 29 prioPeerRootDispersion 30 prioPeerStratum 31 prioPeerHostMode 32 prioPeerPeerMode 33 prioPeerHostPoll 34 prioPeerPeerPoll 35 prioPeerPrecision 36 ) 37 38 var ( 39 systemCharts = module.Charts{ 40 systemOffsetChart.Copy(), 41 systemJitterChart.Copy(), 42 systemFrequencyChart.Copy(), 43 systemWanderChart.Copy(), 44 systemRootDelayChart.Copy(), 45 systemRootDispersionChart.Copy(), 46 systemStratumChart.Copy(), 47 systemTimeConstantChart.Copy(), 48 systemPrecisionChart.Copy(), 49 } 50 systemOffsetChart = module.Chart{ 51 ID: "sys_offset", 52 Title: "Combined offset of server relative to this host", 53 Units: "milliseconds", 54 Fam: "system", 55 Ctx: "ntpd.sys_offset", 56 Type: module.Area, 57 Priority: prioSystemOffset, 58 Dims: module.Dims{ 59 {ID: "offset", Name: "offset", Div: precision}, 60 }, 61 } 62 systemJitterChart = module.Chart{ 63 ID: "sys_jitter", 64 Title: "Combined system jitter and clock jitter", 65 Units: "milliseconds", 66 Fam: "system", 67 Ctx: "ntpd.sys_jitter", 68 Priority: prioSystemJitter, 69 Dims: module.Dims{ 70 {ID: "sys_jitter", Name: "system", Div: precision}, 71 {ID: "clk_jitter", Name: "clock", Div: precision}, 72 }, 73 } 74 systemFrequencyChart = module.Chart{ 75 ID: "sys_frequency", 76 Title: "Frequency offset relative to hardware clock", 77 Units: "ppm", 78 Fam: "system", 79 Ctx: "ntpd.sys_frequency", 80 Type: module.Area, 81 Priority: prioSystemFrequency, 82 Dims: module.Dims{ 83 {ID: "frequency", Name: "frequency", Div: precision}, 84 }, 85 } 86 systemWanderChart = module.Chart{ 87 ID: "sys_wander", 88 Title: "Clock frequency wander", 89 Units: "ppm", 90 Fam: "system", 91 Ctx: "ntpd.sys_wander", 92 Type: module.Area, 93 Priority: prioSystemWander, 94 Dims: module.Dims{ 95 {ID: "clk_wander", Name: "clock", Div: precision}, 96 }, 97 } 98 systemRootDelayChart = module.Chart{ 99 ID: "sys_rootdelay", 100 Title: "Total roundtrip delay to the primary reference clock", 101 Units: "milliseconds", 102 Fam: "system", 103 Ctx: "ntpd.sys_rootdelay", 104 Type: module.Area, 105 Priority: prioSystemRootDelay, 106 Dims: module.Dims{ 107 {ID: "rootdelay", Name: "delay", Div: precision}, 108 }, 109 } 110 systemRootDispersionChart = module.Chart{ 111 ID: "sys_rootdisp", 112 Title: "Total root dispersion to the primary reference clock", 113 Units: "milliseconds", 114 Fam: "system", 115 Ctx: "ntpd.sys_rootdisp", 116 Type: module.Area, 117 Priority: prioSystemRootDispersion, 118 Dims: module.Dims{ 119 {ID: "rootdisp", Name: "dispersion", Div: precision}, 120 }, 121 } 122 systemStratumChart = module.Chart{ 123 ID: "sys_stratum", 124 Title: "Stratum", 125 Units: "stratum", 126 Fam: "system", 127 Ctx: "ntpd.sys_stratum", 128 Priority: prioSystemStratum, 129 Dims: module.Dims{ 130 {ID: "stratum", Name: "stratum", Div: precision}, 131 }, 132 } 133 systemTimeConstantChart = module.Chart{ 134 ID: "sys_tc", 135 Title: "Time constant and poll exponent", 136 Units: "log2", 137 Fam: "system", 138 Ctx: "ntpd.sys_tc", 139 Priority: prioSystemTimeConstant, 140 Dims: module.Dims{ 141 {ID: "tc", Name: "current", Div: precision}, 142 {ID: "mintc", Name: "minimum", Div: precision}, 143 }, 144 } 145 systemPrecisionChart = module.Chart{ 146 ID: "sys_precision", 147 Title: "Precision", 148 Units: "log2", 149 Fam: "system", 150 Ctx: "ntpd.sys_precision", 151 Priority: prioSystemPrecision, 152 Dims: module.Dims{ 153 {ID: "precision", Name: "precision", Div: precision}, 154 }, 155 } 156 ) 157 158 var ( 159 peerChartsTmpl = module.Charts{ 160 peerOffsetChartTmpl.Copy(), 161 peerDelayChartTmpl.Copy(), 162 peerDispersionChartTmpl.Copy(), 163 peerJitterChartTmpl.Copy(), 164 peerXleaveChartTmpl.Copy(), 165 peerRootDelayChartTmpl.Copy(), 166 peerRootDispersionChartTmpl.Copy(), 167 peerStratumChartTmpl.Copy(), 168 peerHostModeChartTmpl.Copy(), 169 peerPeerModeChartTmpl.Copy(), 170 peerHostPollChartTmpl.Copy(), 171 peerPeerPollChartTmpl.Copy(), 172 peerPrecisionChartTmpl.Copy(), 173 } 174 peerOffsetChartTmpl = module.Chart{ 175 ID: "peer_%s_offset", 176 Title: "Peer offset", 177 Units: "milliseconds", 178 Fam: "peers", 179 Ctx: "ntpd.peer_offset", 180 Priority: prioPeerOffset, 181 Dims: module.Dims{ 182 {ID: "peer_%s_offset", Name: "offset", Div: precision}, 183 }, 184 } 185 peerDelayChartTmpl = module.Chart{ 186 ID: "peer_%s_delay", 187 Title: "Peer delay", 188 Units: "milliseconds", 189 Fam: "peers", 190 Ctx: "ntpd.peer_delay", 191 Priority: prioPeerDelay, 192 Dims: module.Dims{ 193 {ID: "peer_%s_delay", Name: "delay", Div: precision}, 194 }, 195 } 196 peerDispersionChartTmpl = module.Chart{ 197 ID: "peer_%s_dispersion", 198 Title: "Peer dispersion", 199 Units: "milliseconds", 200 Fam: "peers", 201 Ctx: "ntpd.peer_dispersion", 202 Priority: prioPeerDispersion, 203 Dims: module.Dims{ 204 {ID: "peer_%s_dispersion", Name: "dispersion", Div: precision}, 205 }, 206 } 207 peerJitterChartTmpl = module.Chart{ 208 ID: "peer_%s_jitter", 209 Title: "Peer jitter", 210 Units: "milliseconds", 211 Fam: "peers", 212 Ctx: "ntpd.peer_jitter", 213 Priority: prioPeerJitter, 214 Dims: module.Dims{ 215 {ID: "peer_%s_jitter", Name: "jitter", Div: precision}, 216 }, 217 } 218 peerXleaveChartTmpl = module.Chart{ 219 ID: "peer_%s_xleave", 220 Title: "Peer interleave delay", 221 Units: "milliseconds", 222 Fam: "peers", 223 Ctx: "ntpd.peer_xleave", 224 Priority: prioPeerXleave, 225 Dims: module.Dims{ 226 {ID: "peer_%s_xleave", Name: "xleave", Div: precision}, 227 }, 228 } 229 peerRootDelayChartTmpl = module.Chart{ 230 ID: "peer_%s_rootdelay", 231 Title: "Peer roundtrip delay to the primary reference clock", 232 Units: "milliseconds", 233 Fam: "peers", 234 Ctx: "ntpd.peer_rootdelay", 235 Priority: prioPeerRootDelay, 236 Dims: module.Dims{ 237 {ID: "peer_%s_rootdelay", Name: "rootdelay", Div: precision}, 238 }, 239 } 240 peerRootDispersionChartTmpl = module.Chart{ 241 ID: "peer_%s_rootdisp", 242 Title: "Peer root dispersion to the primary reference clock", 243 Units: "milliseconds", 244 Fam: "peers", 245 Ctx: "ntpd.peer_rootdisp", 246 Priority: prioPeerRootDispersion, 247 Dims: module.Dims{ 248 {ID: "peer_%s_rootdisp", Name: "dispersion", Div: precision}, 249 }, 250 } 251 peerStratumChartTmpl = module.Chart{ 252 ID: "peer_%s_stratum", 253 Title: "Peer stratum", 254 Units: "stratum", 255 Fam: "peers", 256 Ctx: "ntpd.peer_stratum", 257 Priority: prioPeerStratum, 258 Dims: module.Dims{ 259 {ID: "peer_%s_stratum", Name: "stratum", Div: precision}, 260 }, 261 } 262 peerHostModeChartTmpl = module.Chart{ 263 ID: "peer_%s_hmode", 264 Title: "Peer host mode", 265 Units: "hmode", 266 Fam: "peers", 267 Ctx: "ntpd.peer_hmode", 268 Priority: prioPeerHostMode, 269 Dims: module.Dims{ 270 {ID: "peer_%s_hmode", Name: "hmode", Div: precision}, 271 }, 272 } 273 peerPeerModeChartTmpl = module.Chart{ 274 ID: "peer_%s_pmode", 275 Title: "Peer mode", 276 Units: "pmode", 277 Fam: "peers", 278 Ctx: "ntpd.peer_pmode", 279 Priority: prioPeerPeerMode, 280 Dims: module.Dims{ 281 {ID: "peer_%s_pmode", Name: "pmode", Div: precision}, 282 }, 283 } 284 peerHostPollChartTmpl = module.Chart{ 285 ID: "peer_%s_hpoll", 286 Title: "Peer host poll exponent", 287 Units: "log2", 288 Fam: "peers", 289 Ctx: "ntpd.peer_hpoll", 290 Priority: prioPeerHostPoll, 291 Dims: module.Dims{ 292 {ID: "peer_%s_hpoll", Name: "hpoll", Div: precision}, 293 }, 294 } 295 peerPeerPollChartTmpl = module.Chart{ 296 ID: "peer_%s_ppoll", 297 Title: "Peer poll exponent", 298 Units: "log2", 299 Fam: "peers", 300 Ctx: "ntpd.peer_ppoll", 301 Priority: prioPeerPeerPoll, 302 Dims: module.Dims{ 303 {ID: "peer_%s_ppoll", Name: "hpoll", Div: precision}, 304 }, 305 } 306 peerPrecisionChartTmpl = module.Chart{ 307 ID: "peer_%s_precision", 308 Title: "Peer precision", 309 Units: "log2", 310 Fam: "peers", 311 Ctx: "ntpd.peer_precision", 312 Priority: prioPeerPrecision, 313 Dims: module.Dims{ 314 {ID: "peer_%s_precision", Name: "precision", Div: precision}, 315 }, 316 } 317 ) 318 319 func (n *NTPd) addPeerCharts(addr string) { 320 charts := peerChartsTmpl.Copy() 321 322 for _, chart := range *charts { 323 chart.ID = fmt.Sprintf(chart.ID, strings.ReplaceAll(addr, ".", "_")) 324 chart.Labels = []module.Label{ 325 {Key: "peer_address", Value: addr}, 326 } 327 for _, dim := range chart.Dims { 328 dim.ID = fmt.Sprintf(dim.ID, addr) 329 } 330 } 331 332 if err := n.Charts().Add(*charts...); err != nil { 333 n.Warning(err) 334 } 335 } 336 337 func (n *NTPd) removePeerCharts(addr string) { 338 px := fmt.Sprintf("peer_%s", strings.ReplaceAll(addr, ".", "_")) 339 340 for _, chart := range *n.Charts() { 341 if strings.HasPrefix(chart.ID, px) { 342 chart.MarkRemove() 343 chart.MarkNotCreated() 344 } 345 } 346 }