from __future__ import annotations from enum import Enum from typing import Annotated, Union from pydantic import BaseModel, Field, TypeAdapter class BaseLogEntry(BaseModel): # https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry log_name: Annotated[str, Field(alias="logName")] resource: dict # https://cloud.google.com/logging/docs/reference/v2/rest/v2/MonitoredResource timestamp: str receive_timestamp: Annotated[str, Field(alias="receiveTimestamp")] severity: LogSeverity insert_id: Annotated[str, Field(alias="insertId")] http_request: Annotated[ dict | None, Field(alias="httpRequest", default=None) ] # https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#HttpRequest labels: Annotated[dict[str, str] | None, Field(default=None)] metadata: Annotated[ dict | None, Field(default=None) ] # https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#MonitoredResourceMetadata operation: Annotated[ dict | None, Field(default=None) ] # https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#LogEntryOperation trace: Annotated[str | None, Field(default=None)] span_id: Annotated[str | None, Field(alias="spanId", default=None)] trace_sampled: Annotated[bool | None, Field(alias="traceSampled", default=None)] source_location: Annotated[ dict | None, Field(alias="sourceLocation", default=None) ] # https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#LogEntrySourceLocation split: Annotated[ dict | None, Field(default=None) ] # https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#LogSplit error_groups: Annotated[ list[dict] | None, Field(alias="errorGroups", default=None) ] # https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#LogErrorGroup apphub: Annotated[ dict | None, Field(default=None) ] # https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#AppHub class ProtoPayloadLogEntry(BaseLogEntry): # https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry proto_payload: Annotated[dict, Field(alias="protoPayload")] class TextPayloadLogEntry(BaseLogEntry): # https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry text_payload: Annotated[str, Field(alias="textPayload")] class JsonPayloadLogEntry(BaseLogEntry): # https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry json_payload: Annotated[dict, Field(alias="jsonPayload")] class LogSeverity(str, Enum): # https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#LogSeverity DEFAULT = "DEFAULT" DEBUG = "DEBUG" INFO = "INFO" NOTICE = "NOTICE" WARNING = "WARNING" ERROR = "ERROR" CRITICAL = "CRITICAL" ALERT = "ALERT" EMERGENCY = "EMERGENCY" LogEntry = Annotated[ Union[ProtoPayloadLogEntry, JsonPayloadLogEntry, TextPayloadLogEntry, BaseLogEntry], Field(), ] def create_log_entry(entry: dict) -> LogEntry: return TypeAdapter(LogEntry).validate_python(entry)