👋 Hi, I’m Bjørnar Lintvedt
I’m a Senior Network Consultant at Bluetree, working at the intersection of networking and software development.
As mentioned in my first blog post, I’m preparing for the CCIE Automation lab exam — Cisco’s most advanced certification for network automation and programmability. I’m documenting the journey here with weekly, hands-on blog posts tied to the blueprint.
This week I wanted to dive deeper into Model-Driven Telemetry (MDT). Instead of manually polling devices for operational data, MDT allows streaming real-time metrics from network devices to monitoring systems — giving insights into performance, state, and anomalies as they happen.
Model-Driven Telemetry is the foundation for proactive, data-driven network operations. It lets us:
Stream metrics from devices in real-time (CPU, memory, interfaces, BGP peers)
Use YANG models to define exactly what data we want
Choose between periodic polling, periodic push, or event-driven subscriptions
Visualize data in Grafana or feed it into analytics platforms
I created a MDT solution for Cisco IOS-XE devices, integrated into my Nautix platform:
Subscriptions: Created using YANG models to collect CPU, memory, temperature and CDP neighbors operational data
Streaming: Configured dial-out gRPC telemetry to Telegraf
Visualization: Built Grafana dashboard showing device metrics
Optimization: Tuned subscriptions with XPath filters, cadence settings, and on-change triggers
Before configuring telemetry on your devices, you need the TIG stack (Telegraf → InfluxDB → Grafana) to receive and visualize the data. Here’s how I set it up locally using Docker Compose.
1. Start the TIG stack
I assume you have already cloned the repository and have done the initial setup as per readme.
In the root of the repositoryrepo, do:
docker-compose up
This spins up:
InfluxDB – stores telemetry data
Grafana – dashboards and visualization
Telegraf – optional local agent if needed for transformation or collection
2. Run the Ansible Playbook
Configure telemetry subscriptions on your devices (ensure you have run device discovery first):
docker exec -it automation ansible-playbook -i ansible/hosts.yml ansible/configure_telemetry.yml
This playbook:
Creates subscriptions using YANG models
Configures cadence, on-change triggers, and dial-out streams
Points the telemetry data to your InfluxDB instance
3. Check the Telemetry Stream
On the devices, verify subscriptions:
show telemetry ietf subscription all
Check that the subscription is connected to Telegraf:
show telemetry ietf subscription 1 receiver
4. Visualize in Grafana
http://localhost:3000
), login with admin/secretservices/grafana/nautix_dashboard.json
Here’s the updated folder structure reflecting new or modified files:
📂 services/automation/ansible/
configure_telemetry.yml
– Ansible playbook to create telemetry subscriptions (new/updated)
group_vars/discovered.yml
– Variables used for telemetry configuration
📂 services/grafana/
influxdb.yml
– Grafana data source configuration for InfluxDB
nautix_dashboard.json
- Exported dashboard
📂 services/telegraf/
telegraf.conf
– Telegraf configuration
📂 docker-compose.yml
– Spins up InfluxDB, Grafana, Telegraf, and rest of the Nautix app
Let’s break it down step by step.
configure_telemetry.yml
sets up telemetry subscriptions on Cisco IOS-XE devices using YANG xpath
group_vars/discovered.yml
are used for dynamic configuration
Docker Compose starts Telegraf, InfluxDB and Grafana, providing a fully integrated telemetry environment
Configured via telegraf.conf
to parse telemetry streams from devices and forward metrics to InfluxDB
Set up very basic
Before, operational data required manual CLI commands or SNMP polling. Now:
✔ Metrics are streamed continuously, reducing lag
✔ On-change subscriptions minimize unnecessary data
✔ Dashboards provide actionable insights at a glance
Use case "I": Model driven telemetry