Dear community,
I am having an issue with setting up BGP alerts and received multiple false positive alerts. I have gathered as much information to find the problem here, but let me know if you need any additional information.
Kind regards,
Tom
The output of ./validate.php
[librenms@nmsgui-pop1 ~]$ ./validate.php
===========================================
Component | Version
--------- | -------
LibreNMS | 25.10.0 (2025-11-12T13:02:16+00:00)
DB Schema | 2025_09_24_145502_add_port_security_table (357)
PHP | 8.4.8
Python | 3.9.21
Database | MariaDB 11.8.5-MariaDB
RRDTool | 1.7.2
SNMP | 5.9.1
===========================================
[OK] Installed from package; no Composer required
[OK] Database Connected
[OK] Database Schema is current
[OK] SQL Server meets minimum requirements
[OK] lower_case_table_names is enabled
[OK] MySQL engine is optimal
[OK] Database and column collations are correct
[OK] Database schema correct
[OK] MySQL and PHP time match
[OK] Distributed Polling setting is enabled globally
[OK] Connected to rrdcached
[OK] Active pollers found
[OK] Dispatcher Service is enabled
[OK] Locks are functional
[OK] No python wrapper pollers found
[OK] Redis is functional
[OK] rrdtool version ok
[OK] Connected to rrdcached
[WARN] Non-git install, updates are manual or from package
My BGP alert template
<html>
<head>
<title>{{ $alert->title }}</title>
<style type="text/css">
body {
margin: 15px;
font-family: 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif;
font-size: 14px;
line-height: 20px;
color: #333333;
background-color: #fff;
font-weight: 400;
}
.box {
position: relative;
-webkit-border-radius: 0px;
-moz-border-radius: 0px;
border-radius: 0px;
background: #ffffff;
margin-bottom: 10px;
width: 100%;
box-shadow: 0 0 2px rgba(0, 0, 0, 0.12), 0 2px 4px rgba(0, 0, 0, 0.24);
}
.no-padding {
padding: 0 !important;
}
.table {
max-width: 600px;
background-color: #fff;
border-collapse: collapse;
border-spacing: 0;
color: #333;
}
.table th, .table td {
padding: 5px 10px;
line-height: 20px;
text-align: left;
vertical-align: top;
border-top: 1px solid #f4f4f4;
}
.table tbody > tr:nth-child(even) > td, .table tbody > tr:nth-child(even) > th {
background-color: #f9f9f9;
}
.table .state-marker, .state-marker {
padding: 0px;
margin: none;
width: 7px;
}
.table tbody > tr > td.state-marker {
background-color: #004774;
}
.table .ALERT .state-marker {
background-color: #bd1e1e;
}
.table tbody > tr.ALERT > td {
background-color: #ffebee;
}
.ALERT {
color: red;
}
.table .ACKNOWLEDGED .state-marker {
background-color: rgb(187, 135, 4);
}
.table tbody > tr.ACKNOWLEDGED > td {
background-color: #fff8eb;
}
.ACKNOWLEDGED {
color: goldenrod;
}
.table .RECOVERED .state-marker {
background-color: rgb(0, 92, 0);
}
.table tbody > tr.RECOVERED > td {
background-color: #ebffec;
}
.RECOVERED {
color: green;
}
.header { font-size: 20px; font-weight: bold; padding: 10px;}
</style>
</head>
<body>
<table class="table box box-solid">
<tbody>
@if ($alert->state == 1) <tr class="ALERT">
@elseif ($alert->state == 2) <tr class="ACKNOWLEDGED">
@elseif ($alert->state == 0) <tr class="RECOVERED">
@elseif ($alert->state == 3) <tr class="RECOVERED">
@else <tr class="RECOVERED">
@endif
<td class="state-marker"></td>
<td colspan=2 style="padding: 10px; text-transform: uppercase;" class="header">
@if ($alert->state == 1) <span class="ALERT">{{ $alert->severity }} ALERT @endif
@if ($alert->state == 2) <span class="ACKNOWLEDGED">acknowledged @endif</span>
@if ($alert->state == 3) <span class="RECOVERED">recovering @endif</span>
@if ($alert->state == 0) <span class="RECOVERED">recovered @endif</span>
</td>
</tr>
<tr>
<td colspan=2><strong>Alert</strong></td>
<td @if ($alert->state == 1) style="color:red" @endif><strong>BGP Peer Down</strong></td>
</tr>
<tr>
<td colspan=2><strong>Entity</strong></td>
<td><strong><a href="https://nmsgui-pop1.domain.net/device/{{ $alert->device_id }}/" class="entity-popup red" data-eid="{{ $alert->device_id }}" data-etype="device">{{ explode('.', $alert->hostname)[0] }}</a></strong></td>
</tr>
<tr>
<td colspan=2><strong>Duration</strong></td>
<td>{{ $alert->elapsed }} ({{ $alert->timestamp }})</td>
</tr>
@foreach ($alert->faults as $key => $value)
<tr>
<td colspan=2><strong>Peer #{{ $key }}</strong></td>
<td> {{ $value['bgpPeerIdentifier'] }} </td>
</tr>
@endforeach
<tr>
<td colspan=3 style="padding: 10px; text-transform: uppercase; text-align: center; font-size: 16px;" class="header">Device details</td>
</tr>
<tr>
<td colspan=2><strong>Device</strong></td>
<td><strong><a href="https://nmsgui-pop1.domain.net/device/{{ $alert->device_id }}/" class="entity-popup red" data-eid="{{ $alert->device_id }}" data-etype="device">{{ $alert->hostname }}</a></strong></td>
</tr>
<tr>
<td colspan=2><strong>Hardware</strong></td>
<td>{{ $alert->hardware }}</td>
</tr>
<tr>
<td colspan=2><strong>Operating System</strong></td>
<td>{{ $alert->os }} {{ $alert->version }}</td>
</tr>
<tr>
<td colspan=2><strong>Device Location</strong></td>
<td>{{ $alert->location }}</td>
</tr>
<tr>
<td colspan=2><strong>Uptime</strong></td>
<td>{{ $alert->uptime_long }}</td>
</tr>
</tbody>
</table>
</body>
</html>
Router status
Welcome to VyOS!
┌── ┐
. VyOS 1.5-rolling-202410100851
└ ──┘ current
* Documentation: https://docs.vyos.io/en/latest
* Project news: https://blog.vyos.io
* Bug reports: https://vyos.dev
You can change this banner using "set system login banner post-login" command.
VyOS is a free software distribution that includes multiple components,
you can check individual component licenses under /usr/share/doc/*/copyright
user@router1-pop1:~$ sh bgp sum
IPv4 Unicast Summary (VRF default):
BGP router identifier 192.168.136.213, local AS number 12345 vrf-id 0
BGP table version 15675
RIB entries 311, using 29 KiB of memory
Peers 2, using 141 KiB of memory
Peer groups 1, using 256 bytes of memory
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd PfxSnt Desc
192.168.7.3 4 12345 6858 6177 15675 0 0 23:40:48 21 6 N/A
192.168.35.229 4 12345 0 0 0 0 0 never Active 0 N/A
Total number of neighbors 2


