The only agent that thinks for itself

Autonomous Monitoring with self-learning AI built-in, operating independently across your entire stack.

Unlimited Metrics & Logs
Machine learning & MCP
5% CPU, 150MB RAM
3GB disk, >1 year retention
800+ integrations, zero config
Dashboards, alerts out of the box
> Discover Netdata Agents

Centralized metrics streaming and storage

Aggregate metrics from multiple agents into centralized Parent nodes for unified monitoring across your infrastructure.

Stream from unlimited agents
Long-term data retention
High availability clustering
Data replication & backup
Scalable architecture
Enterprise-grade security
> Learn about Parents

Fully managed cloud platform

Access your monitoring data from anywhere with our SaaS platform. No infrastructure to manage, automatic updates, and global availability.

Zero infrastructure management
99.9% uptime SLA
Global data centers
Automatic updates & patches
Enterprise SSO & RBAC
SOC2 & ISO certified
> Explore Netdata Cloud

Deploy Netdata Cloud in your infrastructure

Run the full Netdata Cloud platform on-premises for complete data sovereignty and compliance with your security policies.

Complete data sovereignty
Air-gapped deployment
Custom compliance controls
Private network integration
Dedicated support team
Kubernetes & Docker support
> Learn about Cloud On-Premises

Powerful, intuitive monitoring interface

Modern, responsive UI built for real-time troubleshooting with customizable dashboards and advanced visualization capabilities.

Real-time chart updates
Customizable dashboards
Dark & light themes
Advanced filtering & search
Responsive on all devices
Collaboration features
> Explore Netdata UI

Monitor on the go

Native iOS and Android apps bring full monitoring capabilities to your mobile device with real-time alerts and notifications.

iOS & Android apps
Push notifications
Touch-optimized interface
Offline data access
Biometric authentication
Widget support
> Download apps

The future of infrastructure observability

See our strategic direction across AI-native observability, full-stack signals, operational intelligence, and enterprise platform maturity.

AI-native observability
Full-stack signal coverage
Operational intelligence
Enterprise platform maturity
Agent releases every 6 weeks
Cloud continuous delivery
> Explore Product Roadmap

Best energy efficiency

True real-time per-second

100% automated zero config

Centralized observability

Multi-year retention

High availability built-in

Zero maintenance

Always up-to-date

Enterprise security

Complete data control

Air-gap ready

Compliance certified

Millisecond responsiveness

Infinite zoom & pan

Works on any device

Native performance

Instant alerts

Monitor anywhere

AI-native observability

Continuous delivery

Open source foundation

80% Faster Incident Resolution

AI-powered troubleshooting from detection, to root cause and blast radius identification, to reporting.

True Real-Time and Simple, even at Scale

Linearly and infinitely scalable full-stack observability, that can be deployed even mid-crisis.

90% Cost Reduction, Full Fidelity

Instead of centralizing the data, Netdata distributes the code, eliminating pipelines and complexity.

Control Without Surrender

SOC 2 Type 2 certified with every metric kept on your infrastructure.

Integrations

800+ collectors and notification channels, auto-discovered and ready out of the box.

800+ data collectors
Auto-discovery & zero config
Cloud, infra, app protocols
Notifications out of the box
> Explore integrations
Real Results
46% Cost Reduction

Reduced monitoring costs by 46% while cutting staff overhead by 67%.

— Leonardo Antunez, Codyas

Zero Pipeline

No data shipping. No central storage costs. Query at the edge.

From Our Users
"Out-of-the-Box"

So many out-of-the-box features! I mostly don't have to develop anything.

— Simon Beginn, LANCOM Systems

No Query Language

Point-and-click troubleshooting. No PromQL, no LogQL, no learning curve.

Enterprise Ready
67% Less Staff, 46% Cost Cut

Enterprise efficiency without enterprise complexity—real ROI from day one.

— Leonardo Antunez, Codyas

SOC 2 Type 2 Certified

Zero data egress. Only metadata reaches the cloud. Your metrics stay on your infrastructure.

Full Coverage
800+ Collectors

Auto-discovered and configured. No manual setup required.

Any Notification Channel

Slack, PagerDuty, Teams, email, webhooks—all built-in.

Built for the People Who Get Paged

Because 3am alerts deserve instant answers, not hour-long hunts.

Every Industry Has Rules. We Master Them.

See how healthcare, finance, and government teams cut monitoring costs 90% while staying audit-ready.

Monitor Any Technology. Configure Nothing.

Install the agent. It already knows your stack.
From Our Users
"A Rare Unicorn"

Netdata gives more than you invest in it. A rare unicorn that obeys the Pareto rule.

— Eduard Porquet Mateu, TMB Barcelona

99% Downtime Reduction

Reduced website downtime by 99% and cloud bill by 30% using Netdata alerts.

— Falkland Islands Government

Real Savings
30% Cloud Cost Reduction

Optimized resource allocation based on Netdata alerts cut cloud spending by 30%.

— Falkland Islands Government

46% Cost Cut

Reduced monitoring staff by 67% while cutting operational costs by 46%.

— Codyas

Real Coverage
"Plugin for Everything"

Netdata has agent capacity or a plugin for everything, including Windows and Kubernetes.

— Eduard Porquet Mateu, TMB Barcelona

"Out-of-the-Box"

So many out-of-the-box features! I mostly don't have to develop anything.

— Simon Beginn, LANCOM Systems

Real Speed
Troubleshooting in 30 Seconds

From 2-3 minutes to 30 seconds—instant visibility into any node issue.

— Matthew Artist, Nodecraft

20% Downtime Reduction

20% less downtime and 40% budget optimization from out-of-the-box monitoring.

— Simon Beginn, LANCOM Systems

Pay per Node. Unlimited Everything Else.

One price per node. Unlimited metrics, logs, users, and retention. No per-GB surprises.

Free tier—forever
No metric limits or caps
Retention you control
Cancel anytime
> See pricing plans

What's Your Monitoring Really Costing You?

Most teams overpay by 40-60%. Let's find out why.

Expose hidden metric charges
Calculate tool consolidation
Customers report 30-67% savings
Results in under 60 seconds
> See what you're really paying

Your Infrastructure Is Unique. Let's Talk.

Because monitoring 10 nodes is different from monitoring 10,000.

On-prem & air-gapped deployment
Volume pricing & agreements
Architecture review for your scale
Compliance & security support
> Start a conversation

Monitoring That Sells Itself

Deploy in minutes. Impress clients in hours. Earn recurring revenue for years.

30-second live demos close deals
Zero config = zero support burden
Competitive margins & deal protection
Response in 48 hours
> Apply to partner

Per-Second Metrics at Homelab Prices

Same engine, same dashboards, same ML. Just priced for tinkerers.

Community: Free forever · 5 nodes · non-commercial
Homelab: $90/yr · unlimited nodes · fair usage
> Get the Homelab Plan

$1,000 Per Referral. Unlimited Referrals.

Your colleagues get 10% off. You get 10% commission. Everyone wins.

10% of subscriptions, up to $1,000 each
Track earnings inside Netdata Cloud
PayPal/Venmo payouts in 3-4 weeks
No caps, no complexity
> Get your referral link
Cost Proof
40% Budget Optimization

"Netdata's significant positive impact" — LANCOM Systems

Calculate Your Savings

Compare vs Datadog, Grafana, Dynatrace

Savings Proof
46% Cost Reduction

"Cut costs by 46%, staff by 67%" — Codyas

30% Cloud Bill Savings

"Reduced cloud bill by 30%" — Falkland Islands Gov

Enterprise Proof
"Better Than Combined Alternatives"

"Better observability with Netdata than combining other tools." — TMB Barcelona

Real Engineers, <24h Response

DPA, SLAs, on-prem, volume pricing

Why Partners Win
Demo Live Infrastructure

One command, 30 seconds, real data—no sandbox needed

Zero Tickets, High Margins

Auto-config + per-node pricing = predictable profit

Homelab Ready
Free Video Course

8-episode Netdata tutorial by LearnLinux.tv

76k+ GitHub Stars

3rd most starred monitoring project

Worth Recommending
Product That Delivers

Customers report 40-67% cost cuts, 99% downtime reduction

Zero Risk to Your Rep

Free tier lets them try before they buy

AI Support Assistant, Available 24/7

Nedi has access to all official documentation, source code, and resources. Ask any question about Netdata—responds in your language.

Deployment & configuration
Troubleshooting & sizing
Alerts & notifications
Evidence-based answers
> Ask Nedi now

Never Fight Fires Alone

Docs, community, and expert help—pick your path to resolution.

Learn.netdata.cloud docs
Discord, Forums, GitHub
Premium support available
> Get answers now

60 Seconds to First Dashboard

One command to install. Zero config. 850+ integrations documented.

Linux, Windows, K8s, Docker
Auto-discovers your stack
> Read our documentation

Level Up Your Monitoring

Real problems. Real solutions. 112+ guides from basic monitoring to AI observability.

76,000+ Engineers Strong

615+ contributors. 1.5M daily downloads. One mission: simplify observability.

Per-Second. 90% Cheaper. Data Stays Home.

Side-by-side comparisons: costs, real-time granularity, and data sovereignty for every major tool.

See why teams switch from Datadog, Prometheus, Grafana, and more.

> Browse all comparisons
Edge-Native Observability, Born Open Source
Per-second visibility, ML on every metric, and data that never leaves your infrastructure.
Founded in 2016
615+ contributors worldwide
Remote-first, engineering-driven
Open source first
> Read our story
Promises We Publish—and Prove
12 principles backed by open code, independent validation, and measurable outcomes.
Open source, peer-reviewed
Zero config, instant value
Data sovereignty by design
Aligned pricing, no surprises
> See all 12 principles
Edge-Native, AI-Ready, 100% Open
76k+ stars. Full ML, AI, and automation—GPLv3+, not premium add-ons.
76,000+ GitHub stars
GPLv3+ licensed forever
ML on every metric, included
Zero vendor lock-in
> Explore our open source
Build Real-Time Observability for the World
Remote-first team shipping per-second monitoring with ML on every metric.
Remote-first, fully distributed
Open source (76k+ stars)
Challenging technical problems
Your code on millions of systems
> See open roles
Meet the Team Behind Netdata
Conferences, meetups, and tradeshows where you can see Netdata in action and talk to the engineers who build it.
Live demos and deep dives
Book 1-on-1 meetings
Talks and panel sessions
Event recaps and photos
> See all events
Talk to a Netdata Human in <24 Hours
Sales, partnerships, press, or professional services—real engineers, fast answers.
Discuss your observability needs
Pricing and volume discounts
Partnership opportunities
Media and press inquiries
> Book a conversation
Your Data. Your Rules.
On-prem data, cloud control plane, transparent terms.
Trust & Scale
76,000+ GitHub Stars

One of the most popular open-source monitoring projects

SOC 2 Type 2 Certified

Enterprise-grade security and compliance

Data Sovereignty

Your metrics stay on your infrastructure

Validated
University of Amsterdam

"Most energy-efficient monitoring solution" — ICSOC 2023, peer-reviewed

ADASTEC (Autonomous Driving)

"Doesn't miss alerts—mission-critical trust for safety software"

Community Stats
615+ Contributors

Global community improving monitoring for everyone

1.5M+ Downloads/Day

Trusted by teams worldwide

GPLv3+ Licensed

Free forever, fully open source agent

Why Join?
Remote-First

Work from anywhere, async-friendly culture

Impact at Scale

Your work helps millions of systems

Classifiers icon

Classifiers

Classifiers

Plugin: netflow-plugin Module: classifiers

Overview

Annotate network flows with exporter and interface labels derived from reusable classification rules. Where static metadata forces you to enumerate every exporter and every ifIndex by hand, classifiers let you express the network design once – “anything matching ^edge- is the edge tier”, “any interface with BACKBONE-LUMEN in its description is on Lumen”, “any interface at 100Gbps is a core uplink” – and apply that labelling across the whole flow stream.

The plugin ships two rule lists, evaluated in YAML order:

  • enrichment.exporter_classifiers – runs once per exporter (cached). Sees the exporter’s IP and friendly name, and any classification slots already filled by static metadata or by earlier rules. Can set EXPORTER_GROUP / ROLE / SITE / REGION / TENANT.
  • enrichment.interface_classifiers – runs once per (exporter, interface) pair, applied twice per flow record (once for the input interface, once for the output). Sees everything an exporter rule sees plus Interface.Index / Name / Description / Speed / VLAN. Can set IN_IF_PROVIDER / OUT_IF_PROVIDER, IN_IF_CONNECTIVITY / OUT_IF_CONNECTIVITY, IN_IF_BOUNDARY / OUT_IF_BOUNDARY (1=external, 2=internal), and override IN_IF_NAME / DESCRIPTION / OUT_IF_NAME / DESCRIPTION.

The expression language is Akvorado-compatible for the documented operators and actions. It implements a subset of Akvorado’s expr-lang-derived grammar. Akvorado rules using only equality, comparison, in, contains, startsWith, endsWith, matches, &&, ||, !, parentheses, and the documented Classify* / Reject / Format actions will work; arithmetic, ternaries, lambdas, and arbitrary expr-lang features are not supported.

Output values written by Classify* actions are lowercased and stripped to ASCII alphanumerics + . + + + - before they reach the flow record. So ClassifyRegion("EU West") becomes euwest. Use SetName / SetDescription when you want to preserve case and whitespace – those write directly without normalisation.

For the cross-cutting Enrichment concept (where classifiers sit in the merge order vs static metadata, GeoIP, IPAM, BGP routing), see Enrichment.

Each rule is a single boolean expression; an action with no condition (e.g. Classify("edge") at top level) is treated as always-true and always fires. Rules are AND/OR-composed, so the typical shape is condition && Classify*(...). The plugin evaluates the list top to bottom, first-write-wins per slot: once EXPORTER_GROUP is set, no later rule can change it. Order rules from most-specific to least-specific.

Two short-circuit rules end the loop early. For exporter rules, the loop stops when group + role + site + region + tenant are all non-empty. For interface rules, the loop stops when connectivity + provider + boundary are all set. SetName / SetDescription / Reject do not contribute to short-circuit.

A rule that throws at runtime (e.g. comparing a string with >) breaks out of the loop for that record and keeps whatever was set so far. Use matches, startsWith, or contains on string fields instead of > / < to avoid this.

Akvorado parity: if metadata_static already filled any classification slot for the target, the matching classifier list does not run for that target – operator-provided classification has priority and the rules cannot override it. Don’t try to mix static and rule-based labelling on the same exporter or interface; pick one tool per target.

Results are cached. The exporter cache keys on ExporterInfo (ip + name). The interface cache keys on (exporter, exporter_classification, interface) – so when the exporter’s classification changes (for example after you push new static metadata and restart) the interface caches naturally invalidate. The cache TTL is enrichment.classifier_cache_duration (default 5 minutes). It is a last-access TTL so entries live as long as they’re queried.

This integration is only supported on the following platforms:

  • Linux

This integration runs as a single instance per Netdata Agent.

Default Behavior

Auto-Detection

Disabled by default. Both rule lists are empty; populate enrichment.exporter_classifiers and / or enrichment.interface_classifiers to enable.

Limits

Resource use scales with rule count and the number of distinct exporters and interfaces. The classifier cache limits repeat evaluation for stable exporter/interface inventories.

Performance Impact

Rules run at decode time, in the flow-pipeline hot path, so cost matters. The cache absorbs nearly all of it: per (exporter, interface) the rule list evaluates only on cache miss. Tune enrichment.classifier_cache_duration upwards (15-60 minutes) for very high-cardinality exporter / interface pools where the default 5 minutes still yields visible misses; tune downwards (30-60 seconds) when iterating on rule changes during a config session.

Setup

Prerequisites

Know what to classify

Classifiers shine when there is a pattern to match – exporter naming conventions (edge-..., core-...), management-IP subnets per site, SNMP interface descriptions that follow a template (BACKBONE-<carrier>, TRANSIT-..., IX-...), or 100Gbps-equals-core conventions. If your fleet has no such pattern, static metadata is the better fit – it lets you list each exporter and ifIndex by hand.

Configure interface metadata first if you want interface rules

The plugin does not poll SNMP itself, so Interface.Name, Interface.Description, and Interface.Speed are populated only from enrichment.metadata_static (the static-metadata integration card). If you have not configured interfaces: under metadata_static.exporters, those identifiers will be empty strings / zero, and any rule that matches against them will never fire. Interface.Index and Interface.VLAN come from the flow record itself and are always available.

Configuration

Options

Both lists live under enrichment:. Each entry is a free-form string containing a single rule expression. The cache TTL is one global setting.

OptionDescriptionDefaultRequired
enrichment.exporter_classifiersOrdered list of rules applied per exporter. Each rule is a string expression. Available identifiers: Exporter.IP, Exporter.Name, CurrentClassification.Group / .Role / .Site / .Region / .Tenant. Available actions: Classify / ClassifyGroup, ClassifyRole, ClassifySite, ClassifyRegion, ClassifyTenant, plus the *Regex(input, pattern, template) variants of each, plus Reject(). Interface-only actions (ClassifyProvider, ClassifyConnectivity, ClassifyExternal / ClassifyInternal, SetName, SetDescription) fail at runtime if used here.[]no
enrichment.interface_classifiersOrdered list of rules applied per (exporter, interface) pair. Sees everything an exporter rule sees, plus Interface.Index, Interface.Name, Interface.Description, Interface.Speed (bits per second), Interface.VLAN, and the per-interface CurrentClassification.Connectivity / .Provider / .Boundary / .Name / .Description. Available actions: ClassifyProvider, ClassifyConnectivity, ClassifyExternal(), ClassifyInternal(), SetName, SetDescription, Reject(), plus the *Regex variants of provider / connectivity. Exporter-only Classify* actions fail at runtime if used here.[]no
enrichment.classifier_cache_durationLast-access TTL for both classifier caches (exporter and interface). Values below 1 second are rejected. The cache prunes opportunistically – entries idle longer than the TTL are dropped on the next prune pass, capped at one prune every TTL or 30 seconds, whichever is smaller. Restart the plugin to clear caches outright when you change rules.5mno

via File

The configuration file name for this integration is netflow.yaml.

You can edit the configuration file using the edit-config script from the Netdata config directory.

cd /etc/netdata 2>/dev/null || cd /opt/netdata/etc/netdata
sudo ./edit-config netflow.yaml
Examples
Exporter classification by name pattern

Tag exporters by the prefix of their friendly name – the simplest and most common pattern. Falls back to a regex capture for the region code when the name encodes one. The final Reject() rule drops a test exporter from collection entirely.

enrichment:
  exporter_classifiers:
    # Group by name prefix.
    - 'Exporter.Name startsWith "edge-" && Classify("edge")'
    - 'Exporter.Name startsWith "core-" && Classify("core")'
    - 'Exporter.Name startsWith "agg-"  && Classify("aggregation")'

    # Site by management-IP subnet.
    - 'Exporter.IP startsWith "10.1." && ClassifySite("ny-dc1")'
    - 'Exporter.IP startsWith "10.2." && ClassifySite("par-dc1")'

    # Region from a name suffix like "edge-fra-01" -> "fra".
    - 'ClassifyRegionRegex(Exporter.Name, "-([a-z]{3})-[0-9]+$", "$1")'

    # Drop a lab exporter entirely.
    - 'Exporter.IP startsWith "192.0.2." && Reject()'
Interface classification from SNMP descriptions

Encode the boundary, the provider, and the connectivity tier from the interface description that your network team already maintains. The (?i) regex flag is the Rust regex inline-case-insensitive prefix.

enrichment:
  interface_classifiers:
    # Provider tag from a description prefix.
    - 'Interface.Description startsWith "BACKBONE-LUMEN"  && ClassifyProvider("Lumen")'
    - 'Interface.Description startsWith "BACKBONE-COGENT" && ClassifyProvider("Cogent")'
    - 'Interface.Description startsWith "BACKBONE-NTT"    && ClassifyProvider("NTT")'

    # Transit links: external boundary + connectivity tag.
    - 'Interface.Description contains "TRANSIT" && ClassifyConnectivity("transit") && ClassifyExternal()'

    # Peering and IX -- case-insensitive regex.
    - 'Interface.Description matches "(?i)^(IX|peering)-.*" && ClassifyConnectivity("peering") && ClassifyExternal()'

    # Internal customer-facing access ports.
    - 'Interface.Description startsWith "CUSTOMER-" && ClassifyConnectivity("customer") && ClassifyInternal()'
Boundary inferred from interface speed

A pragmatic shorthand when descriptions are unreliable but speed is consistent. 100Gbps and faster interfaces are core, 10Gbps are aggregation, 1Gbps and slower are access. Interface.Speed is in bits per second – numeric comparisons are safe.

enrichment:
  interface_classifiers:
    - 'Interface.Speed >= 100000000000 && ClassifyConnectivity("core")'
    - 'Interface.Speed >= 10000000000  && ClassifyConnectivity("aggregation")'
    - 'Interface.Speed >  0            && ClassifyConnectivity("access")'
Combining exporter context with interface rules

Interface rules see the exporter’s already-resolved classification via CurrentClassification.*. Use it to scope interface rules to specific tiers – for example: every interface on an edge exporter without a more-specific match falls back to “external”.

enrichment:
  exporter_classifiers:
    - 'Exporter.Name startsWith "edge-" && Classify("edge") && ClassifyRole("border")'
    - 'Exporter.Name startsWith "core-" && Classify("core") && ClassifyRole("backbone")'
  interface_classifiers:
    # Specific provider rules first (most-specific to least-specific).
    - 'Interface.Description startsWith "BACKBONE-LUMEN"  && ClassifyProvider("Lumen")'
    - 'Interface.Description startsWith "BACKBONE-COGENT" && ClassifyProvider("Cogent")'

    # Generic transit rule.
    - 'Interface.Description contains "TRANSIT" && ClassifyConnectivity("transit") && ClassifyExternal()'

    # Fallback: any unclassified interface on an edge box is external.
    - 'CurrentClassification.Role == "border" && CurrentClassification.Boundary == 0 && ClassifyExternal()'
Building values with Format and human-readable names

Format(pattern, args...) mimics Go’s fmt.Sprintf for %s, %v, %d, %%. Classify* normalises (lowercase + strip non-alphanumeric); SetName and SetDescription do not, so they preserve the case and spaces of the computed value.

enrichment:
  exporter_classifiers:
    # Tenant computed from name, normalised on write -> "tenant-edge01".
    - 'ClassifyTenant(Format("tenant-%s", Exporter.Name))'
  interface_classifiers:
    # Human-readable name = "<exporter>:if<index>". Preserved verbatim.
    - 'SetName(Format("%s:if%d", Exporter.Name, Interface.Index))'
Tuning the cache for a large fleet

The default 5-minute last-access TTL is right for steady-state. Raise it when the (exporter, interface) population is large enough that evicted entries are quickly re-queried. Lower it when actively iterating on rule changes so misses pick up the new rules quickly.

enrichment:
  classifier_cache_duration: 30m
  exporter_classifiers:
    - 'Exporter.Name startsWith "edge-" && Classify("edge")'
  interface_classifiers:
    - 'Interface.Speed >= 100000000000 && ClassifyConnectivity("core")'

Metrics

Tags flow records with EXPORTER_GROUP / ROLE / SITE / REGION / TENANT (from exporter rules) and IN_IF_PROVIDER / OUT_IF_PROVIDER, IN_IF_CONNECTIVITY / OUT_IF_CONNECTIVITY, IN_IF_BOUNDARY / OUT_IF_BOUNDARY, IN_IF_NAME / OUT_IF_NAME, IN_IF_DESCRIPTION / OUT_IF_DESCRIPTION (from interface rules). Verify on the Network Flows view via those columns. Boundary is 1 for external and 2 for internal.

Alerts

There are no alerts configured by default for this integration.

Plugin fails to start with a parser error

A rule failed to parse. The journal log includes the index in the list and a parser context (unsupported rule term, unsupported value expression, Reject() does not accept arguments, etc.). Common causes: missing && between condition and action; an action used in the wrong list (ClassifyExternal in an exporter rule); strings written with single quotes (only JSON-style double quotes are accepted); regex literals that fail to compile.

Classifier rules never run for an exporter or interface

Likely cause: metadata_static already set any classification field on that target. By design, the matching list is suppressed entirely when the classification is non-empty. Either remove the static-metadata entry for that target, or keep static-metadata as the sole source for it.

A value appears differently in the dashboard than in the rule

Classify* actions normalise output to [a-z0-9.+-] only – so ClassifyRegion("EU West") lands as euwest, and Classify("Edge_Tier_1") lands as edgetier1. Use SetName / SetDescription to preserve case and whitespace; those write the value verbatim.

First rule always wins, later rules never fire for the same slot

First-write-wins is by design and per slot. Order your rules from most-specific to least-specific. If you want a tiered fallback, use distinct slots (e.g. Classify for the broad group and ClassifyRole for the tier within that group).

A working rule stops matching some time after startup

Cached results expire after classifier_cache_duration (default 5 minutes, last-access). When you change rules, restart the plugin so the caches clear immediately – otherwise stale cached classifications keep returning until they idle out.

A rule with > or < aborts the rule list

Comparing a string-typed identifier with > / < / >= / <= raises a runtime error, and the loop breaks out for that record. Subsequent rules in the list are skipped for that record. Use matches, startsWith, endsWith, contains, or == / != on string fields. Keep > / < for Interface.Index, Interface.Speed, and Interface.VLAN (the numeric identifiers).

ClassifyExternal fires only on one side

Interface classifiers run twice per flow record – once for the input interface, once for the output. Both invocations see the same rule list. If your rule conditions on Interface.Index == 42 and that ifIndex appears in IN_IF of one flow and OUT_IF of another, the rule fires correctly in both places. But the IN_IF_BOUNDARY / OUT_IF_BOUNDARY columns are independent – a rule firing on the output side of a flow only sets the output side’s boundary, and vice versa.

Interface fields are empty in the rule even though SNMP is configured

The plugin does not poll SNMP – Interface.Name, Description, and Speed come exclusively from enrichment.metadata_static.exporters.<ip>.interfaces.<index>. If you populate them through an external SNMP discovery and write them into metadata_static, the rules will see them. Otherwise those fields resolve to empty strings / zero, and any rule that conditions on them never matches.

Referencing Interface.* in an exporter rule silently does nothing

Field resolution does not error when the wrong context is missing – it returns the type’s zero value. So Interface.Speed >= 1 written in an exporter_classifiers rule resolves to 0 >= 1 (false) on every call. Use interface_classifiers for any rule that needs an interface field.

The observability platform companies need to succeed

Sign up for free

Want a personalised demo of Netdata for your use case?

Contact Sales