firehol/netdata

View on GitHub
src/go/plugin/go.d/modules/ntpd/charts.go

Summary

Maintainability
A
40 mins
Test Coverage
// SPDX-License-Identifier: GPL-3.0-or-later

package ntpd

import (
    "fmt"
    "strings"

    "github.com/netdata/netdata/go/plugins/plugin/go.d/agent/module"
)

const (
    prioSystemOffset = module.Priority + iota
    prioSystemJitter
    prioSystemFrequency
    prioSystemWander
    prioSystemRootDelay
    prioSystemRootDispersion
    prioSystemStratum
    prioSystemTimeConstant
    prioSystemPrecision

    prioPeerOffset
    prioPeerDelay
    prioPeerDispersion
    prioPeerJitter
    prioPeerXleave
    prioPeerRootDelay
    prioPeerRootDispersion
    prioPeerStratum
    prioPeerHostMode
    prioPeerPeerMode
    prioPeerHostPoll
    prioPeerPeerPoll
    prioPeerPrecision
)

var (
    systemCharts = module.Charts{
        systemOffsetChart.Copy(),
        systemJitterChart.Copy(),
        systemFrequencyChart.Copy(),
        systemWanderChart.Copy(),
        systemRootDelayChart.Copy(),
        systemRootDispersionChart.Copy(),
        systemStratumChart.Copy(),
        systemTimeConstantChart.Copy(),
        systemPrecisionChart.Copy(),
    }
    systemOffsetChart = module.Chart{
        ID:       "sys_offset",
        Title:    "Combined offset of server relative to this host",
        Units:    "milliseconds",
        Fam:      "system",
        Ctx:      "ntpd.sys_offset",
        Type:     module.Area,
        Priority: prioSystemOffset,
        Dims: module.Dims{
            {ID: "offset", Name: "offset", Div: precision},
        },
    }
    systemJitterChart = module.Chart{
        ID:       "sys_jitter",
        Title:    "Combined system jitter and clock jitter",
        Units:    "milliseconds",
        Fam:      "system",
        Ctx:      "ntpd.sys_jitter",
        Priority: prioSystemJitter,
        Dims: module.Dims{
            {ID: "sys_jitter", Name: "system", Div: precision},
            {ID: "clk_jitter", Name: "clock", Div: precision},
        },
    }
    systemFrequencyChart = module.Chart{
        ID:       "sys_frequency",
        Title:    "Frequency offset relative to hardware clock",
        Units:    "ppm",
        Fam:      "system",
        Ctx:      "ntpd.sys_frequency",
        Type:     module.Area,
        Priority: prioSystemFrequency,
        Dims: module.Dims{
            {ID: "frequency", Name: "frequency", Div: precision},
        },
    }
    systemWanderChart = module.Chart{
        ID:       "sys_wander",
        Title:    "Clock frequency wander",
        Units:    "ppm",
        Fam:      "system",
        Ctx:      "ntpd.sys_wander",
        Type:     module.Area,
        Priority: prioSystemWander,
        Dims: module.Dims{
            {ID: "clk_wander", Name: "clock", Div: precision},
        },
    }
    systemRootDelayChart = module.Chart{
        ID:       "sys_rootdelay",
        Title:    "Total roundtrip delay to the primary reference clock",
        Units:    "milliseconds",
        Fam:      "system",
        Ctx:      "ntpd.sys_rootdelay",
        Type:     module.Area,
        Priority: prioSystemRootDelay,
        Dims: module.Dims{
            {ID: "rootdelay", Name: "delay", Div: precision},
        },
    }
    systemRootDispersionChart = module.Chart{
        ID:       "sys_rootdisp",
        Title:    "Total root dispersion to the primary reference clock",
        Units:    "milliseconds",
        Fam:      "system",
        Ctx:      "ntpd.sys_rootdisp",
        Type:     module.Area,
        Priority: prioSystemRootDispersion,
        Dims: module.Dims{
            {ID: "rootdisp", Name: "dispersion", Div: precision},
        },
    }
    systemStratumChart = module.Chart{
        ID:       "sys_stratum",
        Title:    "Stratum",
        Units:    "stratum",
        Fam:      "system",
        Ctx:      "ntpd.sys_stratum",
        Priority: prioSystemStratum,
        Dims: module.Dims{
            {ID: "stratum", Name: "stratum", Div: precision},
        },
    }
    systemTimeConstantChart = module.Chart{
        ID:       "sys_tc",
        Title:    "Time constant and poll exponent",
        Units:    "log2",
        Fam:      "system",
        Ctx:      "ntpd.sys_tc",
        Priority: prioSystemTimeConstant,
        Dims: module.Dims{
            {ID: "tc", Name: "current", Div: precision},
            {ID: "mintc", Name: "minimum", Div: precision},
        },
    }
    systemPrecisionChart = module.Chart{
        ID:       "sys_precision",
        Title:    "Precision",
        Units:    "log2",
        Fam:      "system",
        Ctx:      "ntpd.sys_precision",
        Priority: prioSystemPrecision,
        Dims: module.Dims{
            {ID: "precision", Name: "precision", Div: precision},
        },
    }
)

var (
    peerChartsTmpl = module.Charts{
        peerOffsetChartTmpl.Copy(),
        peerDelayChartTmpl.Copy(),
        peerDispersionChartTmpl.Copy(),
        peerJitterChartTmpl.Copy(),
        peerXleaveChartTmpl.Copy(),
        peerRootDelayChartTmpl.Copy(),
        peerRootDispersionChartTmpl.Copy(),
        peerStratumChartTmpl.Copy(),
        peerHostModeChartTmpl.Copy(),
        peerPeerModeChartTmpl.Copy(),
        peerHostPollChartTmpl.Copy(),
        peerPeerPollChartTmpl.Copy(),
        peerPrecisionChartTmpl.Copy(),
    }
    peerOffsetChartTmpl = module.Chart{
        ID:       "peer_%s_offset",
        Title:    "Peer offset",
        Units:    "milliseconds",
        Fam:      "peers",
        Ctx:      "ntpd.peer_offset",
        Priority: prioPeerOffset,
        Dims: module.Dims{
            {ID: "peer_%s_offset", Name: "offset", Div: precision},
        },
    }
    peerDelayChartTmpl = module.Chart{
        ID:       "peer_%s_delay",
        Title:    "Peer delay",
        Units:    "milliseconds",
        Fam:      "peers",
        Ctx:      "ntpd.peer_delay",
        Priority: prioPeerDelay,
        Dims: module.Dims{
            {ID: "peer_%s_delay", Name: "delay", Div: precision},
        },
    }
    peerDispersionChartTmpl = module.Chart{
        ID:       "peer_%s_dispersion",
        Title:    "Peer dispersion",
        Units:    "milliseconds",
        Fam:      "peers",
        Ctx:      "ntpd.peer_dispersion",
        Priority: prioPeerDispersion,
        Dims: module.Dims{
            {ID: "peer_%s_dispersion", Name: "dispersion", Div: precision},
        },
    }
    peerJitterChartTmpl = module.Chart{
        ID:       "peer_%s_jitter",
        Title:    "Peer jitter",
        Units:    "milliseconds",
        Fam:      "peers",
        Ctx:      "ntpd.peer_jitter",
        Priority: prioPeerJitter,
        Dims: module.Dims{
            {ID: "peer_%s_jitter", Name: "jitter", Div: precision},
        },
    }
    peerXleaveChartTmpl = module.Chart{
        ID:       "peer_%s_xleave",
        Title:    "Peer interleave delay",
        Units:    "milliseconds",
        Fam:      "peers",
        Ctx:      "ntpd.peer_xleave",
        Priority: prioPeerXleave,
        Dims: module.Dims{
            {ID: "peer_%s_xleave", Name: "xleave", Div: precision},
        },
    }
    peerRootDelayChartTmpl = module.Chart{
        ID:       "peer_%s_rootdelay",
        Title:    "Peer roundtrip delay to the primary reference clock",
        Units:    "milliseconds",
        Fam:      "peers",
        Ctx:      "ntpd.peer_rootdelay",
        Priority: prioPeerRootDelay,
        Dims: module.Dims{
            {ID: "peer_%s_rootdelay", Name: "rootdelay", Div: precision},
        },
    }
    peerRootDispersionChartTmpl = module.Chart{
        ID:       "peer_%s_rootdisp",
        Title:    "Peer root dispersion to the primary reference clock",
        Units:    "milliseconds",
        Fam:      "peers",
        Ctx:      "ntpd.peer_rootdisp",
        Priority: prioPeerRootDispersion,
        Dims: module.Dims{
            {ID: "peer_%s_rootdisp", Name: "dispersion", Div: precision},
        },
    }
    peerStratumChartTmpl = module.Chart{
        ID:       "peer_%s_stratum",
        Title:    "Peer stratum",
        Units:    "stratum",
        Fam:      "peers",
        Ctx:      "ntpd.peer_stratum",
        Priority: prioPeerStratum,
        Dims: module.Dims{
            {ID: "peer_%s_stratum", Name: "stratum", Div: precision},
        },
    }
    peerHostModeChartTmpl = module.Chart{
        ID:       "peer_%s_hmode",
        Title:    "Peer host mode",
        Units:    "hmode",
        Fam:      "peers",
        Ctx:      "ntpd.peer_hmode",
        Priority: prioPeerHostMode,
        Dims: module.Dims{
            {ID: "peer_%s_hmode", Name: "hmode", Div: precision},
        },
    }
    peerPeerModeChartTmpl = module.Chart{
        ID:       "peer_%s_pmode",
        Title:    "Peer mode",
        Units:    "pmode",
        Fam:      "peers",
        Ctx:      "ntpd.peer_pmode",
        Priority: prioPeerPeerMode,
        Dims: module.Dims{
            {ID: "peer_%s_pmode", Name: "pmode", Div: precision},
        },
    }
    peerHostPollChartTmpl = module.Chart{
        ID:       "peer_%s_hpoll",
        Title:    "Peer host poll exponent",
        Units:    "log2",
        Fam:      "peers",
        Ctx:      "ntpd.peer_hpoll",
        Priority: prioPeerHostPoll,
        Dims: module.Dims{
            {ID: "peer_%s_hpoll", Name: "hpoll", Div: precision},
        },
    }
    peerPeerPollChartTmpl = module.Chart{
        ID:       "peer_%s_ppoll",
        Title:    "Peer poll exponent",
        Units:    "log2",
        Fam:      "peers",
        Ctx:      "ntpd.peer_ppoll",
        Priority: prioPeerPeerPoll,
        Dims: module.Dims{
            {ID: "peer_%s_ppoll", Name: "hpoll", Div: precision},
        },
    }
    peerPrecisionChartTmpl = module.Chart{
        ID:       "peer_%s_precision",
        Title:    "Peer precision",
        Units:    "log2",
        Fam:      "peers",
        Ctx:      "ntpd.peer_precision",
        Priority: prioPeerPrecision,
        Dims: module.Dims{
            {ID: "peer_%s_precision", Name: "precision", Div: precision},
        },
    }
)

func (n *NTPd) addPeerCharts(addr string) {
    charts := peerChartsTmpl.Copy()

    for _, chart := range *charts {
        chart.ID = fmt.Sprintf(chart.ID, strings.ReplaceAll(addr, ".", "_"))
        chart.Labels = []module.Label{
            {Key: "peer_address", Value: addr},
        }
        for _, dim := range chart.Dims {
            dim.ID = fmt.Sprintf(dim.ID, addr)
        }
    }

    if err := n.Charts().Add(*charts...); err != nil {
        n.Warning(err)
    }
}

func (n *NTPd) removePeerCharts(addr string) {
    px := fmt.Sprintf("peer_%s", strings.ReplaceAll(addr, ".", "_"))

    for _, chart := range *n.Charts() {
        if strings.HasPrefix(chart.ID, px) {
            chart.MarkRemove()
            chart.MarkNotCreated()
        }
    }
}