Flow Telemetry
The Flow telemetry record contains per-flow metadata produced by the DPI engine and flow tracker. Emitted at detection and during DPI updates and completion, it reports detected application and protocol identifiers, hostnames (SNI/HTTP Host), TLS certificate details, and protocol-specific metadata used for classification and enrichment.
Use the Flow record for event-driven detection, enrichment, routing decisions, and early-alerting workflows. For periodic bandwidth and KPI reporting use the Flow Stats Telemetry, and for final per-session counters and end-state details use the Flow Purge Telemetry.
See the telemetry direction conventions for information on the meanings of local and other prefixes.
Requirements
- Install and configure the Netify Agent
- Install and configure a Sink Plugin for receiving the telemetry
- Install and configure the Core Plugin and add stream-flows to types
- Source
- Core Plugin
- Plugin Release
- 1.0.20
Flow Detection Lifecycle
The flow record format is used by three different stages of the flow detection lifecycle:
- flow
- Triggers the moment a new flow is detected.
- flow_dpi_update
- Triggers on a mid-stream refinement, for example, a TLS certificate detail after deeper packet analysis.
- flow_dpi_complete
- Marks the exact point the DPI engine has completed the flow analysis.
In most cases, the flow_dpi_complete is the only stage that you should be using for flow bandwidth stats and analytics. The flow and flow_dpi_update stages are typically used for special early-detection use cases involving routing, firewalling and QoS.
Optimizations
Flow Digests
The digest is a 7-tuple derived from the following flow properties:
- source IP
- destination IP
- source port
- destination port
- IP protocol (TCP, UDP, etc)
- VLAN ID
- network interface
As protocol dissection and classification occurs, additional properties are added to the digest and tracked in the digest_prev array. As an integrator, the only value of interest is the very first index (0), which will always be the 7-tuple digest that will never change over the entire duration of the flow tracking. For Netify 5.2 or later, digest_prev will always exist. For earlier versions, the digest should be used if digest_prev does not exist.
Stats: Bytes, Rates and Packets
The byte, rate, and packet counters in the flow record reflect activity observed during a specific interval of the flow lifecycle. While these values are useful for quick analysis and real-time decision-making, they are not intended for calculating cumulative flow totals.
For accurate aggregation and historical analysis, flow stats data should be used, as it is designed to capture detailed metrics across defined time buckets.
Attributes
flow
object
flow.app_ip_override
boolean
flow.app_proto_twins
boolean
flow.bt
object
flow.bt.info_hash
string
flow.category
object
flow.category.application
integer
flow.conntrack
object
flow.conntrack.id
integer
flow.conntrack.mark
integer
flow.conntrack.reply_dst_ip
string
flow.conntrack.reply_dst_port
integer
flow.conntrack.reply_src_ip
string
flow.conntrack.reply_src_port
integer
flow.detected_protocol_name
string
flow.detection_guessed
boolean
flow.detection_packets
integer
flow.detection_updated
boolean
flow.dhc_hit
boolean
flow.dhcp
object
flow.dhcp.class_ident
string
flow.dhcp.fingerprint
string
flow.digest
string
flow.digest_prev
array
flow.dns_host_name
string
flow.fhc_hit
boolean
flow.first_seen_at
integer
flow.gtp
object
flow.gtp.ip_dscp
integer
flow.gtp.ip_version
integer
flow.gtp.local_ip
string
flow.gtp.local_port
integer
flow.gtp.local_teid
integer
flow.gtp.other_ip
string
flow.gtp.other_port
integer
flow.gtp.other_teid
integer
flow.gtp.other_type
string
flow.gtp.version
integer
flow.host_server_name
string
flow.http
object
flow.http.url
string
flow.http.user_agent
string
flow.ip_dscp
integer
flow.ip_nat
boolean
flow.ip_version
integer
flow.last_seen_at
integer
flow.local_bytes
integer
flow.local_ip
string
flow.local_mac
string
flow.local_origin
boolean
flow.local_packets
integer
flow.local_port
integer
flow.local_rate
number
flow.mdns
object
flow.mdns.answer
string
flow.nfq
object
flow.nfq.dst_iface
string
flow.nfq.src_iface
string
flow.other_bytes
integer
flow.other_ip
string
flow.other_mac
string
flow.other_packets
integer
flow.other_port
integer
flow.other_rate
number
flow.other_type
string
flow.risks
object
flow.risks.ndpi_risk_score
integer
flow.risks.ndpi_risk_score_client
integer
flow.risks.ndpi_risk_score_server
integer
flow.risks.risks
array
flow.soft_dissector
boolean
flow.ssl
object
flow.ssl.alpn
array
flow.ssl.alpn_server
array
flow.ssl.cipher_suite
string
flow.ssl.client_ja4
string
flow.ssl.client_sni
string
flow.ssl.encrypted_ch_version
string
flow.ssl.fingerprint
string
flow.ssl.issuer_dn
string
flow.ssl.server_cn
string
flow.ssl.subject_dn
string
flow.ssl.version
string
flow.ssh
object
flow.ssh.client
string
flow.ssh.server
string
flow.ssdp
object
flow.ssdp.user_agent
string
flow.stun
object
flow.stun.mapped
string
flow.stun.other
string
flow.stun.peer
string
flow.stun.relayed
string
flow.stun.response
string
flow.tags
array
flow.tcp
object
flow.tcp.resets
integer
flow.tcp.retrans
integer
flow.tcp.seq_errors
integer
flow.total_bytes
integer
flow.total_packets
integer
flow.vlan_id
integer
interface
string
internal
boolean
type
string
Flow Attributes - Example
{
"flow": {
"app_ip_override": false,
"category": {
"application": 28,
"domain": 0,
"local_network": 0,
"other_network": 0,
"overlay": 0,
"protocol": 22
},
"conntrack": {
"id": 3603527535,
"mark": 0,
"reply_dst_ip": "192.168.4.44",
"reply_dst_port": 35636,
"reply_src_ip": "192.200.0.102",
"reply_src_port": 443
},
"detected_application": 11354,
"detected_application_name": "netify.tailscale",
"detected_protocol": 196,
"detected_protocol_name": "HTTP/S",
"detection_guessed": false,
"detection_updated": false,
"dhc_hit": false,
"digest": "c4c07ca55baa19a7fe3652bcd356765a7...",
"digest_prev": [
"463c53093403fcce8eeb01df5b5125df66a0f53b"
],
"dns_host_name": "login.tailscale.com",
"fhc_hit": false,
"first_seen_at": 1772738467573,
"host_server_name": "login.tailscale.com",
"ip_dscp": 0,
"ip_nat": false,
"ip_protocol": 6,
"ip_version": 4,
"last_seen_at": 1772738467684,
"local_ip": "192.168.4.44",
"local_mac": "f8:e9:03:01:69:13",
"local_origin": true,
"local_port": 35636,
"other_ip": "192.200.0.102",
"other_mac": "3c:7c:3f:a1:ed:58",
"other_port": 443,
"other_type": "remote",
"risks": {
"ndpi_risk_score": 0,
"ndpi_risk_score_client": 0,
"ndpi_risk_score_server": 0,
"risks": []
},
"soft_dissector": false,
"ssl": {
"alpn": [
"h2",
"http/1.1"
],
"cipher_suite": "0x0000",
"client_ja4": "t13d1817h2_e8a523a41297_...",
"client_sni": "login.tailscale.com",
"encrypted_ch_version": "0xfe0d",
"version": "0x0303"
},
"vlan_id": 0
},
"interface": "wlp3s0",
"internal": true,
"type": "flow"
}