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  }