In my previous posts of this series, we explored how to handle, filter, route, and enrich alerts generated by NetEye and forwarded to Jira Operations:
In this article, I’ll show you how we automated the creation of customer tickets from relevant NetEye Cloud monitoring events. The workflow transforms Icinga notifications into Jira Operations alerts and then creates properly categorized Jira Service Management (JSM) tickets, ensuring that every event and customer interaction remains fully traceable.
I’ll present our use case and implementation, which may also provide useful ideas for similar configurations and automation workflows.
Our goal was to turn relevant NetEye Cloud monitoring events into fully traceable Jira Service Management tickets rather than sending individual Icinga notifications. Each ticket had to be created in the appropriate space, categorized with the correct customer and contract, assigned to the relevant contacts, and linked to both the Jira Ops alert and the affected NetEye object.
In summary, the workflow had to:
We initially considered using Jira Operations Sync or creating the ticket directly through a Jira Ops automation. However, these options didn’t provide all the functionality required for our use case, particularly for querying Assets, retrieving customer and contract information, and fully configuring the ticket.
For this reason, we implemented two separate automations:
NetEye Cloud monitoring event
↓
Icinga notification
↓
Jira Operations alert
↓
Automation 1 (Jira Ops):
collect alert data
↓
send webhook
↓
Automation 2 (Jira JSM):
triggered by webhook
↓
query asset
↓
Create and categorize the JSM ticket
↓
Add customer contacts
↓
Notify the customer
↓
NOC investigation, if required
The workflow starts with a customized Icinga notification configured for the relevant hosts and services through dedicated filters. When one of these monitoring objects meets the defined conditions, Icinga sends a notification containing the required object information, custom variables, and tags to Jira Operations, where the corresponding alert is created.
The alert created in Jira Operations contains the monitoring details received from Icinga.
In addition, we use tags and alert properties to properly declare:
Using structured and predictable values is important because the same information will later be passed to the Jira Service Management automation, and we ensure that each alert contains a unique reference to the affected NetEye object.
The first automation is configured in Jira Ops and is triggered by alert creation. It collects the necessary information from the alerts using Jira smart values, and include these in the outgoing webhook body.
The automation then executes a Send web request action, where the destination is the incoming webhook URL configured in the second automation in the Jira Service Management space.
A webhook payload will have a structure similar to the following:
{
"data": {
"alert_id": "{{alert.id}}",
"alert_message": "{{alert.message}}",
....
"alert_alias": "{{alert.alias}}",
"alert_tags_customer": "{{alert.tags.get(1)}}",
"alert_tags_service": "{{alert.tags.get(0)}}",
"alert_servicedesc": "{{alert.extraProperties.noc_service_name}}",
....
"alert_host_name": "{{alert.extraProperties.host_name}}",
"alert_object_type": "{{alert.extraProperties.object_type}}",
"alert_servicestate": "{{alert.extraProperties.service_state}}"
}
}
In the screenshot you can see the web request configuration to send the webhook. Notice that you’ll need to properly configure the header X-Automation-Webhook-Token with the pre-shared secret .


The second automation runs in the Jira Service Management space where the customer ticket must be opened. It receives the webhook, queries Assets, creates and categorizes the ticket, adds customer contacts, and sends the initial customer notification.
The incoming webhook configuration provides a dedicated endpoint and secret. These values are used by the Send web request action in Jira Ops automation to trigger the rule.
The webhook body contains the alert information collected during the previous step, these values can be accessed using webhook smart values.
Incoming webhook configuration:


Before creating a ticket, the automation queries Jira Assets using the Lookup objects action to identify the correct customer company and active contract.
The query is similar to the following:
objectType IN ("WG3956 - Contract Position") AND "CMDB Status" IN ("Active") AND Customer LIKE {{customer}} AND Name LIKE "<contract_name>"

The lookup result provides the customer and contract information required to continue the workflow, create the ticket, and populate the corresponding categorization fields correctly.
After retrieving and validating all required information, the automation creates the Jira Service Management ticket using the appropriate request type:

The ticket is then categorized by populating:
The customer contacts are also retrieved from Assets using lookup objects. The automation uses these values to configure:
The reporter represents the primary customer contact associated with the request, while request participants allow other configured contacts to receive updates and interact with the ticket.
Adding multiple request participants requires an additional step to convert the query results into a format accepted by the Request Participants field. I use the following smart value to build a list of Jira account IDs:
{{#lookupObjects}}
{ "accountId": "{{AccountId}}" }{{^last}},{{/last}}
{{/lookupObjects}}
This value is stored in an automation variable called accountIDlist. The {{^last}},{{/last}} expression adds a comma after each object except the last one, producing a valid comma-separated list.
The variable can then be used to populate the Request participants field:
{
"fields": {
"Request participants": [
{{accountIDlist}}
]
}
}
Once the ticket has been created, categorized, and assigned to the correct contacts, the automation adds a public comment that notifies the customer with the relevant data.
Through automation and alert properties, we link the three main objects involved in the workflow:
The ticket contains:
The Jira Ops alert is also updated with:
In our implementation, some of these actions were not available as preconfigured automation components. We therefore used Jira Ops and JSM REST API requests.
With this request for example we post a comment on the alert from the JSM Automation.
URL:
https://api.atlassian.com/jsm/ops/api/<JiraOps_CloudID>/v1/alerts/{{webhookData.alert_id}}/notes
Body:
{
"note": "Created ticket to notify customer: {{createdIssue.key}} , {{createdIssue.url}} "
}
With this web request, instead, we link the alert to the created ticket via a URL like:
https://api.atlassian.com/jsm/incidents/cloudId/<JSM_CloudID>/v1/incident/{{issueid}}/alert/add
and having a body like:
{
"alertIds": [
"{{webhookData.alert_id}}"
]
}
After the ticket has been created successfully, the Jira Operations alert is acknowledged with a POST web request to the URL:
https://api.atlassian.com/jsm/ops/api/<JiraOps_CloudID>/v1/alerts/{{webhookData.alert_id}}/acknowledge
The Jira Ops integration is configured to forward acknowledgements back to NetEye through the Jira Edge Connector. As a result, the corresponding Icinga host or service is also acknowledged and a comment containing the newly created ticket link is added to the monitored object.
Ticket creation is only half of the workflow. The automation must also handle recovery.
When Icinga detects that the monitored object has returned to a healthy state, it sends an OK notification to Jira Operations and this closes the alert.
Closing the alert triggers a second automation flow, similar to the one used for ticket creation. A Jira Ops automation sends a webhook that is received by an automation in Jira Service Management. Using the alert properties included in the request, the automation identifies the corresponding ticket, adds a public comment to inform the customer that the problem has been resolved, and then closes the ticket.
For this workflow, the incoming webhook trigger is configured with the “Issues provided in the webhook HTTP POST body” option, allowing the automation to retrieve and process the ticket directly from the webhook payload:

Storing the ticket key in the alert extra properties during the creation flow makes this step much easier. The closure automation can directly retrieve the corresponding ticket instead of trying to reconstruct the relationship from the title or search for it using less reliable criteria.
With the complete workflow in place, a NetEye Cloud monitoring event can automatically create a fully categorized customer ticket without requiring manual intervention.
At the same time, the Jira Operations alert is acknowledged, linked to the ticket, and synchronized back to the corresponding Icinga object in NetEye.
NOC operators can assign the ticket, continue troubleshooting, and interact with customers as needed.
When the monitoring object recovers, the alert is closed, the customer receives a resolution update, and the ticket is transitioned to its final status.
This two-automation model has allowed us to keep the responsibilities clearly separated. Jira Operations manages the alert lifecycle and monitoring context, while Jira Service Management manages customer information, ticket categorization, assets, and communication.
With this final how-to, our series dedicated to Jira Operations comes to an end. I hope you found these articles useful and that the practical examples provided some interesting ideas for your own alert management and automation workflows.
Did you find this article interesting? Are you an “under the hood” kind of person? We’re really big on automation and we’re always looking for people in a similar vein to fill roles like this one as well as other roles here at Würth IT Italy.