HealthCheckNumberOfDroppedIncidents

Number of dropped incidents.

python · System Diagnostics and Health Check

Source

from datetime import datetime, timedelta

import demistomock as demisto  # noqa: F401
from CommonServerPython import *  # noqa: F401


def buildWidget(totalDropped):
    data = {
        "Type": 17,
        "ContentsFormat": "number",
        "Contents": {
            "stats": totalDropped,
            "params": {
                "timeFrame": "minutes",
                "colors": {
                    "isEnabled": True,
                    "items": {"#D13C3C": {"value": 15}},
                },
            },
        },
    }

    return data


def createActionItem(totalDropped):
    actionItems = []

    if totalDropped > thresholds["NumberOfDroppedIncidents"]:
        actionItems.append(
            {
                "category": "Incidents Analysis",
                "severity": "Low",
                "description": "Too many dropped incidents",
                "resolution": "Consider tuning the defined query to avoid fetching unneeded incidents",
            }
        )
    return CommandResults(
        readable_output="HealthCheckFileSysLog Done", outputs_prefix="HealthCheck.ActionableItems", outputs=actionItems
    )


incident = demisto.incidents()[0]
accountName = incident.get("account")
accountName = f"acc_{accountName}/" if accountName != "" else ""

args = demisto.args()
Thresholds = {"NumberOfDroppedIncidents": 2000}
thresholds = args.get("Thresholds", Thresholds)
isWidget = argToBoolean(args.get("isWidget", True))
daysAgo = datetime.today() - timedelta(days=30)

demisto_version: str = get_demisto_version().get("version")
if not demisto_version:
    return_error("Could not get the version of XSOAR")

if demisto_version.startswith("6"):  # xsoar 6
    stats = demisto.executeCommand(
        "core-api-post",
        {
            "uri": f"{accountName}settings/audits",
            "body": {"size": 10000, "query": f"type:notcreated and modified:>{str(daysAgo.strftime('%Y-%m-%d'))}"},
        },
    )

    if is_error(stats):
        return_error(f"error occurred when trying to retrieve the audit logs using {args=}, error: {stats}")

    totalDropped = stats[0]["Contents"]["response"]["total"]
    if isWidget is True:
        data = buildWidget(totalDropped)
        return_results(data)
    else:
        results = createActionItem(totalDropped)
        return_results(results)

else:  # XSOAR V8
    uri = "/public_api/v1/audits/management_logs"
    page_num = 1
    size = 100
    body = {
        "request_data": {
            "search_from": page_num,
            "search_to": size,
            "filters": [
                {"field": "sub_type", "operator": "in", "value": ["NotCreated - Incident"]},
            ],
        }
    }

    args = {"uri": uri, "body": body}
    stats = demisto.executeCommand("core-api-post", args)
    totalDropped = stats[0]["Contents"]["response"]["reply"]["total_count"]
    if is_error(stats):
        return_error(f"error occurred when trying to retrieve the audit logs using {args=}, error: {stats}")

    if isWidget is True:
        data = buildWidget(totalDropped)
        return_results(data)
    else:
        results = createActionItem(totalDropped)
        return_results(results)

README

Troubleshooting

Multi-tenant environments should be configured with the Cortex Rest API instance when using this
automation. Make sure the Use tenant parameter (in the Cortex Rest API integration) is checked
to ensure that API calls are made to the current tenant instead of the master tenant.