- 13 minutes to read

Managing the Webhook Alarm Plugin

Empower your integration monitoring with the Nodinite HTTP Webhook Alarm Plugin. Instantly automate incident management and customer support by sending real-time alerts to any HTTP endpoint. Seamlessly connect Nodinite with platforms like Jira, Freshdesk, ServiceNow, and hundreds more for rapid response and streamlined workflows.

  • ✅ Send Nodinite alerts to any HTTP endpoint for instant integration
  • ✅ Automate incident management and customer support workflows
  • ✅ Include rich Custom Metadata in every alert for advanced automation (examples)
  • ✅ Securely connect with HTTP headers, Basic or OAuth 2.0 authentication, and an optional proxy

The Webhook Alarm Plugin sends an HTTP request with alert data to your Webhook endpoint whenever the state of Resources in one or more Monitor Views changes, according to your configuration. Custom Metadata is included in every alert, so you can tag tickets with properties from the Nodinite Repository Model in Freshdesk, Jira, ServiceNow, or any other platform.

Understanding the Webhook Flow

graph LR ok["fa:fa-circle-check OK"] warn["fa:fa-triangle-exclamation Warning"] err["fa:fa-circle-xmark Error"] alert["fa:fa-watch-fitness Monitoring Service
alert with Custom Metadata"] webhook{"fa:fa-code Webhook with
your own logic"} mail["fa:fa-envelope Mail"] DB["fa:fa-database Data Warehouse"] ticketSystem["fa:fa-ticket Jira/Freshdesk/ServiceNow"] queue["fa:fa-bell Alarm Queue"] ok --> alert warn --> alert err --> alert alert -->|"HTTP POST JSON"| webhook webhook -->|"Office hours"| mail webhook -->|"Statistics"| DB webhook -->|"Critical"| ticketSystem alert -.->|"Request failed"| queue style ok fill:#93d16d,color:#000 style warn fill:#FFD525,color:#000 style err fill:#c33d34,color:#fff style alert fill:#2678BD,color:#fff style webhook fill:#9E59BB,color:#fff style mail fill:#2678BD,color:#fff style DB fill:#2678BD,color:#fff style ticketSystem fill:#2678BD,color:#fff style queue fill:#c33d34,color:#fff

An OK (green), Warning (yellow), or Error (red) state change makes the Monitoring Service post the alert to your webhook (purple), whose own logic routes it on. A failed request waits in the Alarm Queue (red) and is retried as set by AlarmQueueSettings.

The HTTP Webhook Alarm Plugin comes pre-installed with Nodinite Core Services. The Monitoring Service server must reach the endpoint (required ports), directly or through the proxy set on the Proxy tab.

Example templates

Note

This plugin is for alerts from Monitor Views. The Webhooks that users pick when they repair and resend a Log Event are a different feature, configured in the ResendWebhookSettings System Parameter.

Default Entry and Additional Entries

Since Nodinite 7.2.0, every Alarm Plugin is used through Alarm Plugin entries. The Webhook default entry ships with Nodinite; add more entries built on the Webhook plugin, for example one per endpoint, and each Monitor View selects the entry or entries it uses. The entry concept and the Action menu are described once in Add or manage Alarm Plugin. You need to be a Nodinite administrator to configure Alarm Plugins.

Open the default entry from 'Administration' 'Settings' 'Alarm Plugins' by selecting 'Webhook'.

Webhook default entry General tab with description, version 7.4.0.1, Control panel, and empty Monitor Views panel (7.10)
"Sends a alarm object in raw JSON or compressed GZIP base64 format to a specified HTTP Endpoint."

The Configuration tab shows the Alarm Plugin Type and five sub-tabs.

Webhook entry Configuration tab with Alarm Plugin Type Webhook and the Basic, Monitoring state options, Authentication, Proxy, and Recurrence sub-tabs (7.10)
The type can't be changed on a default entry; on an entry you added, changing it resets all configuration settings.

Configuration Tabs

Basic Tab

Webhook Basic tab with Web Client URL, URL, Compress Body, Test URL, and an empty HTTP Headers list (7.10)
Point Test URL at a test endpoint so alarm tests don't create real tickets.

Field Help text in the Web Client Notes
Web Client URL Embed a link to the signaling Monitor View. Enter the URL to this Nodinite instance (NOTE: Do not use 'localhost') The address of your Web Client
URL The URL to the Webhook in use to send alarms to
Compress Body When checked, the body for the alarm is sent in compressed format GZIP, base64; the receiver must decompress it (example)
Test URL The URL in use to test the Webhook Used by Execute Alarm test and Restore Alarm test
HTTP Headers List of HTTP headers Click Add for each header

Each HTTP header, for example x-api-key, has these fields:

Webhook HTTP Headers entry with Enabled, Key, and Value fields and their required-field messages (7.10)
Key and Value are required; clear Enabled to keep a header without sending it.

Field Help text in the Web Client
Enabled When checked, this entry is added to the HTTP request
Key The name of the HTTP header (required: "Key name is required")
Value Value for HTTP header (required: "Value for Key is required")

Monitoring State Options Tab

Webhook Monitoring state options tab with Trigger on changed Resource state unchecked and all five Send Alarm states checked (7.10)
By default, every state posts to the webhook.

Field Help text in the Web Client Default
Trigger on changed Resource state When checked, trigger an Alarm when any Resource changes its state. Otherwise, trigger an Alarm when the Monitor View changes its monitoring state ❌ Unchecked
✅ Send Alarm on OK When checked, send alarms … for Monitor Views changing its state to the 'OK' state ✅ Checked
⚠️ Send Alarm on Warning … to the 'Warning' state ✅ Checked
❌ Send Alarm on Error … to the 'Error' state ✅ Checked
🚫 Send Alarm on Unavailable … to the 'Unavailable' state ✅ Checked
Send Alarm on Connection Error … to the 'Connection Error' state ✅ Checked

Authentication Tab

With Enable Authentication unchecked, the request carries only your HTTP headers. Check it and choose an Authentication Type. Passwords and client secrets are stored encrypted (Secret Management).

Field Help text in the Web Client
Enable Authentication Check when the SMTP server requires authentication to process requests.
Authentication Type Choose authentication type: Basic Authentication or OAuth 2.0 - Client Credentials

Basic Authentication

Webhook Authentication tab with Enable Authentication, Basic Authentication, Username, and Password (7.10)
Basic sends the credentials in the Authorization header of each request.

Field Help text in the Web Client
Username Basic authentication username
Password Basic authentication password

OpenID Authentication

New 7.x OAuth 2.0 client credentials with OpenID Connect discovery are available. Register an application in your identity provider to get the credentials; the plugin fetches a token before it posts.

Webhook Authentication tab with OAuth 2.0 - Client Credentials, Client ID, Client Secret, OpenID Endpoint Configuration, and Scope (7.10)
The list shows this option as "OAuth 2.0 - Client Credentials".

Field Help text in the Web Client
Client ID Client ID for OAuth2 authentication
Client Secret Client Secret for OAuth2 authentication
OpenID Endpoint Configuration Endpoint Configuration for OAuth2 authentication
Scope Scope for OAuth2 authentication. For more than one scope, separate each with a comma.

If requests fail, check the app registration's permissions and scopes, the endpoint URL, and the credentials; then run an alarm test and read the error. The Core Services diagnostic files and the Log Audits have more detail.

Proxy Tab

The Proxy Mode decides whether webhook calls go through a proxy. Its help text: "Controls whether webhook calls honor a proxy. 'None' sends traffic directly and is the recommended default for server-to-server webhook traffic. 'System' honors the OS / WPAD / PAC proxy (using Windows credentials for NTLM/Kerberos). 'Custom' uses the proxy URL specified below."

Webhook Proxy tab with Proxy Mode No proxy, the default (7.10)
No proxy is the default and recommended for server-to-server traffic.

Webhook Proxy Mode list with Select One, No proxy, Use system / WPAD / PAC proxy, and Custom proxy URL (7.10)
The three proxy modes.

Proxy Mode What happens Extra fields
No proxy (default, recommended for server-to-server traffic) The request goes directly to the URL None
Use system / WPAD / PAC proxy (with Windows credentials) The request honors the proxy configured in Windows, WPAD, or a PAC file, and authenticates to it with the Monitoring Service account's Windows credentials (NTLM/Kerberos) None
Custom proxy URL The request goes through the proxy you enter Proxy URL

Webhook Proxy tab with Custom proxy URL selected and the Proxy URL field (7.10)
Enter the proxy as http(s)://host:port.

Field Help text in the Web Client
Proxy URL Format: http(s)://host:port — e.g. http://proxy.example.com:8080

Recurrence Tab

Webhook Recurrence tab with Enable Recurrence and one Time Interval per monitoring state (7.10)
Leave a state empty to post its alarm only once.

Field Help text in the Web Client
Enable Recurrence Configure the recurrence for redistributing alarms
✅ Ok Time Interval, ⚠️ Warning Time Interval, 🚫 Unavailable Time Interval, ❌ Error Time Interval, Connection Error Time Interval A Time Interval per state; "If needed, you can create or adjust Time Intervals here" opens the Time Intervals page

The payload's IsRecurring property is true for a recurring alarm. How alert recurrence works.

Using a Webhook Entry in a Monitor View

A Monitor View doesn't hold its own webhook settings. On the External notifications tab of the Monitor View, the administrator selects the Webhook entry, or several entries, to use. To post some Monitor Views to another endpoint or with other credentials, add another Webhook entry, check Override … options on the tabs that differ, and select that entry in those Monitor Views (how).

Audit and Logging

Review these places, in this order:

  1. Alarm Queue – requests that failed, with the error
  2. Distributed Notifications – the alert history of the Monitor View
  3. The Nodinite Log Audits – who changed the configuration
  4. The Nodinite Monitoring Service diagnostic files

What does the alert payload look like?

You can send the payload to the Webhook either in compressed or uncompressed format. The payload carries the Monitor Views, the changed Resources, their Category and Application, the users, and the Custom Metadata of the linked Integrations. How it compares with the XML that the email plugins use is on the Alarm Plugin Object page.

Compress body option

When Compress Body is checked on the Basic tab, the payload is sent compressed.

Please review the following examples (actual data varies with each alert):

Uncompressed body example

Below is an example of an uncompressed JSON alert object:

{
  "MonitorViews": [
    {
      "MonitorViewId": 1,
      "Name": "Test View",
      "Description": "Simple unit testing view.",
      "WebSite": null,
      "StatusCode": {
        "StatusCode": 0,
        "Name": "OK"
      },
      "NumberOfMonitoredResources": 2,
      "Integrations": [
        {
          "IntegrationId": 1,
          "Name": "INT001 - Orders to first company",
          "Description": "",
          "WebSite": "https://www.nodinite.com",
          "CustomFields": [
            {
              "CustomFieldId": 1,
              "Name": "SLA",
              "Description": "",
              "WebSite": null,
              "ValueType": {
                "CustomFieldTypeId": 1,
                "Name": "Text",
                "Description": null,
                "WebSite": null
              },
              "CustomValues": [
                {
                  "CustomValueId": 1,
                  "Value": "Gold",
                  "Description": "Act fast!!",
                  "WebSite": "https://www.nodinite.com",
                  "ValueType": {
                    "CustomFieldTypeId": 1,
                    "Name": "Text",
                    "Description": null,
                    "WebSite": null
                  }
                }
              ]
            }
          ],
          "CustomMetaDatas": [
            {
              "CustomMetaDataId": 1,
              "Name": "Summary",
              "Description": "My integration is the perfect one",
              "WebSite": "https://www.nodinite.com",
              "DataType": 1,
              "CustomValues": [
                {
                  "CustomValueId": 1,
                  "Value": "My integration is the perfect one",
                  "Description": "Act fast!!",
                  "WebSite": "https://www.nodinite.com",
                  "ValueType": null
                }
              ]
            }
          ]
        }
      ],
      "ChangedResources": [
        {
          "ResourceId": 1,
          "Name": "First Resource - Send Port",
          "Description": null,
          "WebSite": "https://www.nodinite.com/resource/send-port",
          "Source": {
            "SourceId": 1,
            "Name": "Test Source",
            "Description": "Simple source for testing purposes only.",
            "Server": null,
            "Environment": null,
            "Version": null,
            "WebSite": "https://www.nodinite.com/"
          },
          "Category": {
            "CategoryId": 1,
            "Name": "Send Ports",
            "Description": "Send ports category.",
            "WebSite": null
          },
          "Application": {
            "ApplicationId": 1,
            "Name": "BizTalk System",
            "Description": "Default biztalk application",
            "WebSite": "https://www.nodinite.com/application/biztalk-system"
          },
          "StatusCode": {
            "StatusCode": 0,
            "Name": "OK"
          },
          "LogText": "All OK! \r\nTest\t - \r - \n"
        },
        {
          "ResourceId": 2,
          "Name": "Second Resource - Receive Port",
          "Description": null,
          "WebSite": null,
          "Source": {
            "SourceId": 1,
            "Name": "Test Source",
            "Description": "Simple source for testing purposes only.",
            "Server": null,
            "Environment": null,
            "Version": null,
            "WebSite": "https://www.nodinite.com/"
          },
          "Category": {
            "CategoryId": 2,
            "Name": "Receive Ports",
            "Description": "Receive ports category.",
            "WebSite": "https://www.nodinite.com/category/receive-ports"
          },
          "Application": {
            "ApplicationId": 1,
            "Name": "BizTalk System",
            "Description": "Default biztalk application",
            "WebSite": "https://www.nodinite.com/application/biztalk-system"
          },
          "StatusCode": {
            "StatusCode": 0,
            "Name": "OK"
          },
          "LogText": "All OK!"
        }
      ],
      "Users": [
        {
          "UserId": 1,
          "Name": "\\IBSS\\imsvc",
          "Description": null,
          "MailAddress": "john.doe@nodinite.com"
        },
        {
          "UserId": 2,
          "Name": "\\IBSS\\imsvc",
          "Description": null,
          "MailAddress": "jane.doe@nodinite.com"
        }
      ]
    },
    {
      "MonitorViewId": 2,
      "Name": "Second View",
      "Description": "Simple test view (second).",
      "WebSite": null,
      "StatusCode": {
        "StatusCode": 2,
        "Name": "ERROR"
      },
      "NumberOfMonitoredResources": 2,
      "Integrations": [],
      "ChangedResources": [
        {
          "ResourceId": 10,
          "Name": "LogAPI Queue",
          "Description": "Queue for Nodinite's LogAPI.",
          "WebSite": null,
          "Source": {
            "SourceId": 2,
            "Name": "MSMQ",
            "Description": "Source to monitor MSMQ queues.",
            "Server": "IBSS-DEV01",
            "Environment": "Production",
            "Version": "1.0",
            "WebSite": null
          },
          "Category": {
            "CategoryId": 10,
            "Name": "MSMQ Queue",
            "Description": "MSMQ Queues category",
            "WebSite": "https://msdn.microsoft.com/en-us/library/ms711472%28v=vs.85%29.aspx"
          },
          "Application": null,
          "StatusCode": {
            "StatusCode": 2,
            "Name": "ERROR"
          },
          "LogText": "Number of messages in queue exceeded error limit."
        },
        {
          "ResourceId": 11,
          "Name": "LogAPI Test Queue",
          "Description": "",
          "WebSite": null,
          "Source": {
            "SourceId": 2,
            "Name": "MSMQ",
            "Description": "Source to monitor MSMQ queues.",
            "Server": "IBSS-DEV01",
            "Environment": "Production",
            "Version": "1.0",
            "WebSite": null
          },
          "Category": {
            "CategoryId": 10,
            "Name": "MSMQ Queue",
            "Description": "MSMQ Queues category",
            "WebSite": "https://msdn.microsoft.com/en-us/library/ms711472%28v=vs.85%29.aspx"
          },
          "Application": null,
          "StatusCode": {
            "StatusCode": 1,
            "Name": "WARNING"
          },
          "LogText": "Number of messages in queue exceeded warning limit, but not error limit."
        }
      ],
      "Users": [
        {
          "UserId": 1,
          "Name": "\\IBSS\\imsvc",
          "Description": null,
          "MailAddress": "jane.doe@nodinite.com"
        }
      ]
    }
  ],
  "Version": "1.0.0.0",
  "Environment": "Test",
  "Customer": "UnitTest",
  "Created": "2019-02-06T13:06:00.0604707Z",
  "WebClientUrl": "https://nodinite.contoso.com:40000/",
  "IsRecurring": false,
  "ProductStatus": {
    "IsTrial": false,
    "ExpirationDate": null
  }
}

Example payload with some Custom Metadata.

Compressed body example

Below is an example of a compressed JSON alert object:

Ew0AAB+LCAAAAAAABADtVWtv2zYU/SscgWIdYMuS6jaJgQLz7HQwstip5aZAHx9o6dolKpEaSdlJg/z3XuphS5ZbNAEKDNu+SZe8r3PP4b2jl1JwI9U1h62mg/d3dcMkogOvQ6csATqgC9CGWDPt0DHoUPHUcCnwJOBJGgPJ0JEYvMXFmmzwImHxlt1qMrtw0OctLANuMJLI4rhDA8NMpkcyQstd48/dpZxd0Hv8yZIlqNmqrAyiOWiZqRCwYL9DJ8LAWjFbi+3gY4eOPjGxblzDvqq/ZlOvuMKuqjPSJQGIiFxJZQ67LKreNUE/GZPqQa+33W4dISOOtYETyqRX/fQsFD1Vhu5pDNxNi8BBbsr7PlJTDnTZLBmuQbRqqRAvq17hvQr3NFOp1KCJFPGthT0AtQFV1X8uNlxJkdigpekalH5Yh3YoI4aoS3Vrm6i+m23skNTt8u2RxUKTsPRtMQRzDNM05iErnO7qv81Mf/AvCxZ/JsGtNpC0so1hxbLYkCX/Yuw1Vgv7iInW3HtlyK4uMt8/hNZ/yfUCbnAMdBjHqJFf0NikqV/DMpQIWY2ncwiBb+BHqFrq7d/LuT1OdVTatKtOv8O8HyVB5Yz6zmPmytb0v0hafHDfaJxn/srar2afHz5Ybln7cZpeMh4PowjfSYxAbbG/1/vA+FYWB1uppYzv7SUbs9hHT3V++7cHraN9rvP5fDb/SRtpDzRCPLyakNcZZNBqKbfm4puWIP2qSeFxrKkjmt+3cxlcvm4laLwBxEiSlAZ7m/xt0+u6xOlCMaFZaN0Lm+/6Lj1QPb1SMsrCkr079VPPcY+8+9/cLW6j9m9AtD/aa/yoZBIdCSfhoZJarkwuGhDdTPdivlQMtZ3oE8/rn/hP/NPNy412Tp8/8c8cptObltAfQaK9lAo6EbkiCaqArbFwLgqsCdyEABFEBJTCKcQ84cZpbQrPO6RP/qAfB+h/nvxzebKf49vhfDqZ/vkIpmyZEnYt51zpLDNDhDQH/Pn5j/bH+vz6Tt9xHa9/1hr4GDZoG2XayCTnyWS6CGavFuPza2tXgJPB0qjvemdd1++6LxaeO/CeDXzXOXnWPzv13hVDG8UcI75RcVVjSaUCXYvzRC8UZ3i+YrEGLOQm5cUrPWY7Vt1/BSAomRwTDQAA

Example with a compressed payload.

Next Steps