generate process identifier for child proocesses

This commit is contained in:
Evgenii Alekseev 2025-03-09 04:42:01 +02:00
parent 631e572d60
commit d986db8926
5 changed files with 31 additions and 9 deletions

View File

@ -19,12 +19,14 @@
#
import atexit
import logging
import uuid
from typing import Self
from ahriman.core.configuration import Configuration
from ahriman.core.status import Client
from ahriman.models.log_record import LogRecord
from ahriman.models.log_record_id import LogRecordId
from ahriman.models.repository_id import RepositoryId
@ -80,6 +82,7 @@ class HttpLogHandler(logging.Handler):
handler = cls(repository_id, configuration, report=report, suppress_errors=suppress_errors)
root.addHandler(handler)
LogRecordId.DEFAULT_PROCESS_ID = str(uuid.uuid4()) # assign default process identifier for log records
atexit.register(handler.rotate)
return handler

View File

@ -19,7 +19,8 @@
#
import uuid
from dataclasses import dataclass, field
from dataclasses import dataclass
from typing import ClassVar
@dataclass(frozen=True)
@ -28,6 +29,7 @@ class LogRecordId:
log record process identifier
Attributes:
DEFAULT_PROCESS_ID(str): (class attribute) default process identifier
package_base(str): package base for which log record belongs
version(str): package version for which log record belongs
process_id(str, optional): unique process identifier
@ -35,7 +37,13 @@ class LogRecordId:
package_base: str
version: str
process_id: str = ""
# this is not mistake, this value is kind of global identifier, which is generated
# upon the process start
process_id: str = field(default=str(uuid.uuid4()))
DEFAULT_PROCESS_ID: ClassVar[str] = str(uuid.uuid4())
def __post_init__(self) -> None:
"""
assign process identifier from default if not set
"""
if not self.process_id:
object.__setattr__(self, "process_id", self.DEFAULT_PROCESS_ID)

View File

@ -603,7 +603,7 @@ def test_package_logs_add(web_client: WebClient, log_record: logging.LogRecord,
payload = {
"created": log_record.created,
"message": log_record.getMessage(),
"process_id": LogRecordId.process_id,
"process_id": LogRecordId.DEFAULT_PROCESS_ID,
"version": package_ahriman.version,
}
record = LogRecord(LogRecordId(package_ahriman.base, package_ahriman.version),
@ -650,7 +650,7 @@ def test_package_logs_get(web_client: WebClient, package_ahriman: Package, mocke
"created": 42.0,
"message": "log",
"version": package_ahriman.version,
"process_id": LogRecordId.process_id,
"process_id": LogRecordId.DEFAULT_PROCESS_ID,
}
response_obj = requests.Response()
response_obj._content = json.dumps([message]).encode("utf8")

View File

@ -0,0 +1,9 @@
from ahriman.models.log_record_id import LogRecordId
def test_init() -> None:
"""
must correctly assign proces identifier if not set
"""
assert LogRecordId("1", "2").process_id == LogRecordId.DEFAULT_PROCESS_ID
assert LogRecordId("1", "2", "3").process_id == "3"

View File

@ -50,13 +50,13 @@ async def test_get(client: TestClient, package_ahriman: Package) -> None:
"created": 42.0,
"message": "message 1",
"version": "42",
"process_id": LogRecordId.process_id,
"process_id": LogRecordId.DEFAULT_PROCESS_ID,
},
{
"created": 43.0,
"message": "message 2",
"version": "42",
"process_id": LogRecordId.process_id,
"process_id": LogRecordId.DEFAULT_PROCESS_ID,
},
]
@ -81,7 +81,9 @@ async def test_get_with_pagination(client: TestClient, package_ahriman: Package)
logs = await response.json()
assert not response_schema.validate(logs)
assert logs == [{"created": 42.0, "message": "message 1", "version": "42", "process_id": LogRecordId.process_id}]
assert logs == [
{"created": 42.0, "message": "message 1", "version": "42", "process_id": LogRecordId.DEFAULT_PROCESS_ID},
]
async def test_get_bad_request(client: TestClient, package_ahriman: Package) -> None: