diff --git a/src/sap_cloud_sdk/core/auditlog_ng/client.py b/src/sap_cloud_sdk/core/auditlog_ng/client.py index cea6054..4dccba6 100644 --- a/src/sap_cloud_sdk/core/auditlog_ng/client.py +++ b/src/sap_cloud_sdk/core/auditlog_ng/client.py @@ -151,14 +151,12 @@ def __init__( def send( self, event: Message, - event_type: Optional[str] = None, format: str = "protobuf-binary", ) -> str: """Send an audit log event. Args: event: Protobuf message (audit event). - event_type: Event type name (defaults to message type name). format: Serialization format (``"protobuf-binary"`` or ``"json"``). Returns: @@ -192,16 +190,11 @@ def send( event_id = str(uuid.uuid4()) - if event_type is None: - descriptor = getattr(event, "DESCRIPTOR", None) - descriptor_name = getattr(descriptor, "name", None) - if not isinstance(descriptor_name, str) or not descriptor_name: - raise ValueError( - "Could not determine event type from message descriptor" - ) - event_type = descriptor_name - - event_type = f"sap.als.AuditEvent.{event_type}.v2" + descriptor = getattr(event, "DESCRIPTOR", None) + descriptor_full_name = getattr(descriptor, "full_name", None) + if not isinstance(descriptor_full_name, str) or not descriptor_full_name: + raise ValueError("Could not determine event type from message descriptor") + event_type = descriptor_full_name if format == "json": mime_type = "application/json" @@ -225,9 +218,9 @@ def send( return event_id - def send_json(self, event: Message, event_type: Optional[str] = None) -> str: + def send_json(self, event: Message) -> str: """Send event in JSON format.""" - return self.send(event, event_type, format="json") + return self.send(event, format="json") def flush(self) -> None: """Flush pending events (for batch mode).""" diff --git a/src/sap_cloud_sdk/core/auditlog_ng/user-guide.md b/src/sap_cloud_sdk/core/auditlog_ng/user-guide.md index a0ef42f..430ee2d 100644 --- a/src/sap_cloud_sdk/core/auditlog_ng/user-guide.md +++ b/src/sap_cloud_sdk/core/auditlog_ng/user-guide.md @@ -125,17 +125,16 @@ event.object_id = "resource-001" **Binary protobuf:** ```python -event_id = client.send(event, "DataAccess") +event_id = client.send(event) print(f"Sent event with ID: {event_id}") ``` **JSON format:** ```python -event_id = client.send_json(event, "DataAccess") +event_id = client.send_json(event) ``` -> The `event_type` argument is optional. If omitted, the client derives it from the protobuf descriptor name (e.g., `"sap.als.AuditEvent.DataAccess.v2"`). ### Step 5: Close the Client @@ -177,7 +176,7 @@ class AgentAuditLogger: event.object_type = "resource" event.object_id = resource - event_id = self.client.send(event, "DataAccess") + event_id = self.client.send(event) return event_id def shutdown(self): @@ -213,7 +212,7 @@ with create_client( cert_file="/path/to/cert.pem", key_file="/path/to/key.pem", ) as client: - event_id = client.send(event, "DataAccess") + event_id = client.send(event) ``` --- diff --git a/tests/core/unit/auditlog_ng/unit/test_client.py b/tests/core/unit/auditlog_ng/unit/test_client.py index 8707184..917da6d 100644 --- a/tests/core/unit/auditlog_ng/unit/test_client.py +++ b/tests/core/unit/auditlog_ng/unit/test_client.py @@ -67,10 +67,10 @@ def _make_mocked_client( ) -def _make_mock_event(tenant_id="tenant-123", descriptor_name="DataAccess"): +def _make_mock_event(tenant_id="tenant-123", descriptor_full_name="sap.auditlog.auditevent.v2.DataAccess"): event = MagicMock() event.common.tenant_id = tenant_id - event.DESCRIPTOR.name = descriptor_name + event.DESCRIPTOR.full_name = descriptor_full_name event.SerializeToString.return_value = b"\x00\x01\x02" return event @@ -120,14 +120,14 @@ def test_send_binary_success(self): client, mock_logger, _, mock_validate, patcher, _ = _make_mocked_client() try: event = _make_mock_event() - event_id = client.send(event, "DataAccess") + event_id = client.send(event) assert isinstance(event_id, str) mock_validate.assert_called_once_with(event) mock_logger.emit.assert_called_once() _, kwargs = mock_logger.emit.call_args - assert kwargs["event_name"] == "sap.als.AuditEvent.DataAccess.v2" + assert kwargs["event_name"] == "sap.auditlog.auditevent.v2.DataAccess" assert kwargs["body"] == b"\x00\x01\x02" assert ( kwargs["attributes"]["sap.auditlogging.mime_type"] @@ -142,7 +142,7 @@ def test_send_json_success(self): client, mock_logger, _, mock_validate, patcher, _ = _make_mocked_client() try: event = _make_mock_event() - event_id = client.send_json(event, "DataAccess") + event_id = client.send_json(event) assert isinstance(event_id, str) mock_logger.emit.assert_called_once() @@ -158,11 +158,11 @@ def test_send_json_success(self): def test_send_uses_descriptor_name_when_event_type_missing(self): client, mock_logger, _, _, patcher, _ = _make_mocked_client() try: - event = _make_mock_event(descriptor_name="ConfigurationChange") + event = _make_mock_event(descriptor_full_name="sap.auditlog.auditevent.v2.ConfigurationChange") client.send(event) _, kwargs = mock_logger.emit.call_args - assert kwargs["event_name"] == "sap.als.AuditEvent.ConfigurationChange.v2" + assert kwargs["event_name"] == "sap.auditlog.auditevent.v2.ConfigurationChange" finally: patcher.stop() @@ -172,13 +172,13 @@ def test_send_on_closed_client_raises(self): client.close() with pytest.raises(RuntimeError, match="Client is closed"): - client.send(_make_mock_event(), "DataAccess") + client.send(_make_mock_event()) def test_send_invalid_format_raises(self): client, _, _, _, patcher, _ = _make_mocked_client() try: with pytest.raises(ValueError, match="format must be"): - client.send(_make_mock_event(), "DataAccess", format="xml") + client.send(_make_mock_event(), format="xml") finally: patcher.stop() @@ -190,7 +190,7 @@ def test_send_validation_failure_raises_validation_error(self): ) try: with pytest.raises(ValidationError, match="Audit event validation failed"): - client.send(_make_mock_event(), "DataAccess") + client.send(_make_mock_event()) mock_logger.emit.assert_not_called() finally: @@ -202,7 +202,7 @@ def test_send_invalid_tenant_id_raises(self): event = _make_mock_event(tenant_id="bad tenant id") with pytest.raises(ValueError): - client.send(event, "DataAccess") + client.send(event) mock_logger.emit.assert_not_called() finally: