Create script based widgets based on scripts for reports and dashboards in Cortex XSIAM.
You can use script-based widgets to perform calculations on and visualize third-party data.
Note
Add the widget tag in the script settings to make the script available for use in script-based widgets. For more information, see Create a script.
The following are sample Python scripts for the graph types Single Value, Pie, Line, and Column.
This example shows how to use a script with an API call to return a single value in a widget. Use this example to build your own script that pulls in third-party data to display a single value.
Note
If your script returns a time duration, configure the widget with the graph type Single Value and enable Show as Time..
import requests
def main():
api_key = 'PUTYOURKEYHERE'
symbol = 'PANW'
api_url = f'https://www.alphavantage.co/query?function=GLOBAL_QUOTE&symbol={symbol}&apikey={api_key}'
response = requests.get(api_url)
data = response.json()
price_str = data['Global Quote']['05. price']
price_int = int(float(price_str))
return_results(price_int)
if __name__ in ('__main__', '__builtin__', 'builtins'):
main()
The following example script creates random, mock data to simulate a stock price fluctuating over a short period of time. Use this example to build your own script that brings in third-party data and display trends using a pie, line, or column chart.
import random
import json
from datetime import datetime, timedelta
def main():
chart_data = []
start_time = datetime.strptime("13:00", "%H:%M")
# Start the price at a realistic value
current_price = 202.0
# Simulate 50 data points
for i in range(50):
# Generate a time label in 1-minute jumps
time_label = (start_time + timedelta(minutes=i)).strftime("%H:%M")
# Create the data point for the chart
data_point = {
"name": time_label,
"data": [int(current_price)],
"groups": []
}
chart_data.append(data_point)
# Simulate the next price by adding a small change to the current price
price_change = random.uniform(-1.5, 1.5) # A small drift up or down
current_price += price_change
# Return the data formatted exactly as in your working script
return_results({
"Type": 1,
"ContentsFormat": "json",
"Contents": json.dumps(chart_data)
})
if __name__ in ('__main__', '__builtin__', 'builtins'):
main()When used in a widget:
The following example script generates simulated data representing the count of security incidents (or other events) broken down by severity level for each day of the week (Monday to Friday). Use this example to build your own script to create a stacked column chart. Configure the widget with graph type Column subtype Stacked.
import json
import random
def main():
chart_data = []
days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]
severities = ["Critical", "High", "Medium", "Low", "Info"]
for day in days:
groups_list = []
daily_total = 0
for severity in severities:
count = 0
if severity == "Critical":
count = random.randint(0, 5)
elif severity == "High":
count = random.randint(5, 15)
elif severity == "Medium":
count = random.randint(10, 25)
elif severity == "Low":
count = random.randint(20, 50)
else:
count = random.randint(5, 30)
daily_total += count
groups_list.append({"name": severity, "data": [count]})
chart_data.append({
"name": day,
"data": [daily_total],
"groups": groups_list
})
return_results({
"Type": 1,
"ContentsFormat": "json",
"Contents": json.dumps(chart_data)
})
When used in a widget: