Go Helper Packages For go.d Collectors
Use existing helper packages before adding collector-local plumbing. A helper is not better because it is shared; it is better when it gives users the same configuration shape, the same safety behavior, or the same testable parsing path as other collectors.
This guide covers helper surfaces used by go.d collectors across:
src/go/pkg/*for shared Go packages used beyond go.d;src/go/plugin/go.d/pkg/*for go.d-specific helpers;src/go/loggerfor the logger embedded throughcollectorapi.Base.
It is not an exhaustive API reference. Before adding a local helper, search these roots for an existing package that already owns the behavior.
Helper Roots
| Need | Start with |
|---|---|
| V2 metrics, metric stores, host scopes | src/go/pkg/metrix |
| Duration and tri-state config option types | src/go/pkg/confopt |
| HTTP request/client config | src/go/pkg/web |
| TLS config outside HTTP | src/go/pkg/tlscfg |
| Prometheus exposition parsing | src/go/pkg/prometheus |
| User selector/matcher grammar | src/go/pkg/matcher |
| Collector logging and log limiting | src/go/logger |
| Function request/response helpers | src/go/pkg/funcapi |
| Topology payloads | src/go/pkg/topology/v1 |
| Agent API / chart emission payloads | src/go/pkg/netdataapi |
| TCP/UDP/Unix line-protocol clients | src/go/plugin/go.d/pkg/socket |
| Command execution | src/go/plugin/go.d/pkg/ndexec |
| Log-file readers/parsers | src/go/plugin/go.d/pkg/logs |
| IP range parsing | src/go/plugin/go.d/pkg/iprange |
| SQL query/scan helpers | src/go/plugin/go.d/pkg/sqlquery |
| Cloud auth config/credentials | src/go/plugin/go.d/pkg/cloudauth |
| Ping probing | src/go/plugin/go.d/pkg/pinger |
| SNMP utilities | src/go/plugin/go.d/pkg/snmputils |
| Kubernetes client helpers | src/go/plugin/go.d/pkg/k8sclient |
| Docker host helpers | src/go/plugin/go.d/pkg/dockerhost |
| Test helpers for collectors | src/go/plugin/go.d/pkg/collecttest |
| Legacy V1 metric helpers | src/go/pkg/stm, src/go/plugin/go.d/pkg/oldmetrix |
Config Option Types
Use src/go/pkg/confopt for common configuration value types.
When:
- users configure durations that should accept strings such as
5s,30m, or numeric seconds; - users need explicit
auto/enabled/disabledbehavior instead of a plain boolean; - a migration needs to preserve legacy pointer-boolean semantics without keeping pointer plumbing in new code.
Why:
confopt.Durationandconfopt.LongDurationcentralize YAML/JSON duration parsing and formatting;confopt.AutoBoolmakes tri-state behavior explicit and schema-friendly;- collectors avoid ad hoc parsers and inconsistent boolean defaults.
HTTP Collectors
Use src/go/pkg/web for HTTP-based collectors.
When:
- the collector talks to an HTTP or HTTPS endpoint;
- users need the normal Netdata HTTP options:
url, timeout, redirects, proxy, basic auth, bearer token file, headers, body, method, and TLS fields; - the collector builds repeated requests against the same endpoint.
Why:
web.HTTPConfigembedsweb.RequestConfigandweb.ClientConfigso HTTP collectors expose the same option surface;web.NewHTTPClient(c.ClientConfig)applies timeout, TLS, proxy, redirect, and HTTP/2 behavior consistently;web.NewHTTPRequest(c.RequestConfig)andweb.NewHTTPRequestWithPath(c.RequestConfig, path)apply user agent, authentication, headers, body, and safe path joining.
Pattern:
type Config struct {
web.HTTPConfig `yaml:",inline" json:""`
}
Use src/go/pkg/tlscfg directly only when the collector is not HTTP-based but
still needs TLS, such as Redis or x509-style checks. HTTP collectors should get
TLS behavior through web.HTTPConfig.
Prometheus Endpoints
Use src/go/pkg/prometheus when the upstream endpoint exposes Prometheus text
format.
When:
- the collector scrapes
/metricsor another Prometheus exposition endpoint; - the collector needs to parse metric families or sorted series;
- the collector needs a bounded selector for metric names.
Why:
- it reuses
web.RequestConfigand*http.Client; - it handles Prometheus text parsing and gzip responses;
- selectors avoid parsing or processing metric families the collector will not use.
Do not hand-roll text exposition parsing in a collector.
Selectors And Matchers
Use src/go/pkg/matcher for user-facing include/exclude or selector fields.
When:
- users select entities by name, ID, interface, queue, topic, or similar labels;
- the selector syntax can be glob, regexp, string, or simple patterns;
- negative matches such as
!*test* *are sufficient.
Why:
- users get one matcher grammar across collectors;
- tests can cover selector behavior without custom parser logic;
- existing logical matchers can combine conditions when needed.
Do not invent a selector language unless the upstream API requires one. Prefer a single simple-pattern field for simple cases; add separate include/exclude fields only when the user problem needs that shape.
Do not use src/go/pkg/selectorcore for user-facing collector selectors. It is
the lower-level selector metadata/parser surface used by template and selector
engines, not the normal collector selector helper.
Limited Logging
Collectors embed collectorapi.Base, which embeds *logger.Logger. Use the
logger's built-in limiting before adding collector-local rate-limit state.
When:
- an error can repeat every collection cycle;
- a partial failure is useful to report but would spam logs;
- a one-time notice or warning is enough.
Why:
- in go.d jobs,
c.Once(key).Warningf(...)is cycle-local because the runtime resetsOncestate eachrunOnce; it is useful for suppressing duplicate messages inside one cycle only; c.Limit(key, n, window).Warningf(...)logs at mostnmessages per key per window and is the right default for cross-cycle spam control;- the limiter is shared through the collector logger and already used by modern collectors such as Cato Networks, PAN-OS, and vSphere.
Pattern:
c.Limit("mycollector:operation:error", 1, time.Hour).
Warningf("operation failed: %v", err)
Use stable keys. Include the operation and bounded error class when needed, but do not put unbounded IDs, URLs, query strings, customer names, or raw provider messages in the key.
Custom warning gates are justified only when the built-in count-per-window semantics are not the right behavior, for example when logging only on state transitions. Document that reason in the PR description or design note so reviewers can see why the built-in limiter was not enough.
Socket Clients
Use src/go/plugin/go.d/pkg/socket for simple TCP, UDP, or Unix-socket
line-protocol collectors.
When:
- the collector connects to a local or remote socket and sends text commands;
- the response is processed line by line;
- the collector needs shared timeout, TLS, and max-read-line behavior.
Why:
- socket address parsing is shared across collectors;
- connect, command, read, disconnect, deadline, and line-limit behavior stay consistent;
- tests can use the helper's fake TCP/UDP/Unix servers instead of custom socket harnesses.
Do not hand-roll socket dial/read loops for common line-oriented protocols.
External Commands
Use src/go/plugin/go.d/pkg/ndexec for collectors that execute binaries.
When:
- the collector needs a local command output;
- the command should run through Netdata's helper wrappers;
- the command may need privilege through
ndsudo; - tests need to stub helper paths.
Why:
- arguments are passed without a shell;
- timeouts and context cancellation are handled;
- stderr snippets are bounded;
- helpers integrate with Netdata's execution model.
Use:
RunUnprivileged/RunUnprivilegedWithOptions...for unprivileged commands;RunNDSudofor commands exposed throughndsudo;RunDirectonly when direct execution is intentionally required;FindBinaryfor PATH/default-path discovery.
Do not call exec.Command directly unless the helper cannot support the case and
the reason is documented.
Log File Collectors
Use src/go/plugin/go.d/pkg/logs for collectors that parse application log
files.
When:
- the collector tails files that can rotate;
- the log format is CSV, LTSV, regexp, or JSON;
- parser errors should be distinguishable from I/O errors.
Why:
logs.Readeris log-rotation aware;logs.NewParsercentralizes supported parser types;logs.IsParseErrorlets collection logic treat malformed rows differently from source failures.
Do not open and seek log files manually unless the collector's source is not a normal file-tail workflow.
IP Ranges
Use src/go/plugin/go.d/pkg/iprange when users configure address ranges.
When:
- the collector filters IPs, networks, peers, or hosts by ranges;
- the config accepts CIDR, range, or other supported range syntax.
Why:
- range parsing and membership checks are shared;
- invalid syntax handling is consistent;
- collectors avoid slightly different IP matching semantics.
SQL Helpers
Use src/go/plugin/go.d/pkg/sqlquery for repeated SQL row-scanning patterns.
When:
- the collector or Function scans rows into strings, integers, floats, or discard columns;
- the collector needs table-column discovery with
?or$1placeholders; - the row-to-value assignment is generic across queries.
Why:
- scan holders and null handling are centralized;
- query duration measurement and row iteration behavior stay testable;
- Function code can avoid custom one-off scanners.
Cloud Auth Helpers
Use src/go/plugin/go.d/pkg/cloudauth when a cloud collector needs supported
cloud-provider credentials.
When:
- the collector supports
cloud_authconfiguration; - Azure AD credential construction is needed.
Why:
- provider names normalize consistently;
- validation is centralized;
- unsupported providers fail with consistent errors.
Ping Helpers
Use src/go/plugin/go.d/pkg/pinger for ping/latency probing.
When:
- a collector needs ICMP-style probing;
- it needs shared latency/jitter derivation.
Why:
- probe config validation and derived metrics are shared;
- collectors avoid reimplementing packet sampling and jitter math.
Legacy V1 Helpers
src/go/pkg/stm converts structs into map[string]int64.
src/go/plugin/go.d/pkg/oldmetrix provides V1 metric vector helper types such
as counters, summaries, histograms, and boolean conversions used by existing V1
collectors. Both helpers are V1-shaped. New V2 collectors MUST NOT use them as
their metric path.
Acceptable uses:
- maintaining an existing V1 collector;
- temporary parity tests during V1-to-V2 migration, provided the helper is not reachable from the final runtime path.