skills/itom/observability-integration/SKILL.md
Integrate observability data from Datadog, Dynatrace, and New Relic into ServiceNow ITOM, covering metric ingestion, alert normalization, and event management connectors
npx skillsauth add happy-technologies-llc/happy-servicenow-skills observability-integrationInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill provides a structured approach to integrating third-party observability platforms with ServiceNow ITOM Event Management. It covers:
When to use: When operations teams need to centralize monitoring data from multiple observability platforms into ServiceNow for unified alert management, incident creation, and service health dashboards.
Plugin required: com.snc.em (Event Management)
evt_mgmt_admin, evt_mgmt_integration, or adminem_event, em_alert, em_connector_instance, em_match_rulecom.snc.em must be activated; MID Server configured for pull-based connectorsInventory current event management connectors to understand what is already integrated.
Using MCP:
Tool: SN-Query-Table
Parameters:
table_name: em_connector_instance
query: active=true^ORDERBYname
fields: sys_id,name,connector_type,status,last_run_time,last_run_status,mid_server,polling_interval
limit: 50
Using REST API:
GET /api/now/table/em_connector_instance?sysparm_query=active=true^ORDERBYname&sysparm_fields=sys_id,name,connector_type,status,last_run_time,last_run_status,mid_server,polling_interval&sysparm_display_value=true&sysparm_limit=50
Identify supported connector types for your target observability platform.
Using MCP:
Tool: SN-Query-Table
Parameters:
table_name: em_connector_type
query: active=true^nameLIKEdatadog^ORnameLIKEdynatrace^ORnameLIKEnew relic^ORnameLIKEgeneric
fields: sys_id,name,description,connector_class,direction,protocol
limit: 20
Using REST API:
GET /api/now/table/em_connector_type?sysparm_query=active=true^nameLIKEdatadog^ORnameLIKEdynatrace^ORnameLIKEnew relic^ORnameLIKEgeneric&sysparm_fields=sys_id,name,description,connector_class,direction,protocol&sysparm_display_value=true&sysparm_limit=20
Common Connector Types: | Platform | Connector Type | Direction | Protocol | |-----------|--------------------------|-----------|-------------| | Datadog | Datadog Connector | Pull | REST API | | Datadog | Generic Webhook | Push | Webhook | | Dynatrace | Dynatrace Connector | Pull | REST API | | New Relic | New Relic Connector | Pull | REST API | | Generic | Generic REST Connector | Pull/Push | REST API |
Create a connector instance for the target observability platform.
Using MCP (Datadog example):
Tool: SN-Create-Record
Parameters:
table_name: em_connector_instance
data:
name: Datadog Production Alerts
connector_type: [connector_type_sys_id]
active: true
polling_interval: 60
mid_server: [mid_server_name]
url: https://api.datadoghq.com/api/v1/monitor
api_key: [datadog_api_key]
application_key: [datadog_app_key]
Using REST API:
POST /api/now/table/em_connector_instance
Content-Type: application/json
{
"name": "Datadog Production Alerts",
"connector_type": "[connector_type_sys_id]",
"active": "true",
"polling_interval": "60",
"mid_server": "[mid_server_name]",
"url": "https://api.datadoghq.com/api/v1/monitor"
}
Map external severity levels to ServiceNow alert severity.
Using MCP:
Tool: SN-Execute-Background-Script
Parameters:
description: Review and report on existing alert normalization mappings
script: |
gs.info('=== ALERT NORMALIZATION MAPPING ===');
// Review existing match rules
var mr = new GlideRecord('em_match_rule');
mr.addQuery('active', true);
mr.orderBy('order');
mr.query();
gs.info('\n--- Active Match Rules ---');
while (mr.next()) {
gs.info('Rule: ' + mr.name + ' | Order: ' + mr.order + ' | Source: ' + mr.source + ' | Severity Map: ' + mr.severity);
}
// Severity mapping reference
gs.info('\n--- ServiceNow Severity Reference ---');
gs.info('1 = Critical');
gs.info('2 = Major');
gs.info('3 = Minor');
gs.info('4 = Warning');
gs.info('5 = Info');
gs.info('0 = Clear');
// External platform mapping suggestions
gs.info('\n--- Suggested Datadog Mappings ---');
gs.info('Datadog "Alert" -> SN Severity 1 (Critical)');
gs.info('Datadog "Warn" -> SN Severity 3 (Minor)');
gs.info('Datadog "No Data" -> SN Severity 4 (Warning)');
gs.info('Datadog "OK" -> SN Severity 0 (Clear)');
gs.info('\n--- Suggested Dynatrace Mappings ---');
gs.info('Dynatrace "AVAILABILITY" -> SN Severity 1 (Critical)');
gs.info('Dynatrace "ERROR" -> SN Severity 2 (Major)');
gs.info('Dynatrace "SLOWDOWN" -> SN Severity 3 (Minor)');
gs.info('Dynatrace "RESOURCE" -> SN Severity 4 (Warning)');
gs.info('Dynatrace "CUSTOM" -> SN Severity 5 (Info)');
gs.info('\n--- Suggested New Relic Mappings ---');
gs.info('New Relic "CRITICAL" -> SN Severity 1 (Critical)');
gs.info('New Relic "WARNING" -> SN Severity 3 (Minor)');
gs.info('New Relic "NOT_CONFIGURED" -> SN Severity 5 (Info)');
Verify that events are flowing from the external platform into ServiceNow.
Using MCP:
Tool: SN-Query-Table
Parameters:
table_name: em_event
query: source=Datadog^ORsource=Dynatrace^ORsource=New Relic^ORDERBYDESCtime_of_event
fields: sys_id,source,node,type,resource,metric_name,severity,description,time_of_event,state
limit: 25
Using REST API:
GET /api/now/table/em_event?sysparm_query=source=Datadog^ORsource=Dynatrace^ORsource=New Relic^ORDERBYDESCtime_of_event&sysparm_fields=sys_id,source,node,type,resource,metric_name,severity,description,time_of_event,state&sysparm_display_value=true&sysparm_limit=25
Check alerts created from ingested events and verify CI binding.
Using MCP:
Tool: SN-Query-Table
Parameters:
table_name: em_alert
query: source=Datadog^ORsource=Dynatrace^ORsource=New Relic^state!=Closed^ORDERBYDESCsys_created_on
fields: sys_id,number,source,node,ci,severity,state,description,group_source,acknowledged,sys_created_on
limit: 25
Using REST API:
GET /api/now/table/em_alert?sysparm_query=source=Datadog^ORsource=Dynatrace^ORsource=New Relic^state!=Closed^ORDERBYDESCsys_created_on&sysparm_fields=sys_id,number,source,node,ci,severity,state,description,group_source,acknowledged,sys_created_on&sysparm_display_value=true&sysparm_limit=25
Verify that alerts are correctly bound to CMDB CIs.
Using MCP:
Tool: SN-Execute-Background-Script
Parameters:
description: Analyze CI binding rates for external observability alerts
script: |
gs.info('=== CI BINDING ANALYSIS ===');
var sources = ['Datadog', 'Dynatrace', 'New Relic'];
for (var i = 0; i < sources.length; i++) {
var src = sources[i];
var total = new GlideAggregate('em_alert');
total.addQuery('source', src);
total.addAggregate('COUNT');
total.query();
total.next();
var totalCount = parseInt(total.getAggregate('COUNT'));
if (totalCount === 0) continue;
var bound = new GlideAggregate('em_alert');
bound.addQuery('source', src);
bound.addQuery('ci', '!=', '');
bound.addAggregate('COUNT');
bound.query();
bound.next();
var boundCount = parseInt(bound.getAggregate('COUNT'));
var unbound = totalCount - boundCount;
var rate = Math.round((boundCount / totalCount) * 100);
gs.info(src + ': Total=' + totalCount + ' | Bound=' + boundCount + ' | Unbound=' + unbound + ' | Rate=' + rate + '%');
// Show unbound alert nodes for troubleshooting
if (unbound > 0) {
var ub = new GlideRecord('em_alert');
ub.addQuery('source', src);
ub.addQuery('ci', '');
ub.setLimit(5);
ub.query();
while (ub.next()) {
gs.info(' Unbound: node=' + ub.node + ' | resource=' + ub.resource + ' | type=' + ub.type);
}
}
}
Map external metrics to ServiceNow metric definitions for Health Log Analytics.
Using MCP:
Tool: SN-Query-Table
Parameters:
table_name: sa_metric_definition
query: active=true^ORDERBYname
fields: sys_id,name,description,ci_type,metric_type,unit,source
limit: 30
Using REST API:
GET /api/now/table/sa_metric_definition?sysparm_query=active=true^ORDERBYname&sysparm_fields=sys_id,name,description,ci_type,metric_type,unit,source&sysparm_display_value=true&sysparm_limit=30
| Tool | When to Use |
|------|-------------|
| SN-Query-Table | Query connectors, events, alerts, match rules |
| SN-Get-Record | Retrieve specific connector or alert details |
| SN-Create-Record | Create new connector instances or match rules |
| SN-Update-Record | Modify connector configuration or alert states |
| SN-Execute-Background-Script | CI binding analysis, bulk validation, normalization review |
| SN-NL-Search | Natural language queries like "unbound alerts from Datadog" |
| Endpoint | Method | Purpose |
|----------|--------|---------|
| /api/now/table/em_connector_instance | GET/POST | Manage connector instances |
| /api/now/table/em_connector_type | GET | List available connector types |
| /api/now/table/em_event | GET | View raw ingested events |
| /api/now/table/em_alert | GET | View processed alerts |
| /api/now/table/em_match_rule | GET/POST | Manage alert normalization rules |
| /api/now/table/sa_metric_definition | GET | View metric definitions |
last_run_status to catch silent failuresCause: Authentication failure, API endpoint unreachable, or MID Server connectivity issue Solution: Verify API keys and endpoint URLs. Check MID Server logs for network errors. Test the external API directly from the MID Server host.
Cause: Event processing rules or match rules not matching the incoming event payload
Solution: Review em_event records for the raw payload. Check that node, type, resource fields match the expected format in match rules.
Cause: The node value from the external platform does not match any CI name, fqdn, or ip_address in the CMDB
Solution: Create CI lookup rules or transform maps to reconcile external hostnames with CMDB naming. Use the em_binding_rule table for custom binding logic.
Cause: Insufficient filtering at the connector level or overly broad monitoring scopes Solution: Apply filters in the connector configuration to limit which monitors/alerts are ingested. Use alert management rules to suppress low-value alerts.
# 1. Check connector status
Tool: SN-Query-Table
Parameters:
table_name: em_connector_instance
query: nameLIKEDatadog
fields: sys_id,name,status,last_run_time,last_run_status,polling_interval
limit: 5
# 2. View recent Datadog events
Tool: SN-Query-Table
Parameters:
table_name: em_event
query: source=Datadog^ORDERBYDESCtime_of_event
fields: source,node,type,severity,description,time_of_event
limit: 10
# 3. View resulting alerts
Tool: SN-Query-Table
Parameters:
table_name: em_alert
query: source=Datadog^state!=Closed^ORDERBYDESCsys_created_on
fields: number,node,ci,severity,state,description
limit: 10
Tool: SN-Execute-Background-Script
Parameters:
description: Audit severity distribution by source
script: |
var sources = ['Datadog', 'Dynatrace', 'New Relic'];
for (var i = 0; i < sources.length; i++) {
var ga = new GlideAggregate('em_alert');
ga.addQuery('source', sources[i]);
ga.addQuery('state', '!=', 'Closed');
ga.addAggregate('COUNT');
ga.groupBy('severity');
ga.query();
gs.info('=== ' + sources[i] + ' Alert Severity Distribution ===');
while (ga.next()) {
gs.info('Severity ' + ga.severity.getDisplayValue() + ': ' + ga.getAggregate('COUNT'));
}
}
Tool: SN-Execute-Background-Script
Parameters:
description: Compare alert volumes and CI binding across observability platforms
script: |
gs.info('=== CROSS-PLATFORM COMPARISON ===');
var sources = ['Datadog', 'Dynatrace', 'New Relic'];
for (var i = 0; i < sources.length; i++) {
var ga = new GlideAggregate('em_alert');
ga.addQuery('source', sources[i]);
ga.addQuery('sys_created_on', '>=', gs.daysAgo(7));
ga.addAggregate('COUNT');
ga.query();
ga.next();
var count = ga.getAggregate('COUNT');
gs.info(sources[i] + ' alerts (last 7 days): ' + count);
}
itom/alert-analysis - Analyze and manage alerts from any sourceitom/service-mapping - Map observability data to business servicesitom/health-log-analytics - Use ingested metrics for anomaly detectioncmdb/relationship-mapping - Ensure CIs are properly represented for alert bindingtesting
Manage supplier onboarding, qualification, performance monitoring, and offboarding with auditable lifecycle controls
tools
Identify emerging risks, prioritize intake signals, and route candidates into formal GRC risk assessment workflows
documentation
Screen inbound documents for completeness, policy risk, and routing readiness before extraction or case workflows
testing
Generate concise task summaries with status, timeline, blockers, SLA risk, and recommended next actions