TX packets overrun-f5-False

error
health-checks
false
f5
TX packets overrun-f5-False
0

#1

TX packets overrun-f5-False

Vendor: f5

OS: False

Description:
Indeni tracks the number of packets that had issues and alerts if the ratio is too high.

Remediation Steps:
Packet overruns usually occur when there are too many packets being inserted into the port’s memory buffer, faster than the rate at which the kernel is able to process them.

How does this work?
The amount of transmit overruns for the interface is retrieved by running “ifconfig -a”.

Why is this important?
If the capacity of the interface is exceeded, the frame that is currently being received is dropped and the overrun counter is incremented. It is important to track this in order to know if the capacity of an interface is sufficient.

Without Indeni how would you find this?
An administrator could log into the device through SSH and execute the command “ifconfig -a” to see the statistics of each VLAN interface.

f5-ifconfig

#! META
name: f5-ifconfig
description: Get vlan interface statistics and connected networks table
type: monitoring
monitoring_interval: 1 minute
requires:
    vendor: "f5"
    product: "load-balancer"
    linux-based: "true"
    shell: "bash"

#! COMMENTS
network-interface-rx-packets:
    why: |
        Tracking the number of packets flowing through each network interface is important to identify potential issues, spikes in traffic, etc.
    how: |
        This alert logs into the F5 unit through the F5 iControl REST API and retrieves the metrics from all network interfaces. In that output, it looks for the number of packets received through the interface.
    without-indeni: |
        An administrator could log into the device through SSH and execute the command "ifconfig -a" to see the statistics of each VLAN interface.
    can-with-snmp: true
    can-with-syslog: false
network-interface-rx-dropped:
    why: |
        If incoming packets are being dropped on a network interface, it is important to be aware of it. This may be due to a high load on the unit, or another capacity issue.
    how: |
        This alert logs into the F5 unit through the F5 iControl REST API and retrieves the metrics from all network interfaces. In that output, it looks for the number of packets dropped on an interface.
    without-indeni: |
        An administrator could log into the device through SSH and execute the command "ifconfig -a" to see the statistics of each VLAN interface.
network-interface-tx-dropped:
    why: |
        If outgoing packets are being dropped on a VLAN interface, it is important to be aware of it. This may be due to a high load on the unit, or another capacity issue. It is also common on an F5 to get a large amount of drops if the VLAN tag configuration on a trunk does not match the peer device.
    how: |
        This script logs into the F5 unit through SSH and retrieves the status of all VLAN interfaces. In that output, it looks for the number of packets dropped on an interface.
    without-indeni: |
        An administrator could log into the device through SSH and execute the command "ifconfig -a" to see the statistics of each VLAN interface.
    can-with-snmp: true
    can-with-syslog: false
network-interface-rx-bytes:
    why: |
        Tracking the amount of data flowing through each VLAN interface is important to identify potential issues, spikes in traffic, etc.
    how: |
        An administrator could log into the device through SSH, entering TMSH and executing the command "show net vlan interfaces all-properties" to see the statistics of each VLAN interface.
    without-indeni: |
        An administrator could log into the device through SSH and execute the command "ifconfig -a" to see the statistics of each VLAN interface.
    can-with-snmp: true
    can-with-syslog: false
network-interface-tx-bytes:
    why: |
        Tracking the amount of data flowing through each VLAN interface is important to identify potential issues, spikes in traffic, etc.
    how: |
        This alert logs into the F5 unit through SSH and retrieves the status of all VLAN interfaces. In that output, it looks for the number of bytes transmitted through the interface.
    without-indeni: |
        An administrator could log into the device through SSH and execute the command "ifconfig -a" to see the statistics of each VLAN interface.
    can-with-snmp: true
    can-with-syslog: false
network-interface-mac:
    why: |
        To be able to search for MAC addresses in indeni, this data needs to be stored.
    how: |
        The state of the interface is retrieved by logging into the device through SSH and running "ifconfig -a".
    without-indeni: |
        An administrator could log into the device through SSH and execute the command "ifconfig -a" to see the mac address of each VLAN interface.
    can-with-snmp: true
    can-with-syslog: false
network-interface-state:
    why: |
        Interfaces in the "down" state could result in downtime or reduced redundancy.
    how: |
        The state of the interface is retrieved by logging into the device through SSH and running "ifconfig -a".
    without-indeni: |
        An administrator could log into the device through SSH and execute the command "ifconfig -a" to see the state of each VLAN interface.
    can-with-snmp: true
    can-with-syslog: false
network-interface-mtu:
    why: |
        The MTU sometimes needs to be adjusted. Storing this gives an administrator an easy way to view the MTU from a large number of devices, as well as identifying incorrectly set MTU.
    how: |
        The state of the interface is retrieved by logging into the device through SSH and running "ifconfig -a".
    without-indeni: |
        An administrator could log into the device through SSH and execute the command "ifconfig -a" to see the MTU of each VLAN interface.
    can-with-snmp: true
    can-with-syslog: false
network-interface-ipv4-address:
    why: |
        To be able to search for IP addresses in indeni, this data needs to be stored.
    how: |
        The state of the interface is retrieved by logging into the device through SSH and running "ifconfig -a".
    without-indeni: |
        An administrator could log into the device through SSH and execute the command "ifconfig -a" to see the IP address of each VLAN interface.
    can-with-snmp: true
    can-with-syslog: false
network-interface-ipv4-subnet:
    why: |
        To be able to search for IP addresses in indeni, this data needs to be stored.
    how: |
        The subnet of the interface is retrieved by running "ifconfig -a".
    without-indeni: |
        An administrator could log into the device through SSH and execute the command "ifconfig -a" to see the subnet of each VLAN interface.
    can-with-snmp: true
    can-with-syslog: false
network-interface-rx-overruns:
    why: |
        If the capacity of the interface is exceeded, the frame that is currently being  received is dropped and the overrun counter is incremented. It is important to track this in order to know if the capacity of an interface is sufficient.
    how: |
        The amount of receive overruns for the interface is retrieved by running "ifconfig -a".
    without-indeni: |
        An administrator could log into the device through SSH and execute the command "ifconfig -a" to see the statistics of each VLAN interface.
    can-with-snmp: true
    can-with-syslog: false
network-interface-rx-frame:
    why: |
        A high frame number means a lot of packages did not end on a 32bit/4 byte boundary.
    how: |
        The frame counter for the interface is retrieved by running "ifconfig -a".
    without-indeni: |
        An administrator could log into the device through SSH and execute the command "ifconfig -a" to see the statistics of each VLAN interface.
    can-with-snmp: true
    can-with-syslog: false
network-interface-tx-packets:
    why: |
        Tracking the number of packets flowing through each VLAN interface is important to identify potential issues, spikes in traffic, etc.
    how: |
        This alert logs into the F5 unit through SSH and retrieves the status of all VLAN interfaces. In that output, it looks for the number of packets transmitted through the interface.
    without-indeni: |
        An administrator could log into the device through SSH and execute the command "ifconfig -a" to see the statistics of each VLAN interface.
    can-with-snmp: true
    can-with-syslog: false
network-interface-tx-errors:
    why: |
        Transmit errors on an interface could indicate a problem with a cable or one of the involved interfaces.
    how: |
        The amount of transmit errors for the interface is retrieved by running "ifconfig -a".
    without-indeni: |
        An administrator could log into the device through SSH and execute the command "ifconfig -a" to see the statistics of each VLAN interface.
    can-with-snmp: true
    can-with-syslog: false
network-interface-tx-overruns:
    why: |
        If the capacity of the interface is exceeded, the frame that is currently being  received is dropped and the overrun counter is incremented. It is important to track this in order to know if the capacity of an interface is sufficient.
    how: |
        The amount of transmit overruns for the interface is retrieved by running "ifconfig -a".
    without-indeni: |
        An administrator could log into the device through SSH and execute the command "ifconfig -a" to see the statistics of each VLAN interface.
    can-with-snmp: true
    can-with-syslog: false
network-interface-tx-carrier:
    why: |
        A high carrier number could mean that the link is flapping.
    how: |
        The carrier counter for the interface is retrieved by running "ifconfig -a".
    without-indeni: |
        An administrator could log into the device through SSH and execute the command "ifconfig -a" to see the statistics of each VLAN interface.
    can-with-snmp: true
    can-with-syslog: false
network-interface-rx-errors:
    why: |
        Receive errors on an interface could indicate a problem with a cable, or one of the involved interfaces.
    how: |
        The amount of receive errors for the interface is retrieved by running "ifconfig -a".
    without-indeni: |
        An administrator could log into the device through SSH and execute the command "ifconfig -a" to see the statistics of each VLAN interface.
    can-with-snmp: true
    can-with-syslog: false
network-interface-admin-state:
    why: |
        If a network interface is set to be up (what's known as "admin up") but is actually down (a cable is not connected, the device on the other side is down, etc.) it is important to know.
    how: |
        This alert logs into the F5 device through SSH and retrieves the status of all network interfaces. In that output, it looks for interfaces that are set to be up, but are actually down.
    without-indeni: |
        An administrator could verify that interface admin state by logging into the device through SSH, and issuing the command "ifconfig -a".
    can-with-snmp: true
    can-with-syslog: true

#! REMOTE::SSH
ifconfig -a

#! PARSER::AWK

BEGIN {

    netMaskToCIDR["0.0.0.0"] = 0
    netMaskToCIDR["128.0.0.0"] = 1
    netMaskToCIDR["192.0.0.0"] = 2
    netMaskToCIDR["224.0.0.0"] = 3
    netMaskToCIDR["240.0.0.0"] = 4
    netMaskToCIDR["248.0.0.0"] = 5
    netMaskToCIDR["252.0.0.0"] = 6
    netMaskToCIDR["254.0.0.0"] = 7
    netMaskToCIDR["255.0.0.0"] = 8
    netMaskToCIDR["255.128.0.0"] = 9
    netMaskToCIDR["255.192.0.0"] = 10
    netMaskToCIDR["255.224.0.0"] = 11
    netMaskToCIDR["255.240.0.0"] = 12
    netMaskToCIDR["255.248.0.0"] = 13
    netMaskToCIDR["255.252.0.0"] = 14
    netMaskToCIDR["255.254.0.0"] = 15
    netMaskToCIDR["255.255.0.0"] = 16
    netMaskToCIDR["255.255.128.0"] = 17
    netMaskToCIDR["255.255.192.0"] = 18
    netMaskToCIDR["255.255.224.0"] = 19
    netMaskToCIDR["255.255.240.0"] = 20
    netMaskToCIDR["255.255.248.0"] = 21
    netMaskToCIDR["255.255.252.0"] = 22
    netMaskToCIDR["255.255.254.0"] = 23
    netMaskToCIDR["255.255.255.0"] = 24
    netMaskToCIDR["255.255.255.128"] = 25
    netMaskToCIDR["255.255.255.192"] = 26
    netMaskToCIDR["255.255.255.224"] = 27
    netMaskToCIDR["255.255.255.240"] = 28
    netMaskToCIDR["255.255.255.248"] = 29
    netMaskToCIDR["255.255.255.252"] = 30
    netMaskToCIDR["255.255.255.254"] = 31
    netMaskToCIDR["255.255.255.255"] = 32
}

#Lines not starting with whitespace
#VLAN0152  Link encap:Ethernet  HWaddr F4:15:63:1D:E4:10
/^[^\s]/{

    interfaceTags["name"] = "if-" $1

    #Match for a mac address.
    if (match($5, /[A-F0-9]{2}:[A-F0-9]{2}:[A-F0-9]{2}:[A-F0-9]{2}:[A-F0-9]{2}:[A-F0-9]{2}/)) {
        writeComplexMetricString("network-interface-mac", interfaceTags, $5)
    }

    #Add interface state as always up as there is no way to determine the VLAN interface states
    writeDoubleMetric("network-interface-state", interfaceTags, "gauge", 60, 1)
    writeDoubleMetric("network-interface-admin-state", interfaceTags, "gauge", 60, 1)

}

#          inet addr:10.100.13.11  Bcast:10.100.13.255  Mask:255.255.255.0
/inet addr:/{

    ipAddr = $2

    #Remove "addr:" to get the value
    sub(/addr:/, "", ipAddr)
    writeComplexMetricString("network-interface-ipv4-address", interfaceTags, ipAddr)

    netMask = $NF
    #Remove "Mask:" to get the value
    sub(/Mask:/, "", netMask)

    #Write the metric with the value from the netMaskToCIDR array
    CIDRMask = netMaskToCIDR[netMask]
    writeComplexMetricString("network-interface-ipv4-subnet", interfaceTags, CIDRMask)

}

#          UP BROADCAST RUNNING MULTICAST  MTU:9282  Metric:1
/\s+MTU:.+\s+Metric/{

    MTU = $(NF-1)

    #Remove "MTU:" to get the value
    sub(/MTU:/, "", MTU)
    writeComplexMetricString("network-interface-mtu", interfaceTags, MTU)

}

#          RX packets:9075120 errors:0 dropped:0 overruns:0 frame:0
/^\s+RX\s+packets/{

    packetsCount = $2

    #Remove "packets:" to get the value
    sub(/packets:/, "", packetsCount)
    writeDoubleMetric("network-interface-rx-packets", interfaceTags, "gauge", 60, packetsCount)

    errorsCount = $3

    #Remove "errors:" to get the value
    sub(/errors:/, "", errorsCount)
    writeDoubleMetric("network-interface-rx-errors", interfaceTags, "gauge", 60, errorsCount)

    droppedCount = $4

    #Remove "dropped:" to get the value
    sub(/dropped:/, "", droppedCount)
    writeDoubleMetric("network-interface-rx-dropped", interfaceTags, "gauge", 60, droppedCount)

    overrunsCount = $5

    #Remove "overruns:" to get the value
    sub(/overruns:/, "", overrunsCount)
    writeDoubleMetric("network-interface-rx-overruns", interfaceTags, "gauge", 60, overrunsCount)

    frameCount = $6

    #Remove "frame:" to get the value
    sub(/frame:/, "", frameCount)
    writeDoubleMetric("network-interface-rx-frame", interfaceTags, "gauge", 60, frameCount)
}

#          TX packets:227082071 errors:0 dropped:0 overruns:0 carrier:0
/^\s+TX\s+packets/{

    packetsCount = $2

    #Remove "packets:" to get the value
    sub(/packets:/, "", packetsCount)
    writeDoubleMetric("network-interface-tx-packets", interfaceTags, "gauge", 60, packetsCount)

    errorsCount = $3

    #Remove "errors:" to get the value
    sub(/errors:/, "", errorsCount)
    writeDoubleMetric("network-interface-tx-errors", interfaceTags, "gauge", 60, errorsCount)

    droppedCount = $4

    #Remove "dropped:" to get the value
    sub(/dropped:/, "", droppedCount)
    writeDoubleMetric("network-interface-tx-dropped", interfaceTags, "gauge", 60, droppedCount)

    overrunsCount = $5

    #Remove "overruns:" to get the value
    sub(/overruns:/, "", overrunsCount)
    writeDoubleMetric("network-interface-tx-overruns", interfaceTags, "gauge", 60, overrunsCount)

    carrierCount = $6

    #Remove "carrier:" to get the value
    sub(/carrier:/, "", carrierCount)
    writeDoubleMetric("network-interface-tx-carrier", interfaceTags, "gauge", 60, carrierCount)
}

#          RX bytes:165055284655 (153.7 GiB)  TX bytes:406066635367 (378.1 GiB)
/^\s+RX\s+bytes/{

    rxBytesCount = $2

    #Remove "bytes:" to get the value
    sub(/bytes:/, "", rxBytesCount)
    writeDoubleMetric("network-interface-rx-bytes", interfaceTags, "gauge", 60, rxBytesCount)

    txBytesCount = $6

    #Remove "bytes:" to get the value
    sub(/bytes:/, "", txBytesCount)
    writeDoubleMetric("network-interface-tx-bytes", interfaceTags, "gauge", 60, txBytesCount)
}

f5-rest-net-interface-stats

 #! META
name: f5-rest-net-interface-stats
description: Determine network interface metrics
type: monitoring
monitoring_interval: 1 minute
requires:
    vendor: "f5"
    product: "load-balancer"
    rest-api: "true"

#! COMMENTS
network-interface-state:
    why: |
        Interfaces in the "down" state could result in downtime or reduced redundancy.
    how: |
        The state of the interface is retrieved via the F5 iControl REST API.
    without-indeni: |
        An administrator could login to the web interface of the device and go to Network -> Interfaces to see the status of each interface. This information is also available by logging into the device through SSH, entering TMSH and executing the command "show net interface all-properties".
    can-with-snmp: true
    can-with-syslog: false
network-interface-admin-state:
    why: |
        An administrator might set a network interface to be disabled for troubleshooting, but. Should he he forget about doing this network trunks might be running at reduced capacity.
    how: |
        This alert uses the F5 iControl REST API to retrieve the status of all physical network interfaces. In that output, it looks for interfaces that are set to be up, but are actually down.
    without-indeni: |
        An administrator could login to the web interface of the device and go to Network -> Interfaces to see the admin status of each interface. This information is also available by logging into the device through SSH, entering TMSH and executing the command "show net interface all-properties".
    can-with-snmp: true
    can-with-syslog: false
network-interface-mac:
    why: |
        To be able to search for MAC addresses in indeni, this data needs to be stored.
    how: |
        This alert uses the F5 iControl REST API to retrieve the MAC addresses of all physical network interfaces.
    without-indeni: |
        An administrator could login to the web interface of the device and go to Network -> Interfaces to see the mac address of each interface. This information is also available by logging into the device through SSH, entering TMSH and executing the command "show net interface all-properties".
    can-with-snmp: true
    can-with-syslog: false
network-interface-mtu:
    why: |
        The MTU sometimes needs to be adjusted. Storing this gives an administrator an easy way to view the MTU from a large number of devices, as well as identifying incorrectly set MTU.
    how: |
        This alert uses the F5 iControl REST API to retrieve the MTU from all physical interfaces.
    without-indeni: |
        An administrator could log into the device through SSH, entering TMSH and executing the command "show net interface all-properties" to see the MTU for each interface.
    can-with-snmp: true
    can-with-syslog: false
network-interface-rx-packets:
    why: |
        Tracking the number of packets flowing through each network interface is important to identify potential issues, spikes in traffic, etc.
    how: |
        This alert logs into the F5 unit through the F5 iControl REST API and retrieves the metrics from all network interfaces. In that output, it looks for the number of packets received through the interface.
    without-indeni: |
        An administrator could login to the web interface of the device and go to Network -> Interfaces -> Statistics to see the statistics of each interface. This information is also available by logging into the device through SSH, entering TMSH and executing the command "show net interface all-properties".
    can-with-snmp: true
    can-with-syslog: false
network-interface-tx-packets:
    why: |
        Tracking the number of packets flowing through each VLAN interface is important to identify potential issues, spikes in traffic, etc.
    how: |
        This alert logs into the F5 unit through the F5 iControl REST API and retrieves the metrics from all network interfaces. In that output, it looks for the number of packets transmitted through the interface.
    without-indeni: |
        An administrator could login to the web interface of the device and go to Network -> Interfaces -> Statistics to see the statistics of each interface. This information is also available by logging into the device through SSH, entering TMSH and executing the command "show net interface all-properties".
    can-with-snmp: true
    can-with-syslog: false
network-interface-rx-dropped:
    why: |
        If incoming packets are being dropped on a network interface, it is important to be aware of it. This may be due to a high load on the unit, or another capacity issue.
    how: |
        This alert logs into the F5 unit through the F5 iControl REST API and retrieves the metrics from all network interfaces. In that output, it looks for the number of packets dropped on an interface.
    without-indeni: |
        An administrator could login to the web interface of the device and go to Network -> Interfaces -> Statistics to see the statistics of each interface. This information is also available by logging into the device through SSH, entering TMSH and executing the command "show net interface all-properties".
    can-with-snmp: true
    can-with-syslog: true
network-interface-tx-dropped:
    why: |
        If outgoing packets are being dropped on a network interface, it is important to be aware of it. This may be due to a high load on the unit, or another capacity issue.
    how: |
        This alert logs into the F5 unit through the F5 iControl REST API and retrieves the metrics from all network interfaces. In that output, it looks for the number of packets dropped on an interface.
    without-indeni: |
        An administrator could login to the web interface of the device and go to Network -> Interfaces -> Statistics to see the statistics of each interface. This information is also available by logging into the device through SSH, entering TMSH and executing the command "show net interface all-properties".
    can-with-snmp: true
    can-with-syslog: false
network-interface-rx-bytes:
    why: |
        Tracking the amount of data flowing through each network interface is important to identify potential issues, spikes in traffic, etc.
    how: |
        This alert logs into the F5 unit through the F5 iControl REST API and retrieves the metrics from all network interfaces. In that output, it looks for the number of bytes received through the interface.
    without-indeni: |
        An administrator could login to the web interface of the device and go to Network -> Interfaces -> Statistics to see the statistics of each interface. This information is also available by logging into the device through SSH, entering TMSH and executing the command "show net interface all-properties".
    can-with-snmp: true
    can-with-syslog: false
network-interface-tx-bytes:
    why: |
        Tracking the amount of data flowing through each network interface is important to identify potential issues, spikes in traffic, etc.
    how: |
        This alert logs into the F5 unit through the F5 iControl REST API and retrieves the metrics from all network interfaces. In that output, it looks for the number of bytes transmitted through the interface.
    without-indeni: |
        An administrator could login to the web interface of the device and go to Network -> Interfaces -> Statistics to see the statistics of each interface. This information is also available by logging into the device through SSH, entering TMSH and executing the command "show net interface all-properties".
    can-with-snmp: true
    can-with-syslog: false
network-interface-tx-errors:
    why: |
        Transmit errors on an interface could indicate a problem.
    how: |
        This alert logs into the F5 unit through the F5 iControl REST API and retrieves the metrics from all network interfaces. In that output, it looks for the number of transmit errors on each interface.
    without-indeni: |
        An administrator could login to the web interface of the device and go to Network -> Interfaces -> Statistics to see the statistics of each interface. This information is also available by logging into the device through SSH, entering TMSH and executing the command "show net interface all-properties".
    can-with-snmp: true
    can-with-syslog: false
network-interface-rx-errors:
    why: |
        Receive errors on an interface could indicate a problem.
    how: |
        This alert logs into the F5 unit through the F5 iControl REST API and retrieves the metrics from all network interfaces. In that output, it looks for the number of receive errors on each interface.
    without-indeni: |
        An administrator could login to the web interface of the device and go to Network -> Interfaces -> Statistics to see the statistics of each interface. This information is also available by logging into the device through SSH, entering TMSH and executing the command "show net interface all-properties".
    can-with-snmp: true
    can-with-syslog: false
network-interface-speed:
    why: |
        Generally, these days network interfaces are set at 1Gbps or more. Sometimes, due to a configuration or device issue, an interface can be set below that (to 100mbps or even 10mbps). As that is usually _not_ the intended behavior, it is important to track the speed of all network interfaces.
    how: |
        This alert logs into the F5 unit through the iControl REST API and retrieves the status of all network interfaces. In that output, it looks for the actual runtime speed of each interface.
    without-indeni: |
        An administrator could login to the web interface of the device and go to Network -> Interfaces to see the speed of each interface by looking at the column "Media Speed". This information is also available by logging into the device through SSH, entering TMSH and executing the command "show net interface all-properties" and looking at the column "Media". The numbers are the value of the speed in "MegaBits". Example: 1000T-FD means "1000 Mbit".
    can-with-snmp: true
    can-with-syslog: false
network-interface-duplex:
    why: |
        Generally, these days network interfaces are set at full duplex. Sometimes, due to a configuration or device issue, an interface can be set to half duplex. As that is usually _not_ the intended behavior, it is important to track the duplex setting of all network interfaces.
    how: |
        This alert logs into the F5 unit through the iControl REST API and retrieves the status of all network interfaces. In that output, it looks for the actual runtime duplex of each interface.
    without-indeni: |
        An administrator could login to the web interface of the device and go to Network -> Interfaces and click on each interface in the list to see the duplex of each interface. This information is also available by logging into the device through SSH, entering TMSH and executing the command "show net interface all-properties" and looking at the column "Media". A value of "FD" means "Full Duplex", while a value of "HD" means "Half Duplex". Example: 1000T-FD means "Speed: 1000 Mbit, Duplex: Full, Media Type: Copper Twister Pair".
    can-with-snmp: true
    can-with-syslog: false
network-interface-type:
    why: |
        The type of interface can be useful for administrators.
    how: |
        This alert logs into the F5 unit through the iControl REST API and retrieves the status of all network interfaces. In that output, it looks for the actual runtime duplex of each interface.
    without-indeni: |
        An administrator could login to the web interface of the device and go to Network -> Interfaces and click on each interface in the list to see the media type of each interface. This information is also available by logging into the device through SSH, entering TMSH and executing the command "show net interface all-properties" and looking at the column "Media". Example: "1000T-FD" means "Speed: 1000 Mbit, Duplex: Full, Media Type: Copper Twister Pair".
    can-with-snmp: true
    can-with-syslog: false
network-interface-admin-state:
    why: |
        If a network interface is set to be up (what's known as "admin up") but is actually down (a cable is not connected, the device on the other side is down, etc.) it is important to know.
    how: |
        This alert logs into the F5 device through SSH and retrieves the status of all network interfaces. In that output, it looks for interfaces that are set to be up, but are actually down.
    without-indeni: |
        An administrator could verify that interface admin state by logging into the device through SSH, entering TMSH and issuing the command "show net interface".
    can-with-snmp: true
    can-with-syslog: true

#! REMOTE::HTTP
url: /mgmt/tm/net/interface/stats?options=all-properties&$select=tmName,status,macAddress,mtu,counters.bitsIn,counters.bitsOut,counters.pktsIn,counters.pktsOut,counters.dropsIn,counters.dropsOut,counters.errorsIn,counters.errorsOut,mediaActive
protocol: HTTPS

#! PARSER::JSON

_metrics:

    ##########################################
    #   Interface state
    ##########################################

    - #Get interface state for interfaces that is up
        _groups:
            "$.entries.*.nestedStats.entries[?(@.status.description == 'up')]":
                _tags:
                    "im.name":
                        _constant: "network-interface-state"
                    "im.dstype.displaytype":
                        _constant: "state"
                _temp:
                    "name":
                        _value: "tmName.description"
                _value.double:
                    _constant: "1"
        _transform:
            _tags:
                "name": |
                    {
                        print "net-" temp("name")
                    }
    - #Get interface state for interfaces that is not up, disabled, unpopulated or uninitialized (we won't write metrics for disabled, unitialized or missing interfaces)
        _groups:
            "$.entries.*.nestedStats.entries[?(@.status.description != 'up' && @.status.description != 'disabled' && @.status.description != 'uninit' && @.status.description != 'miss' )]":
                _tags:
                    "im.name":
                        _constant: "network-interface-state"
                    "im.dstype.displaytype":
                        _constant: "state"
                _temp:
                    "name":
                        _value: "tmName.description"
                _value.double:
                    _constant: "0"
        _transform:
            _tags:
                "name": |
                    {
                        print "net-" temp("name")
                    }
    ##########################################
    #   Interface admin-state
    ##########################################
    - #Get admin state for interfaces that is up
        _groups:
            "$.entries.*.nestedStats.entries[?(@.status.description != 'disabled')]":
                _tags:
                    "im.name":
                        _constant: "network-interface-admin-state"
                    "im.dstype.displaytype":
                        _constant: "state"
                    "name":
                        _value: "tmName.description"
                _value.double:
                    _constant: "1"

    - #Get interface admin-state for interfaces that is disabled
        _groups:
            "$.entries.*.nestedStats.entries[?(@.status.description == 'disabled')]":
                _tags:
                    "im.name":
                        _constant: "network-interface-admin-state"
                    "im.dstype.displaytype":
                        _constant: "state"
                _temp:
                    "name":
                        _value: "tmName.description"
                _value.double:
                    _constant: "0"
        _transform:
            _tags:
                "name": |
                    {
                        print "net-" temp("name")
                    }

    ##########################################
    #   Interface mac-address
    ##########################################

    - #Get interface mac-address
        _groups:
            "$.entries.*.nestedStats.entries":
                _tags:
                    "im.name":
                        _constant: "network-interface-mac"
                _temp:
                    "name":
                        _value: "tmName.description"
                _value.complex:
                    value:
                        #  "value" : "02:01:23:45:00:09"
                        _value: "macAddress.description"
        _transform:
            _tags:
                "name": |
                    {
                        print "net-" temp("name")
                    }

    ##########################################
    #   Interface mtu
    ##########################################

    - #Get interface mtu
        _groups:
            "$.entries.*.nestedStats.entries":
                _tags:
                    "im.name":
                        _constant: "network-interface-mtu"
                _temp:
                    "name":
                        _value: "tmName.description"
                _value.complex:
                    value:
                        #  "value" : "8096"
                        _value: "mtu.value"
        _transform:
            _tags:
                "name": |
                    {
                        print "net-" temp("name")
                    }

    ##########################################
    #   Interface statistics
    ##########################################

    - #Get interface rx-bytes
        _groups:
            "$.entries.*.nestedStats.entries":
                _tags:
                    "im.name":
                        _constant: "network-interface-rx-bytes"
                    "im.dsType":
                        _constant: "counter"
                    "im.dstype.displaytype":
                        _constant: "bytes"
                _temp:
                    "bitsIn":
                        _value: "['counters.bitsIn'].value"
                    "name":
                        _value: "tmName.description"
        _transform:
            _tags:
                "name": |
                    {
                        print "net-" temp("name")
                    }
            _value.double: |
                {
                    #Convert to bytes
                    print temp("bitsIn")/8
                }

    - #Get interface tx-bytes
        _groups:
            "$.entries.*.nestedStats.entries":
                _tags:
                    "im.name":
                        _constant: "network-interface-tx-bytes"
                    "im.dsType":
                        _constant: "counter"
                    "im.dstype.displaytype":
                        _constant: "bytes"
                _temp:
                    "bitsOut":
                        _value: "['counters.bitsOut'].value"
                    "name":
                        _value: "tmName.description"
        _transform:
            _tags:
                "name": |
                    {
                        print "net-" temp("name")
                    }
            _value.double: |
                {
                    #Convert to bytes
                    print temp("bitsOut")/8
                }
    - #Get interface rx-packets
        _groups:
            "$.entries.*.nestedStats.entries":
                _tags:
                    "im.name":
                        _constant: "network-interface-rx-packets"
                    "im.dsType":
                        _constant: "counter"
                    "im.dstype.displaytype":
                        _constant: "number"
                _temp:
                    "name":
                        _value: "tmName.description"
                _value.double:
                    _value: "['counters.pktsIn'].value"
        _transform:
            _tags:
                "name": |
                    {
                        print "net-" temp("name")
                    }

    - #Get interface tx-packets
        _groups:
            "$.entries.*.nestedStats.entries":
                _tags:
                    "im.name":
                        _constant: "network-interface-tx-packets"
                    "im.dsType":
                        _constant: "counter"
                    "im.dstype.displaytype":
                        _constant: "number"
                _temp:
                    "name":
                        _value: "tmName.description"
                _value.double:
                    _value: "['counters.pktsOut'].value"
        _transform:
            _tags:
                "name": |
                    {
                        print "net-" temp("name")
                    }

    - #Get interface rx-drops
        _groups:
            "$.entries.*.nestedStats.entries":
                _tags:
                    "im.name":
                        _constant: "network-interface-rx-dropped"
                    "im.dsType":
                        _constant: "counter"
                    "im.dstype.displaytype":
                        _constant: "number"
                _temp:
                    "name":
                        _value: "tmName.description"
                _value.double:
                    _value: "['counters.dropsIn'].value"
        _transform:
            _tags:
                "name": |
                    {
                        print "net-" temp("name")
                    }

    - #Get interface tx-drops
        _groups:
            "$.entries.*.nestedStats.entries":
                _tags:
                    "im.name":
                        _constant: "network-interface-tx-dropped"
                    "im.dsType":
                        _constant: "counter"
                    "im.dstype.displaytype":
                        _constant: "number"
                _temp:
                    "name":
                        _value: "tmName.description"
                _value.double:
                    _value: "['counters.dropsOut'].value"
        _transform:
            _tags:
                "name": |
                    {
                        print "net-" temp("name")
                    }

    - #Get interface rx-errors
        _groups:
            "$.entries.*.nestedStats.entries":
                _tags:
                    "im.name":
                        _constant: "network-interface-rx-errors"
                    "im.dsType":
                        _constant: "counter"
                    "im.dstype.displaytype":
                        _constant: "number"
                _temp:
                    "name":
                        _value: "tmName.description"
                _value.double:
                    _value: "['counters.errorsIn'].value"
        _transform:
            _tags:
                "name": |
                    {
                        print "net-" temp("name")
                    }

    - #Get interface tx-errors
        _groups:
            "$.entries.*.nestedStats.entries":
                _tags:
                    "im.name":
                        _constant: "network-interface-tx-errors"
                    "im.dsType":
                        _constant: "counter"
                    "im.dstype.displaytype":
                        _constant: "number"
                _temp:
                    "name":
                        _value: "tmName.description"
                _value.double:
                    _value: "['counters.errorsOut'].value"
        _transform:
            _tags:
                "name": |
                    {
                        print "net-" temp("name")
                    }

    ##########################################
    #   Interface speed, duplex and type
    ##########################################

    - #Get interface speed
        _groups:
            "$.entries.*.nestedStats.entries[?(@.mediaActive.description != 'none' && @.tmName.description != 'mgmt')]":
                _tags:
                    "im.name":
                        _constant: "network-interface-speed"
                _temp:
                    "media":
                        _value: "mediaActive.description"
                    "name":
                        _value: "tmName.description"
        _transform:
            _tags:
                "name": |
                    {
                        print "net-" temp("name")
                    }
                "alert-item-port-speed": |
                    {
                        media = temp("media")

                        #1000T-FD
                        split(media, mediaArray, /-/)

                        interfaceSpeed = mediaArray[1]

                        #1000T will be 1000
                        gsub(/[^0-9]+/, "",interfaceSpeed)

                        interfaceSpeed = interfaceSpeed "M"

                        print temp("name") "-" interfaceSpeed
                    }
            _value.complex:
                value: |
                    {
                        media = temp("media")

                        #1000T-FD
                        split(media, mediaArray, /-/)

                        interfaceSpeed = mediaArray[1]

                        #1000T will be 1000
                        gsub(/[^0-9]+/, "",interfaceSpeed)

                        interfaceSpeed = interfaceSpeed "M"

                        #  "value" : "1000M"
                        print interfaceSpeed

                    }
    - #Get interface duplex
        _groups:
            "$.entries.*.nestedStats.entries[?(@.mediaActive.description != 'none')]":
                _tags:
                    "im.name":
                        _constant: "network-interface-duplex"
                _temp:
                    "media":
                        _value: "mediaActive.description"
                    "name":
                        _value: "tmName.description"
        _transform:
            _tags:
                "name": |
                    {
                        print "net-" temp("name")
                    }
            _value.complex:
                value: |
                    {
                        media = temp("media")

                        #1000T-FD
                        split(media, mediaArray, /-/)

                        #Determine duplex settings
                        duplex = mediaArray[2]

                        if(duplex == "FD"){
                            #  "value" : "full"
                            print "full"
                        } else if (duplex == "HD") {
                            #  "value" : "half"
                            print "half"
                        } else {
                            #  "value" : "unknown"
                            print "unknown"
                        }
                    }
    - #Get interface type
        _groups:
            "$.entries.*.nestedStats.entries[?(@.mediaActive.description != 'none')]":
                _tags:
                    "im.name":
                        _constant: "network-interface-type"
                _temp:
                    "media":
                        _value: "mediaActive.description"
                    "name":
                        _value: "tmName.description"
        _transform:
            _tags:
                "name": |
                    {
                        print "net-" temp("name")
                    }
            _value.complex:
                value: |
                    {
                        media = temp("media")

                        #1000T-FD
                        split(media, mediaArray, /-/)

                        #Determine interface type
                        interfaceType = mediaArray[1]

                        #1000T will be T
                        gsub(/[0-9]+/, "",interfaceType)

                        if(interfaceType != ""){
                            #  "value" : "T"
                            print interfaceType
                        } else {
                            #  "value" : "unknown"
                            print "unknown"
                        }

                    }

cross_vendor_tx_overrun

package com.indeni.server.rules.library.templatebased.crossvendor

import com.indeni.server.rules.RuleContext
import com.indeni.server.rules.library.ConditionalRemediationSteps
import com.indeni.server.rules.library.templates.NearingCapacityWithItemsTemplateRule

/**
  *
  */
case class CrossVendorTxOverrun() extends NearingCapacityWithItemsTemplateRule(
  ruleName = "cross_vendor_tx_overrun",
  ruleFriendlyName = "All Devices: TX packets overrun",
  ruleDescription = "Indeni tracks the number of packets that had issues and alerts if the ratio is too high.",
  usageMetricName = "network-interface-tx-overruns",
  limitMetricName = "network-interface-tx-packets",
  applicableMetricTag = "name",
  threshold = 0.5,
  minimumValueToAlert = 100.0, // We don't want to alert if the number of error packets is really low
  alertDescription = "Some network interfaces and ports are experiencing a high overrun rate. Review the ports below.",
  alertItemDescriptionFormat = "%.0f packets overrun out of a total of %.0f transmitted.",
  baseRemediationText = "Packet overruns usually occur when there are too many packets being inserted into the port's memory buffer, faster than the rate at which the kernel is able to process them.",
  alertItemsHeader = "Affected Ports")(
  ConditionalRemediationSteps.OS_NXOS ->
    """|
       |In a small number of cases, the overrun counter may be incremented because of a software defect. However, in the majority of cases, it indicates that the receiving capability of the interface was exceeded. Nothing can be done on the device that reports overruns. If possible, the rate that frames are coming should be controlled at the remote end of the connection.
       |1. Run the "show interface" command to review the interface overrun & underun counters and the bitrate. Consider to configure the "load-interval 30" interface sub command to improve the accuracy of the interface measurements.
       |2. If the number of overruns is high, the hardware should be upgraded.
       |In case of high bandwidth utilization:
       |1. Run the "show interface" command to review the interface counters and the bitrate. Consider to configure the "load-interval 30" interface sub command to improve the accuracy of the interface measurements.
       |2. If the interface bitrate is too high and close to the upper bandwidth limit consider to use multiple links with the port-channel technology or upgrade the bandwidth of the link
       |3. Consider to implement QoS in case of high bandwidth utilization.""".stripMargin,
  ConditionalRemediationSteps.VENDOR_JUNIPER ->
    """|The issue can not be resolved on the device that reports overruns. The rate that frames are coming should be controlled at the remote end of the connection.
       |1. Run the “show interface extensive” command to review the interface overrun counters. 

       |2. If the number of overruns is high, consider upgrading the hardware.
       |3. Review the following article on Juniper tech support site: <a target="_blank" href="https://www.juniper.net/documentation/en_US/junos/topics/reference/command-summary/show-interfaces-security.html#jd0e1772">Operational Commands</a>""".stripMargin,
  ConditionalRemediationSteps.VENDOR_FORTINET ->
    """
       |1. Run "diag hardware deviceinfo nic <interface>" command to display a list of hardware related error names and values. Review  the next link for more details: http://help.fortinet.com/fos50hlp/54/Content/FortiOS/fortigate-toubleshooting-54/troubleshooting_tools.htm
       |2. Run command "fnsysctl cat /proc/net/dev" to get a summary of the interface statistics.
       |3. Check for speed and duplex mismatch in the interface settings on both sides of a cable, and check for a damaged cable. Review the next link for more info: http://kb.fortinet.com/kb/documentLink.do?externalID=10653""".stripMargin
)