XMetricsTotal
- Type
- python
- Pack
- CommunityCommonDashboards
Source
import demistomock as demisto # noqa: F401
from CommonServerPython import * # noqa: F401
EFFORTCOLORS = ["RoyalBlue", "SkyBlue", "ForestGreen", "LimeGreen"]
SLACOLORS = [
"Thistle",
"Violet",
"Orchid",
"Magenta",
"MediumOrchid",
"MediumPurple",
"BlueViolet",
"Purple",
"Indigo",
"DarkSlateBlue",
]
INCCOLORS = [
"PaleGreen",
"Bisque",
"LightGreen",
"Wheat",
"DarkSeaGreen",
"Tan",
"MediumSeaGreen",
"SandyBrown",
"SeaGreen",
"GoldenRod",
"ForestGreen",
"DarkGoldenRod",
"Green",
"Chocolate",
"DarkGreen",
"Sienna",
"DarkOliveGreen",
"Brown",
"Teal",
"Maroon",
]
METRICCOLORS = {
"Incident Effort": EFFORTCOLORS,
"SLA Metrics": SLACOLORS,
"Incidents": INCCOLORS,
"Closed Incidents": INCCOLORS,
"Incident Open Duration": INCCOLORS,
"Effort Reduction": INCCOLORS,
}
def SetMetricColors(wstats: list, metrictype: str) -> list:
if metrictype in METRICCOLORS:
colors = METRICCOLORS[metrictype]
else:
return wstats
i = 0
for _w in wstats:
wstats[i]["color"] = colors[i % len(colors)]
i += 1
return wstats
def MetricWidget(wstats: list, name: str, data: list) -> list:
w = {"name": name, "data": [data], "color": ""}
wstats.append(w)
return wstats
def LoadList(listname: str) -> dict:
results = demisto.executeCommand("getList", {"listName": listname})[0]["Contents"]
fields = {}
if "Item not found" not in results and (results is not None or results != "") and results != "":
fields = json.loads(results)
return fields
def BuildIncidentTotal(incidents) -> dict:
table = {}
for inctype, v in incidents.items():
for _month, cnt in v.items():
if inctype not in table:
table[inctype] = 0
table[inctype] += int(cnt)
return table
def BuildIncidentAvg(incidents) -> dict:
table = {}
count = {}
for inctype, v in incidents.items():
for _month, cnt in v.items():
if inctype not in table:
table[inctype] = 0
count[inctype] = 0
table[inctype] += int(cnt)
if int(cnt) != 0:
count[inctype] += 1
for inctype, _v in table.items():
if count[inctype] > 0:
table[inctype] = int(table[inctype] / count[inctype] / 60)
return table
def BuildEffortReductionAvg(incidents, efforts) -> dict:
table = {}
count = {}
totalreduction = 0
for inctype, v in incidents.items():
for _month, val in v.items():
ival = int(val)
if inctype in efforts:
manualeffort = int(ival * efforts[inctype][0])
autoeffort = int(ival * efforts[inctype][1])
reduction = manualeffort - autoeffort
else:
reduction = 0
if inctype not in table:
table[inctype] = 0
count[inctype] = 0
if reduction > 0:
table[inctype] += reduction
count[inctype] += 1
totalreduction += reduction
for inctype, _v in table.items():
if totalreduction > 0:
table[inctype] = int((table[inctype] / totalreduction) * 100)
else:
table[inctype] = 0
return table
def BuildEffortTotal(incidents, efforts) -> dict:
table = {
"Manual Incident Effort": 0,
"Manual Indicator Effort": 0,
"Automated Incident Effort": 0,
"Automated Indicator Effort": 0,
}
for inctype, v in incidents.items():
for _month, val in v.items():
if inctype in efforts:
table["Manual Incident Effort"] += int((int(val) * efforts[inctype][0]) / 60)
table["Automated Incident Effort"] += int((int(val) * efforts[inctype][1]) / 60)
return table
def main():
try:
metricslist = demisto.args()["listname"]
effortlist = demisto.args().get("efflistname", "")
metrictype = demisto.args()["metrictype"]
if metrictype == "Effort Reduction":
metrics = LoadList(metricslist).get("Incidents", {})
else:
metrics = LoadList(metricslist).get(metrictype, {})
if not metrics:
return_results("[]")
if effortlist != "":
efforts = LoadList(effortlist)
if metrictype == "Effort Reduction":
stats = BuildEffortReductionAvg(metrics, efforts)
else:
stats = BuildEffortTotal(metrics, efforts)
else:
if metrictype in ["SLA Metrics", "Incident Open Duration"]:
stats = BuildIncidentAvg(metrics)
else:
stats = BuildIncidentTotal(metrics)
if len(stats) == 0:
return
wstats: list = []
for key, val in stats.items():
wstats = MetricWidget(wstats, key, val)
if effortlist != "" and metrictype == "Incidents":
wstats = SetMetricColors(wstats, "Incident Effort")
else:
wstats = SetMetricColors(wstats, metrictype)
return_results(json.dumps(wstats))
except Exception as ex:
demisto.error(traceback.format_exc()) # print the traceback
return_error(f"XMetricsTotal - exception failed to execute. Error: {ex!s}")
if __name__ in ("__main__", "__builtin__", "builtins"):
main()
README
Script Data
| Name |
Description |
| Script Type |
python3 |
| Tags |
widget |
Inputs
| Argument Name |
Description |
| listname |
The XSOAR list with stored metrics |
| efflistname |
XSOAR list with manual and automated effort by incident type |
| metrictype |
Type of metric: “SLA Metrics”, “Closed Incidents”, “Incidents”, “Incident Open Duration”, “Effort Reduction” |
Outputs
There are no outputs for this script.