Logo

dev-resources.site

for different kinds of informations.

Monitoring Modbus via Prometheus and Grafana

Published at
11/29/2024
Categories
modbus
prometheus
grafana
devops
Author
azaurus
Categories
4 categories in total
modbus
open
prometheus
open
grafana
open
devops
open
Author
7 person written this
azaurus
open
Monitoring Modbus via Prometheus and Grafana

Overview:

In this blog post, I will be outlining the decisions and challenges faced during the process of bringing modern observability practices to the problem of monitoring the status of remote radio sites.

Objectives:

The following are the objectives and expected outcomes of doing so:
A robust and highly available modern observability system that provides near real time latency.
Data persistence for auditing purposes
All provided via 4G due to the remoteness of the radio sites.

Importance of monitoring remote sites:

When I say the radio sites are remote, I mean that for anyone to access them to maintain, monitor or upgrade the hardware running at the site, a helicopter is required, making costs sky rocket unnecessarily.

Understanding the Technologies:

4G IoT Routers:

Despite the remoteness, the locations of the radio sites (on top of hills and mountains) are very close to existing mobile network cell sites (also on top of hills and mountains luckily), this provides us the opportunity to leverage this existing network with a 4G IoT router.

In this case, the 4G IoT router that we'll be using is the Teltonika RUT240, which comes shipped with Teltonika Network's own OpenWrt based operating system, which implements many ways to collect and forward data from our remote sites, making the job a lot easier.

Overview of Modbus:

Modbus is an industrial protocol developed in the late 1970s to provide communication between automation devices. More recently, Modbus has been upgraded to include implementations over TCP/IP aswell as serial and UDP.

A brief overview is that Modbus is:

  • A request-response protocol
  • One device acts as a master (responsible for initiating interactions)
  • One device acts as a slave (usually a sensor, a programmable logic controller, etc.)

In our case, we will be using modbus to monitor the various analog variables such as battery voltage, solar panel power output, switches which can be triggered through various means, and we'll be doing this with an ioLogik E2242 from Moxa, which is a universal controller that has 4 analog inputs (which we can use to monitor our battery voltage, etc.) and 12 digital input-outputs (which we will use for our switches, essentially a boolean).

Intro to Prometheus and Grafana:

Prometheus and Grafana are both open-source tools, widely used for monitoring and alerting on infrastructure.

Prometheus:

Prometheus is a time-series database that follows a pull model, meaning that on the initialisation of the Prometheus instance, you provide a list of targets which are scraped automatically, and the metrics are stored in the time-series database with the time they were scraped. At time of writing according to 6sense, Prometheus is used by 7528 companies worldwide: source.

Grafana:

Grafana is an open source analytics and interactive visualisation web application, in conjunction with Prometheus is provides us the ability to query and visualise the data gathered by Prometheus, it also allows us to alert over the web based on certain rules. It is widely used for monitoring applications and system performance, its users include Bloomberg, JP Morgan Chase, eBay, etc.

System Architecture:

High level architecture diagram:

Image description

Integration points and data flow:

Each components role:

Analog Device:

Our analog device that we are wanting to monitor the status of at the remote location, whats being monitored here is:

  • Voltage
  • Current
  • Switches

Moxa ioLogik e2242:

The universal controller, which is connected physically to our analog device, with the voltage and current which we are monitoring connected to the Analog Input (AI) channels and the switches which are being monitored are connected to the digital input (DI) channels. This is also our Modbus 'server', which allows us to make those values available via the Modbus protocol.

Teltonika RUT240:

Communicates via Modbus with the Moxa ioLogik collects data and sends it via HTTP to the Modbus exporter.

Modbus Exporter:

An HTTP server written in Go, which receives data sent from the Teltonika, stores it in memory, and makes it available in the format that Prometheus expects it on the /mertics route.

Prometheus:

Polls the /metrics route on the Modbus exporter, reads the values returned, and stores it in the time-series database against the time which it was retrieved.

Grafana:

Queries the data stored in the Prometheus database, and allows users to visualise the data in dashboards and provides the ability to send alerts via many channels (email, phone call, etc.) when metrics reach certain thresholds.

Data flow:

  1. Data flows from the analog device to the Moxa ioLogik e2242, being captured via its data acquisition capabilities.
  2. The Moxa ioLogik e2242 sends this data to the Teltonika RUT240 using the Modbus protocol.
  3. The Teltonika RUT240 posts this data to the Modbus Exporter in a suitable format for Prometheus to scrape.
  4. Prometheus periodically polls the Modbus Exporter to retrieve the latest metrics.
  5. Users can then query Prometheus from Grafana to visualise the data on dashboards.
  6. If certain conditions are met (as defined by alert rules in Prometheus or Grafana), alerts are triggered and sent out through the appropriate channels: webhook, mobile, and email.

Developing the Prometheus Exporter:

Challenges and requirements:

The main challenge for developing the Modbus Prometheus Exporter was the fact that we could not gather information from the Teltonika directly via a GET request, and that we would need to receive data on a schedule via POST requests coming from the Teltonika, this posed 2 issues:

  • Inadvertently displaying data when the Teltonika is not sending data correctly, giving the impression that the system is functioning correctly when it is not.
  • Possible delays over 4G

To overcome these issues, it was important to provide some buffer time of about 20% in case of any delays in the 4G network, and when this time span is breached, the Exporter will set a health flag to false, this indicates that either:

  1. The Teltonika is down completely, or
  2. That there has been a delay in sending the data from the site.

We can then use this value to invalidate any data on the /metrics route, and also use this to send alerts on the health of the data being sent from the site.

Key functionalities and features:

Exporter:

  • Very easy to deploy and configure
  • Provides ability to invalidate data on missed data.

Go:

  • Speed, Go is known for powerful performance
  • Internet Friendly, Go is used extensively for Web development
  • Fast Garbage collection.
  • Easy to maintain.
  • Easy to learn.

Cover image by Abinesh R

prometheus Article's
30 articles in total
Favicon
Monitoring AWS Infrastructure: Building a Real-Time Observability Dashboard with Amazon CloudWatch and Prometheus
Favicon
Monitor Your Static App memory usage EC2 Instances with Prometheus and Grafana
Favicon
Scraping Custom Django Metrics with Prometheus
Favicon
Prometheus
Favicon
[HANDS ON] Service Discovery in Prometheus
Favicon
CloudOps Challenge - Real-Time Projects
Favicon
Prometheus Instance Exposed
Favicon
Deploying Prometheus With Docker
Favicon
Prometheus json_exporter: Monitor any JSON API endpoint with Prometheus
Favicon
Prometheus for Absolute Beginners
Favicon
Dockerized Deployment of a Full Stack Application with Reverse Proxy, Monitoring & Observability
Favicon
Monitoring Containerized Applications with Kubernetes Tools: A Comprehensive Guide
Favicon
What is Observability?
Favicon
Kubernetes Metrics and Monitoring with Prometheus and Grafana
Favicon
Monitoring Modbus via Prometheus and Grafana
Favicon
RabbitMQ Monitoring with Prometheus and Grafana
Favicon
Docker with Prometheus and Grafana: Real-Time Monitoring Simplified
Favicon
How to Configure a Remote Data Store for Prometheus
Favicon
EKS & NGINX Load Balancer Monitor with Prometheus, Grafana, andย Alerts
Favicon
[Open Source] Simplify Metrics Reporting in NestJS with a Zero-Dependency-Injection Global Reporter
Favicon
Docker to the Rescue: Deploying React And FastAPI App With Monitoring
Favicon
A Beginner's Guide To Service Discovery in Prometheus
Favicon
Usando stack de monitoria opensource no Kubernetes (sem Prometheus)
Favicon
Prometheus - How it's work
Favicon
Prometheus 3.0: A Quantum Leap in Monitoring
Favicon
Observability - 3(Prometheus Explanation)
Favicon
Observability - 2(Metrics, Monitoring & Prometheus)
Favicon
Golang com Opentelemetry, prometheus, Grafana tempo OSS e Grafana padrรฃo
Favicon
Prometheus vs CloudWatch for Cloud Native Applications (Updated in 2024)
Favicon
Prometheus Stack Components Usage in K8 Cluster using Helm

Featured ones: