DBotShowClusteringModelInfo

Show clustering model information - model summary and incidents in specific cluster.

python · Base

Source

from CommonServerPython import *

# CONSTS
BASE_INCIDENT_COLUMNS = ["id", "created", "name", "Group name", "Group id"]


def show_model_info(model_name):
    success = False
    start = datetime.now()
    model = None

    while not success and datetime.now() - start < timedelta(minutes=10):
        res = demisto.executeCommand("getMLModel", {"modelName": model_name})
        if is_error(res):
            time.sleep(5)
        else:
            success = True
            model = res[0]["Contents"]

    if model:
        md = model["model"]["extra"]["modelSummaryMarkdown"]
        return_outputs(md)
    else:
        return_outputs("Cannot find model " + model_name)


def wrapped_list(obj):
    if not isinstance(obj, list):
        return [obj]
    return obj


def show_incidents_in_cluster(model_name, query, display_fields):
    res = demisto.executeCommand("DBotTrainClustering", {"modelName": model_name})
    data = res[0]["Contents"]["data"]
    id_to_cluster = {}
    id_to_cluster_name = {}
    incidents = []  # type: ignore
    for row in data:
        if row["pivot"] in query.split(" "):
            incidents_in_cluster = json.loads(row["incidents"])
            incidents += incidents_in_cluster
            for inc in incidents_in_cluster:
                id_to_cluster[inc["id"]] = re.sub(r"\D", "", row["pivot"])
                id_to_cluster_name[inc["id"]] = row.get("name")

    incidents_to_show = []
    for inc in incidents:
        incident_to_show = {}
        for field in display_fields:
            if field in inc:
                value = inc[field]
            else:
                value = wrapped_list(demisto.dt(inc, field))
                value = " ".join(set(filter(lambda x: x not in ["None", None, "N/A"], value)))  # type: ignore
            incident_to_show[field] = value
        incident_to_show["Id"] = "[{0}](#/Details/{0})".format(inc["id"])
        incident_to_show["Name"] = incident_to_show["name"].replace("#", "")
        incident_to_show["Created"] = incident_to_show["created"][: incident_to_show["created"].find(".")]
        incident_to_show["Group id"] = id_to_cluster.get(inc["id"])
        incident_to_show["Group name"] = id_to_cluster_name.get(inc["id"])
        incidents_to_show.append(incident_to_show)

    headers = [x.capitalize() for x in BASE_INCIDENT_COLUMNS] + [x for x in display_fields if x not in BASE_INCIDENT_COLUMNS]
    title = "Incidents In Clusters " + ", ".join(set(id_to_cluster.values()))
    return_outputs(tableToMarkdown(title, incidents_to_show, headers))


def main():
    query = demisto.args().get("searchQuery")
    model_name = demisto.args()["modelName"]
    return_type = demisto.args()["returnType"]
    if return_type == "incidents":
        if not query:
            return_outputs("## Please select a specific cluster to show incidents")
        else:
            display_fields = demisto.args().get("fieldsToDisplay", "").split(",")
            display_fields = [x.strip() for x in display_fields if x]
            display_fields = list(set(BASE_INCIDENT_COLUMNS + display_fields))
            display_fields = list(dict.fromkeys(display_fields))
            show_incidents_in_cluster(model_name, query, display_fields)
    else:
        show_model_info(model_name)


if __name__ in ["__main__", "__builtin__", "builtins"]:
    main()

README

Show clustering model information - model summary and incidents in specific cluster.

Script Data


Name Description
Script Type python3
Tags widget
Cortex XSOAR Version 6.2.0

Inputs


Argument Name Description
modelName The model name.
searchQuery The input query from the dashboard.
fromDate The start date by which to filter incidents. Date format will be the same as in the incidents query page, for example: “3 days ago”, ““2019-01-01T00:00:00 +0200”).
fieldsToDisplay Comma-separated list of additional incident fields to display, but which will not be taken into account when computing similarity.
returnType Return model summary or incidents in specific group according to the search query.

Outputs


There are no outputs for this script.