cmind/logs/v1/log_service.proto
Package: cmind.logs.v1
Messages
LogEntry
LogEntry is intentionally narrow — only the OpenTelemetry log fields the portal currently renders. Add fields when there's a concrete consumer.
| Field | Type | Number | Description |
|---|---|---|---|
timestamp | google.protobuf.Timestamp | 1 | |
severityText | string | 2 | |
body | string | 3 | |
logAttributes | map<string, string> | 4 | log_attributes carries application-level structured-log keys that the portal uses for trace stitching (trace_id, parent_span_id, event_type) and structured-log filtering. |
ListModelDeploymentLogsRequest
| Field | Type | Number | Description |
|---|---|---|---|
deploymentName | string | 1 | |
limit | uint32 | 2 | Row-pagination knobs. Will likely migrate to platform-wide cursor paging when that primitive lands. |
pageOffset | uint32 | 3 | |
startTime | google.protobuf.Timestamp | 4 | Unset == unbounded. |
endTime | google.protobuf.Timestamp | 5 | |
search | string | 6 | |
severity | string | 7 | |
podName | string | 8 | |
containerName | string | 9 | |
structured | bool | 10 | structured == true keeps only OTel-tagged telemetry rows (those carrying event_type / trace_id / span_id, set upstream by the OTel gateway's transform/log_type). Everything else (raw stdout) is dropped. |
ListModelDeploymentLogsResponse
| Field | Type | Number | Description |
|---|---|---|---|
logs | repeated LogEntry | 1 | |
hasMore | bool | 2 | No total: count(*) on workload_logs is non-trivial, the portal doesn't render it, and has_more is enough for "load more" ergonomics. |
ListRagDeploymentLogsRequest
ListRagDeploymentLogsRequest mirrors ListModelDeploymentLogsRequest's query knobs but identifies the deployment by its rag deployment id (== the deployment's StackID, the value the OTel collector stamps onto workload rows as ResourceAttributes['stackId']) rather than a resolved k8s name. Authorization keys on id via the rag_deployment:{id}/can_read gate; the tenant_id is carried for parity with the rest of the rag surface and to scope the (id, tenant) pair the portal already holds.
| Field | Type | Number | Description |
|---|---|---|---|
id | string | 1 | |
tenantId | string | 2 | |
limit | uint32 | 3 | Row-pagination knobs. Will likely migrate to platform-wide cursor paging when that primitive lands. |
pageOffset | uint32 | 4 | |
startTime | google.protobuf.Timestamp | 5 | Unset == unbounded. |
endTime | google.protobuf.Timestamp | 6 | |
search | string | 7 | |
severity | string | 8 | |
podName | string | 9 | |
containerName | string | 10 | |
structured | bool | 11 | structured == true keeps only OTel-tagged telemetry rows (those carrying event_type / trace_id / span_id, set upstream by the OTel gateway's transform/log_type). Everything else (raw stdout) is dropped. |
ListRagDeploymentLogsResponse
| Field | Type | Number | Description |
|---|---|---|---|
logs | repeated LogEntry | 1 | |
hasMore | bool | 2 |
Services
LogRetrievalService
LogRetrievalService serves workload logs across resource domains. RPCs are resource-specific (model deployments and rag deployments today; external models likely next) so each can carry its own authz annotation and subject resolution, while sharing the LogEntry shape and query parameters.
ListModelDeploymentLogs
Request: ListModelDeploymentLogsRequest
Response: ListModelDeploymentLogsResponse
ListRagDeploymentLogs
ListRagDeploymentLogs is the rag-deployment counterpart. Unlike model deployment logs (a platform-admin surface), rag logs are tenant-scoped: the gate is the per-deployment can_read relation, which the parent_tenant tuple makes tenant-scoped, so tenant admins and rag readers can view them without the platform-wide can_manage_models grant.
Request: ListRagDeploymentLogsRequest
Response: ListRagDeploymentLogsResponse