Fixed the bad classification issue.
This commit is contained in:
@@ -164,6 +164,7 @@ IGNORED_DISCOVERY_FIELDS = {
|
|||||||
"fgai_stream_id",
|
"fgai_stream_id",
|
||||||
"fgai_stream_name",
|
"fgai_stream_name",
|
||||||
}
|
}
|
||||||
|
EMPTY_DISCOVERY_VALUES = {"", "-", "--", "unknown", "n/a", "none", "null", "nil", "undefined", "[]", "{}"}
|
||||||
|
|
||||||
|
|
||||||
def _stream_id(event: LogEvent) -> str:
|
def _stream_id(event: LogEvent) -> str:
|
||||||
@@ -182,6 +183,11 @@ def _is_number(value: str) -> bool:
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def _has_discovery_value(value: object) -> bool:
|
||||||
|
text = str(value).strip()
|
||||||
|
return text.lower() not in EMPTY_DISCOVERY_VALUES
|
||||||
|
|
||||||
|
|
||||||
def _pick_present(priority: tuple[str, ...], coverage: Counter[str], total: int, *, min_ratio: float = 0.05, limit: int = 6) -> list[str]:
|
def _pick_present(priority: tuple[str, ...], coverage: Counter[str], total: int, *, min_ratio: float = 0.05, limit: int = 6) -> list[str]:
|
||||||
selected = []
|
selected = []
|
||||||
for field in priority:
|
for field in priority:
|
||||||
@@ -436,7 +442,7 @@ def suggest_stream_profiles(events: list[LogEvent], *, existing_profiles: dict[s
|
|||||||
detector_counts: Counter[str] = Counter()
|
detector_counts: Counter[str] = Counter()
|
||||||
for event in stream_events:
|
for event in stream_events:
|
||||||
for field, value in event.fields.items():
|
for field, value in event.fields.items():
|
||||||
if not value:
|
if not _has_discovery_value(value):
|
||||||
continue
|
continue
|
||||||
coverage[field] += 1
|
coverage[field] += 1
|
||||||
if len(unique_values[field]) < 200:
|
if len(unique_values[field]) < 200:
|
||||||
|
|||||||
@@ -22,6 +22,26 @@ class ProfileSuggestionTests(unittest.TestCase):
|
|||||||
self.assertIn("hitcount", profile["numeric_fields"])
|
self.assertIn("hitcount", profile["numeric_fields"])
|
||||||
self.assertIn("deny_action", profile["detectors"])
|
self.assertIn("deny_action", profile["detectors"])
|
||||||
|
|
||||||
|
def test_placeholder_winlog_fields_do_not_make_firewall_windows(self):
|
||||||
|
events = [
|
||||||
|
parse_log_line(
|
||||||
|
f"fgai_stream_id=firewall fgai_stream='Firewall Logs' srcip=10.0.0.{index} dstip=8.8.8.8 "
|
||||||
|
f"dstport=443 action=deny policyid=12 eventid=- winlog.channel=- winlog.event_id=- "
|
||||||
|
f"winlog.event_data.targetusername=- hostname=- username=- timestamp=2026-06-29T10:00:{index:02d}Z"
|
||||||
|
)
|
||||||
|
for index in range(1, 25)
|
||||||
|
]
|
||||||
|
|
||||||
|
suggestion = suggest_stream_profiles(events)[0]
|
||||||
|
profile = suggestion["profile"]
|
||||||
|
|
||||||
|
self.assertEqual(suggestion["detected_log_type"], "firewall")
|
||||||
|
self.assertNotIn("username", profile["entity_fields"])
|
||||||
|
self.assertNotIn("hostname", profile["entity_fields"])
|
||||||
|
self.assertIn("srcip", profile["entity_fields"])
|
||||||
|
self.assertIn("policyid", profile["categorical_fields"])
|
||||||
|
self.assertIn("deny_action", profile["detectors"])
|
||||||
|
|
||||||
def test_suggests_windows_event_fields(self):
|
def test_suggests_windows_event_fields(self):
|
||||||
events = [
|
events = [
|
||||||
parse_log_line(
|
parse_log_line(
|
||||||
|
|||||||
Reference in New Issue
Block a user