Stream first. Poll when needed.

monNETtoring
Telemetry-first network monitoring

One operational model for streamed metrics, polled devices, active probes, flows, and events - built entirely from configured open-source components.

gNMI first
streaming telemetry is the primary path
One schema
source stays a label, never a dashboard concern
Config as code
collectors, rules, and monitors stay versioned

monNETtoring is a telemetry-first network monitoring platform: gNMI streaming is the primary data path, SNMP polling is the fallback, and active ICMP/HTTP probing covers path health. Every source is normalized to one canonical schema where source is just a label - a dashboard or alert never needs to know whether a number arrived by stream or by poll.

A parallel flows lane (NetFlow/sFlow → ClickHouse) adds per-flow drill-down beside the metrics, and an events lane (syslog + SNMP traps → the same ClickHouse) explains why a number moved. Both lanes share only the broker. Open source and config-over-code by design: no bespoke services, only configured components you can inspect, version, and replace.

Reference architecture
Open source
monNETtoring telemetry reference architecture gNMI, SNMP, active probes, flows, and events feed source-specific collectors. A Kafka-compatible broker provides the shared ingestion layer. Vector normalizes metrics into VictoriaMetrics, while ClickHouse stores flows and events. Grafana queries both stores and the alerting chain runs from VictoriaMetrics through vmalert and Alertmanager. gNMI devicesstream telemetry SNMP devicespoll fallback ICMP / HTTPactive targets NetFlow / sFlowflow exporters syslog + trapsdevice events gnmiccollector telegrafcollector cloudproberprobe engine goflow2flow collector Kafka-compatibleshared broker Vectorcanonical/v1 VictoriaMetricsmetrics store ClickHouseflows + events Grafanaquery vmalertevaluate Alertmanagerroute alert-sinkdeliver
metricsflowseventsalerting
Metrics, flows, and events stay separate workloads; only the broker is shared.

Telemetry architectureOne canonical model

gNMIprimary stream SNMPpolling fallback ICMP/HTTPactive path probes 3 lanesmetrics · flows · events
Open source.Architecture, configuration, schemas, rules, and deployment patterns are available in the repository.
Explore GitHub repositories
Telemetry architecture

Many protocols in. One operational model out.

The transport can change without forcing dashboards, alerts, or downstream queries to change. Collection is source-specific; everything after normalization is not. Open source: inspect the configuration and contribute on GitHub

01 / Collection paths

Stream first, poll as a fallback

gnmic streams gNMI from capable routers and switches. telegraf polls SNMP where streaming is unavailable and also scrapes cloudprober for ICMP and HTTP path-health checks.

gNMI · gnmic SNMP · telegraf ICMP · cloudprober HTTP · cloudprober
02 / Canonical schema

Dashboards never branch on collection method

Vector maps every measurement to the same field and label contract. The source label records provenance, but queries depend on stable names such as device, interface, metric, site, and timestamp.

gNMIstream
SNMPpoll
probesactive
Vectornormalize + validate
canonical / v1
metricdeviceinterfacesitesourcevaluetimestamp
03 / Parallel data lanes

Metrics show what moved. Flows and events explain it.

NetFlow, IPFIX, and sFlow retain per-conversation detail in ClickHouse. Syslog and SNMP traps land beside them, so operators can connect a metric change to traffic composition or a device event without forcing every workload into one store.

MetricsVector → VictoriaMetrics
Flowsgoflow2 → ClickHouse
Eventssyslog / traps → ClickHouse
04 / Monitoring as code

Version the monitoring system, not just its targets

Collectors, normalization transforms, probe targets, alert rules, dashboards, and routing policies are reviewed and deployed as configuration. The platform is assembled from OSS services rather than hidden behind bespoke application code.

inventory/devices + targets
schema/canonical contract
rules/alerts + transforms
state/rendered collector config
monNETtoring mark

The greatest, user-friendliest design - and a perfect logo.

02 Continue toData path
The normalized data path

Collection changes. The contract does not.

A Kafka-compatible broker decouples ingestion from processing. Vector enforces the canonical metrics contract before VictoriaMetrics, while ClickHouse independently consumes flows and events from the same broker.

Collect at the best available fidelity

gnmic streams gNMI, telegraf polls SNMP, and cloudprober produces active ICMP/HTTP measurements that telegraf scrapes.

Normalize after the broker

Collectors publish through a Kafka-compatible broker. Vector maps metrics into canonical/v1 so Grafana and vmalert query stable labels, not transport-specific fields.

Store by workload

VictoriaMetrics serves time-series metrics; ClickHouse keeps high-cardinality flows and events. Grafana brings the lanes together at query time.

Normalized data pathCANONICAL / V1
gnmicgNMI stream telegrafSNMP poll cloudproberICMP / HTTP Kafka-compatibledecouple ingestion Vectorcanonical/v1 Victoriametrics ClickHouseflowsevents flows lane events lane
Grafana and vmalert query the stable contract rather than transport-specific fields.
03 Continue toMonitoring as code
Why monitoring-as-code

Rebuildable, reviewable, and explicit by design.

Without version control, dashboards drift, collector configuration gets inconsistent, and alert changes are harder to review or reproduce.

Unmanaged Without version control
01No reproducibility

You cannot reliably rebuild the stack.

02No review

Alert changes can go live without review.

03No history

There is no clear record of who changed what or why.

Putting monitoring in Git buys review, rollback, diffability, and rebuild-from-nothing.

make upmake verify is the repository’s proof: configuration should be sufficient to recreate the stack and executable verification should prove the pipeline is alive.

Git makes schema contracts explicit. Requirements such as “gNMI and SNMP emit the same metric names” live in schema/canonical.md instead of per-panel regular expressions.

Implementation principles.

Each one maps to a concrete boundary

01

Config-over-code; code only at the control plane.

Nothing bespoke sits in the data path. gnmic, telegraf, cloudprober, Vector VRL, VictoriaMetrics, vmalert, and Alertmanager remain off-the-shelf components driven by committed configuration.

The single written service, services/api, renders configuration and serves the GUI; it never touches metrics. Every custom data-path service is something that pages you. Every configuration file is something you can diff.

02

Keep three layers of state strictly apart.

Monitoring-as-code breaks when operators hand-edit derived files or a UI writes state that nothing reliably re-renders.

Committed configconfig/Static component configuration, mounted read-only and ready for future ConfigMaps.
Source of truthinventory/Devices, credentials, groups, and discovery seeds. Machine-writable, Git-tracked intent.
Derived statestate/Rendered collector targets. Gitignored, never hand-edited, and always regenerable.
03

One canonical schema; transport is a label.

Normalization happens at ingest so source=gnmi and source=snmp label identical metric names. Dashboards and alert rules stay transport-agnostic instead of forking into unmaintainable duplicates.

schema/canonical.mdVector VRLcanonical metrics
04

Provision dashboards and alerts as artifacts.

Dashboards and rules are committed and provisioned - never click-built. Raw Grafana JSON is adequate at the current scale; Grafonnet or grizzly remain the escape hatch if diff quality becomes the limiting factor.

config/grafana/dashboards/config/vmalert/rules/
05

Verification is part of the code.

scripts/verify.sh asserts that every source is present, rules are loaded, and authentication completes a round trip after each change. Version control without an executable health check merely versions the breakage.

The stack also monitors itself through an out-of-band self-scrape, mon: rules, and the Pipeline Health dashboard. A dead collector must never look like a quiet network.

make upmake verifyPipeline Health
06

Use reconciliation, not imperative runtime edits.

Discovery and GUI onboarding mutate the source of truth. The renderer regenerates derived targets and collectors re-read them through gnmic’s 30-second file loader and telegraf’s --watch-config.

No one-off change is pushed into a running collector. Imperative edits evaporate after restart and leave no Git history.

GUI / discoveryinventory/rendererstate/collectors

monNETtoring is open source. The implementation, configuration, schemas, and supporting repositories are maintained openly under the monNETtoring GitHub account.

Browse open-source repositories
04 Continue toContact the developers
Contact the developers

Ask the maintainers directly.

Use either developer email, visit the GitHub account, or send one simple question from the form. The Gmail inbox is the default recipient for form messages.

Send a question to the developers

This prepares an email to monnettoring@gmail.com in your email app so you can review it before sending.