From deddbd86af4dd0ee715fa23ac75e01df1aa15e6e Mon Sep 17 00:00:00 2001 From: Wes Date: Mon, 11 Sep 2023 18:56:35 -0700 Subject: [PATCH] feat: Add limit to GetTimeline query (#375) --- backend/controller/console.go | 88 +- backend/controller/internal/dal/dal_test.go | 14 +- backend/controller/internal/dal/events.go | 36 +- .../block/ftl/v1/console/console_connect.ts | 11 +- .../xyz/block/ftl/v1/console/console_pb.ts | 243 +++--- protos/xyz/block/ftl/v1/console/console.pb.go | 775 +++++++++--------- protos/xyz/block/ftl/v1/console/console.proto | 53 +- .../pbconsoleconnect/console.connect.go | 25 - 8 files changed, 601 insertions(+), 644 deletions(-) diff --git a/backend/controller/console.go b/backend/controller/console.go index 2f7b71e1a4..2aaf179ae0 100644 --- a/backend/controller/console.go +++ b/backend/controller/console.go @@ -103,7 +103,7 @@ func (c *ConsoleService) GetModules(ctx context.Context, req *connect.Request[pb } func (c *ConsoleService) GetCalls(ctx context.Context, req *connect.Request[pbconsole.GetCallsRequest]) (*connect.Response[pbconsole.GetCallsResponse], error) { - events, err := c.dal.QueryEvents(ctx, dal.FilterCall(types.None[string](), req.Msg.Module, types.Some(req.Msg.Verb))) + events, err := c.dal.QueryEvents(ctx, 100, dal.FilterCall(types.None[string](), req.Msg.Module, types.Some(req.Msg.Verb))) if err != nil { return nil, errors.WithStack(err) } @@ -119,7 +119,7 @@ func (c *ConsoleService) GetRequestCalls(ctx context.Context, req *connect.Reque return nil, errors.WithStack(err) } - events, err := c.dal.QueryEvents(ctx, dal.FilterRequests(requestKey)) + events, err := c.dal.QueryEvents(ctx, 100, dal.FilterRequests(requestKey)) if err != nil { return nil, errors.WithStack(err) } @@ -134,12 +134,31 @@ func (c *ConsoleService) GetTimeline(ctx context.Context, req *connect.Request[p if err != nil { return nil, errors.WithStack(err) } - results, err := c.dal.QueryEvents(ctx, query...) + + if req.Msg.Limit == 0 { + return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("limit must be > 0")) + } + limit := int(req.Msg.Limit) + + // Get 1 more than the requested limit to determine if there are more results. + limitPlusOne := limit + 1 + + results, err := c.dal.QueryEvents(ctx, limitPlusOne, query...) if err != nil { return nil, errors.WithStack(err) } + + var cursor *int64 + // Return only the requested number of results. + if len(results) > limit { + results = results[:limit] + id := results[len(results)-1].GetID() + cursor = &id + } + response := &pbconsole.GetTimelineResponse{ Events: slices.Map(results, eventDALToProto), + Cursor: cursor, } return connect.NewResponse(response), nil } @@ -168,7 +187,7 @@ func (c *ConsoleService) StreamTimeline(ctx context.Context, req *connect.Reques for { thisRequestTime := time.Now() - events, err := c.dal.QueryEvents(ctx, append(query, dal.FilterTimeRange(thisRequestTime, lastEventTime))...) + events, err := c.dal.QueryEvents(ctx, 1000, append(query, dal.FilterTimeRange(thisRequestTime, lastEventTime))...) if err != nil { return errors.WithStack(err) } @@ -192,62 +211,6 @@ func (c *ConsoleService) StreamTimeline(ctx context.Context, req *connect.Reques } } -func (c *ConsoleService) StreamLogs(ctx context.Context, req *connect.Request[pbconsole.StreamLogsRequest], stream *connect.ServerStream[pbconsole.StreamLogsResponse]) error { - // Default to 1 second interval if not specified. - updateInterval := 1 * time.Second - if interval := req.Msg.UpdateInterval; interval != nil && interval.AsDuration() > time.Second { // Minimum 1s interval. - updateInterval = req.Msg.UpdateInterval.AsDuration() - } - - var query []dal.EventFilter - if req.Msg.DeploymentName != "" { - deploymentName, err := model.ParseDeploymentName(req.Msg.DeploymentName) - if err != nil { - return errors.WithStack(err) - } - query = append(query, dal.FilterDeployments(deploymentName)) - } - lastLogTime := req.Msg.AfterTime.AsTime() - for { - thisRequestTime := time.Now() - events, err := c.dal.QueryEvents(ctx, append(query, dal.FilterTimeRange(thisRequestTime, lastLogTime))...) - if err != nil { - return errors.WithStack(err) - } - - logEvents := filterEvents[*dal.LogEvent](events) - for index, log := range logEvents { - var requestKey *string - if r, ok := log.RequestKey.Get(); ok { - rstr := r.String() - requestKey = &rstr - } - - err := stream.Send(&pbconsole.StreamLogsResponse{ - Log: &pbconsole.LogEntry{ - DeploymentName: log.DeploymentName.String(), - RequestKey: requestKey, - TimeStamp: timestamppb.New(log.Time), - LogLevel: log.Level, - Attributes: log.Attributes, - Message: log.Message, - Error: log.Error.Ptr(), - }, - More: len(logEvents) > index+1, - }) - if err != nil { - return errors.WithStack(err) - } - } - lastLogTime = thisRequestTime - select { - case <-time.After(updateInterval): - case <-ctx.Done(): - return nil - } - } -} - func callEventToCall(event *dal.CallEvent) *pbconsole.Call { var requestKey *string if r, ok := event.RequestKey.Get(); ok { @@ -331,6 +294,11 @@ func filterEvents[E dal.Event](events []dal.Event) []E { func timelineQueryProtoToDAL(pb *pbconsole.TimelineQuery) ([]dal.EventFilter, error) { var query []dal.EventFilter + + if pb.Order == pbconsole.TimelineQuery_DESC { + query = append(query, dal.FilterDescending()) + } + for _, filter := range pb.Filters { switch filter := filter.Filter.(type) { case *pbconsole.TimelineQuery_Filter_Deployments: diff --git a/backend/controller/internal/dal/dal_test.go b/backend/controller/internal/dal/dal_test.go index 992b305b35..1f22ca2f44 100644 --- a/backend/controller/internal/dal/dal_test.go +++ b/backend/controller/internal/dal/dal_test.go @@ -254,26 +254,32 @@ func TestDAL(t *testing.T) { } t.Run("QueryEvents", func(t *testing.T) { + t.Run("Limit", func(t *testing.T) { + events, err := dal.QueryEvents(ctx, 1) + assert.NoError(t, err) + assert.Equal(t, 1, len(events)) + }) + t.Run("NoFilters", func(t *testing.T) { - events, err := dal.QueryEvents(ctx) + events, err := dal.QueryEvents(ctx, 1000) assert.NoError(t, err) assertEventsEqual(t, []Event{expectedDeploymentEvent, callEvent, logEvent}, events) }) t.Run("ByDeployment", func(t *testing.T) { - events, err := dal.QueryEvents(ctx, FilterDeployments(deploymentName)) + events, err := dal.QueryEvents(ctx, 1000, FilterDeployments(deploymentName)) assert.NoError(t, err) assertEventsEqual(t, []Event{expectedDeploymentEvent, callEvent, logEvent}, events) }) t.Run("ByCall", func(t *testing.T) { - events, err := dal.QueryEvents(ctx, FilterTypes(EventTypeCall), FilterCall(types.None[string](), "time", types.None[string]())) + events, err := dal.QueryEvents(ctx, 1000, FilterTypes(EventTypeCall), FilterCall(types.None[string](), "time", types.None[string]())) assert.NoError(t, err) assertEventsEqual(t, []Event{callEvent}, events) }) t.Run("ByLogLevel", func(t *testing.T) { - events, err := dal.QueryEvents(ctx, FilterTypes(EventTypeLog), FilterLogLevel(log.Trace)) + events, err := dal.QueryEvents(ctx, 1000, FilterTypes(EventTypeLog), FilterLogLevel(log.Trace)) assert.NoError(t, err) assertEventsEqual(t, []Event{logEvent}, events) }) diff --git a/backend/controller/internal/dal/events.go b/backend/controller/internal/dal/events.go index d76274e312..c3c17033d2 100644 --- a/backend/controller/internal/dal/events.go +++ b/backend/controller/internal/dal/events.go @@ -37,7 +37,10 @@ const ( // Event types. // //sumtype:decl -type Event interface{ event() } +type Event interface { + GetID() int64 + event() +} type LogEvent struct { ID int64 @@ -50,7 +53,8 @@ type LogEvent struct { Error types.Option[string] } -func (e *LogEvent) event() {} +func (e *LogEvent) GetID() int64 { return e.ID } +func (e *LogEvent) event() {} type CallEvent struct { ID int64 @@ -65,7 +69,8 @@ type CallEvent struct { Error types.Option[string] } -func (e *CallEvent) event() {} +func (e *CallEvent) GetID() int64 { return e.ID } +func (e *CallEvent) event() {} type DeploymentEvent struct { ID int64 @@ -78,7 +83,8 @@ type DeploymentEvent struct { ReplacedDeployment types.Option[model.DeploymentName] } -func (e *DeploymentEvent) event() {} +func (e *DeploymentEvent) GetID() int64 { return e.ID } +func (e *DeploymentEvent) event() {} type eventFilterCall struct { sourceModule types.Option[string] @@ -96,6 +102,7 @@ type eventFilter struct { olderThan time.Time idHigherThan int64 idLowerThan int64 + descending bool } type EventFilter func(query *eventFilter) @@ -155,6 +162,13 @@ func FilterIDRange(higherThan, lowerThan int64) EventFilter { } } +// FilterDescending returns events in descending order. +func FilterDescending() EventFilter { + return func(query *eventFilter) { + query.descending = true + } +} + // The internal JSON payload of a call event. type eventCallJSON struct { DurationMS int64 `json:"duration_ms"` @@ -180,7 +194,11 @@ type eventRow struct { RequestKey types.Option[model.IngressRequestKey] } -func (d *DAL) QueryEvents(ctx context.Context, filters ...EventFilter) ([]Event, error) { +func (d *DAL) QueryEvents(ctx context.Context, limit int, filters ...EventFilter) ([]Event, error) { + if limit < 1 { + return nil, errors.Errorf("limit must be >= 1, got %d", limit) + } + // Build query. q := `SELECT e.id AS id, d.name AS deployment_name, @@ -252,7 +270,13 @@ func (d *DAL) QueryEvents(ctx context.Context, filters ...EventFilter) ([]Event, q += ")\n" } - q += " ORDER BY time_stamp ASC" + if filter.descending { + q += " ORDER BY time_stamp DESC" + } else { + q += " ORDER BY time_stamp ASC" + } + + q += fmt.Sprintf(" LIMIT %d", limit) // Issue query. rows, err := d.db.Conn().Query(ctx, q, args...) diff --git a/console/client/src/protos/xyz/block/ftl/v1/console/console_connect.ts b/console/client/src/protos/xyz/block/ftl/v1/console/console_connect.ts index c3800a9a10..bef7a97abb 100644 --- a/console/client/src/protos/xyz/block/ftl/v1/console/console_connect.ts +++ b/console/client/src/protos/xyz/block/ftl/v1/console/console_connect.ts @@ -5,7 +5,7 @@ import { PingRequest, PingResponse } from "../ftl_pb.js"; import { MethodIdempotency, MethodKind } from "@bufbuild/protobuf"; -import { GetCallsRequest, GetCallsResponse, GetModulesRequest, GetModulesResponse, GetRequestCallsRequest, GetRequestCallsResponse, GetTimelineResponse, StreamLogsRequest, StreamLogsResponse, StreamTimelineRequest, StreamTimelineResponse, TimelineQuery } from "./console_pb.js"; +import { GetCallsRequest, GetCallsResponse, GetModulesRequest, GetModulesResponse, GetRequestCallsRequest, GetRequestCallsResponse, GetTimelineResponse, StreamTimelineRequest, StreamTimelineResponse, TimelineQuery } from "./console_pb.js"; /** * @generated from service xyz.block.ftl.v1.console.ConsoleService @@ -70,15 +70,6 @@ export const ConsoleService = { O: GetTimelineResponse, kind: MethodKind.Unary, }, - /** - * @generated from rpc xyz.block.ftl.v1.console.ConsoleService.StreamLogs - */ - streamLogs: { - name: "StreamLogs", - I: StreamLogsRequest, - O: StreamLogsResponse, - kind: MethodKind.ServerStreaming, - }, } } as const; diff --git a/console/client/src/protos/xyz/block/ftl/v1/console/console_pb.ts b/console/client/src/protos/xyz/block/ftl/v1/console/console_pb.ts index 3d02d3bfb7..f5154ce5a9 100644 --- a/console/client/src/protos/xyz/block/ftl/v1/console/console_pb.ts +++ b/console/client/src/protos/xyz/block/ftl/v1/console/console_pb.ts @@ -76,37 +76,43 @@ proto3.util.setEnumType(DeploymentEventType, "xyz.block.ftl.v1.console.Deploymen */ export enum LogLevel { /** - * @generated from enum value: LOG_LEVEL_TRACE = 0; + * @generated from enum value: LOG_LEVEL_UNKNOWN = 0; */ - TRACE = 0, + UNKNOWN = 0, + + /** + * @generated from enum value: LOG_LEVEL_TRACE = 1; + */ + TRACE = 1, /** - * @generated from enum value: LOG_LEVEL_DEBUG = 1; + * @generated from enum value: LOG_LEVEL_DEBUG = 5; */ - DEBUG = 1, + DEBUG = 5, /** - * @generated from enum value: LOG_LEVEL_INFO = 2; + * @generated from enum value: LOG_LEVEL_INFO = 9; */ - INFO = 2, + INFO = 9, /** - * @generated from enum value: LOG_LEVEL_WARN = 3; + * @generated from enum value: LOG_LEVEL_WARN = 13; */ - WARN = 3, + WARN = 13, /** - * @generated from enum value: LOG_LEVEL_ERROR = 4; + * @generated from enum value: LOG_LEVEL_ERROR = 17; */ - ERROR = 4, + ERROR = 17, } // Retrieve enum metadata with: proto3.getEnumType(LogLevel) proto3.util.setEnumType(LogLevel, "xyz.block.ftl.v1.console.LogLevel", [ - { no: 0, name: "LOG_LEVEL_TRACE" }, - { no: 1, name: "LOG_LEVEL_DEBUG" }, - { no: 2, name: "LOG_LEVEL_INFO" }, - { no: 3, name: "LOG_LEVEL_WARN" }, - { no: 4, name: "LOG_LEVEL_ERROR" }, + { no: 0, name: "LOG_LEVEL_UNKNOWN" }, + { no: 1, name: "LOG_LEVEL_TRACE" }, + { no: 5, name: "LOG_LEVEL_DEBUG" }, + { no: 9, name: "LOG_LEVEL_INFO" }, + { no: 13, name: "LOG_LEVEL_WARN" }, + { no: 17, name: "LOG_LEVEL_ERROR" }, ]); /** @@ -726,6 +732,16 @@ export class TimelineQuery extends Message { */ filters: TimelineQuery_Filter[] = []; + /** + * @generated from field: int32 limit = 2; + */ + limit = 0; + + /** + * @generated from field: xyz.block.ftl.v1.console.TimelineQuery.Order order = 3; + */ + order = TimelineQuery_Order.ASC; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -735,6 +751,8 @@ export class TimelineQuery extends Message { static readonly typeName = "xyz.block.ftl.v1.console.TimelineQuery"; static readonly fields: FieldList = proto3.util.newFieldList(() => [ { no: 1, name: "filters", kind: "message", T: TimelineQuery_Filter, repeated: true }, + { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, + { no: 3, name: "order", kind: "enum", T: proto3.getEnumType(TimelineQuery_Order) }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): TimelineQuery { @@ -754,6 +772,65 @@ export class TimelineQuery extends Message { } } +/** + * @generated from enum xyz.block.ftl.v1.console.TimelineQuery.Order + */ +export enum TimelineQuery_Order { + /** + * @generated from enum value: ASC = 0; + */ + ASC = 0, + + /** + * @generated from enum value: DESC = 1; + */ + DESC = 1, +} +// Retrieve enum metadata with: proto3.getEnumType(TimelineQuery_Order) +proto3.util.setEnumType(TimelineQuery_Order, "xyz.block.ftl.v1.console.TimelineQuery.Order", [ + { no: 0, name: "ASC" }, + { no: 1, name: "DESC" }, +]); + +/** + * Limit the number of events returned. + * + * @generated from message xyz.block.ftl.v1.console.TimelineQuery.LimitFilter + */ +export class TimelineQuery_LimitFilter extends Message { + /** + * @generated from field: int32 limit = 1; + */ + limit = 0; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "xyz.block.ftl.v1.console.TimelineQuery.LimitFilter"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): TimelineQuery_LimitFilter { + return new TimelineQuery_LimitFilter().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): TimelineQuery_LimitFilter { + return new TimelineQuery_LimitFilter().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): TimelineQuery_LimitFilter { + return new TimelineQuery_LimitFilter().fromJsonString(jsonString, options); + } + + static equals(a: TimelineQuery_LimitFilter | PlainMessage | undefined, b: TimelineQuery_LimitFilter | PlainMessage | undefined): boolean { + return proto3.util.equals(TimelineQuery_LimitFilter, a, b); + } +} + /** * Filters events by log level. * @@ -763,7 +840,7 @@ export class TimelineQuery_LogLevelFilter extends Message) { super(); @@ -1015,37 +1092,43 @@ export class TimelineQuery_Filter extends Message { */ filter: { /** - * @generated from field: xyz.block.ftl.v1.console.TimelineQuery.LogLevelFilter log_level = 1; + * @generated from field: xyz.block.ftl.v1.console.TimelineQuery.LimitFilter limit = 1; + */ + value: TimelineQuery_LimitFilter; + case: "limit"; + } | { + /** + * @generated from field: xyz.block.ftl.v1.console.TimelineQuery.LogLevelFilter log_level = 2; */ value: TimelineQuery_LogLevelFilter; case: "logLevel"; } | { /** - * @generated from field: xyz.block.ftl.v1.console.TimelineQuery.DeploymentFilter deployments = 2; + * @generated from field: xyz.block.ftl.v1.console.TimelineQuery.DeploymentFilter deployments = 3; */ value: TimelineQuery_DeploymentFilter; case: "deployments"; } | { /** - * @generated from field: xyz.block.ftl.v1.console.TimelineQuery.RequestFilter requests = 3; + * @generated from field: xyz.block.ftl.v1.console.TimelineQuery.RequestFilter requests = 4; */ value: TimelineQuery_RequestFilter; case: "requests"; } | { /** - * @generated from field: xyz.block.ftl.v1.console.TimelineQuery.EventTypeFilter event_types = 4; + * @generated from field: xyz.block.ftl.v1.console.TimelineQuery.EventTypeFilter event_types = 5; */ value: TimelineQuery_EventTypeFilter; case: "eventTypes"; } | { /** - * @generated from field: xyz.block.ftl.v1.console.TimelineQuery.TimeFilter time = 5; + * @generated from field: xyz.block.ftl.v1.console.TimelineQuery.TimeFilter time = 6; */ value: TimelineQuery_TimeFilter; case: "time"; } | { /** - * @generated from field: xyz.block.ftl.v1.console.TimelineQuery.IDFilter id = 6; + * @generated from field: xyz.block.ftl.v1.console.TimelineQuery.IDFilter id = 7; */ value: TimelineQuery_IDFilter; case: "id"; @@ -1059,12 +1142,13 @@ export class TimelineQuery_Filter extends Message { static readonly runtime: typeof proto3 = proto3; static readonly typeName = "xyz.block.ftl.v1.console.TimelineQuery.Filter"; static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "log_level", kind: "message", T: TimelineQuery_LogLevelFilter, oneof: "filter" }, - { no: 2, name: "deployments", kind: "message", T: TimelineQuery_DeploymentFilter, oneof: "filter" }, - { no: 3, name: "requests", kind: "message", T: TimelineQuery_RequestFilter, oneof: "filter" }, - { no: 4, name: "event_types", kind: "message", T: TimelineQuery_EventTypeFilter, oneof: "filter" }, - { no: 5, name: "time", kind: "message", T: TimelineQuery_TimeFilter, oneof: "filter" }, - { no: 6, name: "id", kind: "message", T: TimelineQuery_IDFilter, oneof: "filter" }, + { no: 1, name: "limit", kind: "message", T: TimelineQuery_LimitFilter, oneof: "filter" }, + { no: 2, name: "log_level", kind: "message", T: TimelineQuery_LogLevelFilter, oneof: "filter" }, + { no: 3, name: "deployments", kind: "message", T: TimelineQuery_DeploymentFilter, oneof: "filter" }, + { no: 4, name: "requests", kind: "message", T: TimelineQuery_RequestFilter, oneof: "filter" }, + { no: 5, name: "event_types", kind: "message", T: TimelineQuery_EventTypeFilter, oneof: "filter" }, + { no: 6, name: "time", kind: "message", T: TimelineQuery_TimeFilter, oneof: "filter" }, + { no: 7, name: "id", kind: "message", T: TimelineQuery_IDFilter, oneof: "filter" }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): TimelineQuery_Filter { @@ -1250,101 +1334,6 @@ export class TimelineEvent extends Message { } } -/** - * @generated from message xyz.block.ftl.v1.console.StreamLogsRequest - */ -export class StreamLogsRequest extends Message { - /** - * @generated from field: optional google.protobuf.Duration update_interval = 1; - */ - updateInterval?: Duration; - - /** - * @generated from field: google.protobuf.Timestamp after_time = 2; - */ - afterTime?: Timestamp; - - /** - * @generated from field: string deployment_name = 3; - */ - deploymentName = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "xyz.block.ftl.v1.console.StreamLogsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "update_interval", kind: "message", T: Duration, opt: true }, - { no: 2, name: "after_time", kind: "message", T: Timestamp }, - { no: 3, name: "deployment_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): StreamLogsRequest { - return new StreamLogsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): StreamLogsRequest { - return new StreamLogsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): StreamLogsRequest { - return new StreamLogsRequest().fromJsonString(jsonString, options); - } - - static equals(a: StreamLogsRequest | PlainMessage | undefined, b: StreamLogsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(StreamLogsRequest, a, b); - } -} - -/** - * @generated from message xyz.block.ftl.v1.console.StreamLogsResponse - */ -export class StreamLogsResponse extends Message { - /** - * @generated from field: xyz.block.ftl.v1.console.LogEntry log = 1; - */ - log?: LogEntry; - - /** - * If true there are more logs immediately following this one as part of the initial batch. - * If false this is the last log in the initial batch, but others may follow later. - * - * @generated from field: bool more = 2; - */ - more = false; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "xyz.block.ftl.v1.console.StreamLogsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "log", kind: "message", T: LogEntry }, - { no: 2, name: "more", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): StreamLogsResponse { - return new StreamLogsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): StreamLogsResponse { - return new StreamLogsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): StreamLogsResponse { - return new StreamLogsResponse().fromJsonString(jsonString, options); - } - - static equals(a: StreamLogsResponse | PlainMessage | undefined, b: StreamLogsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(StreamLogsResponse, a, b); - } -} - /** * @generated from message xyz.block.ftl.v1.console.GetTimelineResponse */ @@ -1354,6 +1343,13 @@ export class GetTimelineResponse extends Message { */ events: TimelineEvent[] = []; + /** + * For pagination, this cursor is where we should start our next query + * + * @generated from field: optional int64 cursor = 2; + */ + cursor?: bigint; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -1363,6 +1359,7 @@ export class GetTimelineResponse extends Message { static readonly typeName = "xyz.block.ftl.v1.console.GetTimelineResponse"; static readonly fields: FieldList = proto3.util.newFieldList(() => [ { no: 1, name: "events", kind: "message", T: TimelineEvent, repeated: true }, + { no: 2, name: "cursor", kind: "scalar", T: 3 /* ScalarType.INT64 */, opt: true }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): GetTimelineResponse { diff --git a/protos/xyz/block/ftl/v1/console/console.pb.go b/protos/xyz/block/ftl/v1/console/console.pb.go index d099cec1b9..0b98a5db0d 100644 --- a/protos/xyz/block/ftl/v1/console/console.pb.go +++ b/protos/xyz/block/ftl/v1/console/console.pb.go @@ -131,28 +131,31 @@ func (DeploymentEventType) EnumDescriptor() ([]byte, []int) { type LogLevel int32 const ( - LogLevel_LOG_LEVEL_TRACE LogLevel = 0 - LogLevel_LOG_LEVEL_DEBUG LogLevel = 1 - LogLevel_LOG_LEVEL_INFO LogLevel = 2 - LogLevel_LOG_LEVEL_WARN LogLevel = 3 - LogLevel_LOG_LEVEL_ERROR LogLevel = 4 + LogLevel_LOG_LEVEL_UNKNOWN LogLevel = 0 + LogLevel_LOG_LEVEL_TRACE LogLevel = 1 + LogLevel_LOG_LEVEL_DEBUG LogLevel = 5 + LogLevel_LOG_LEVEL_INFO LogLevel = 9 + LogLevel_LOG_LEVEL_WARN LogLevel = 13 + LogLevel_LOG_LEVEL_ERROR LogLevel = 17 ) // Enum value maps for LogLevel. var ( LogLevel_name = map[int32]string{ - 0: "LOG_LEVEL_TRACE", - 1: "LOG_LEVEL_DEBUG", - 2: "LOG_LEVEL_INFO", - 3: "LOG_LEVEL_WARN", - 4: "LOG_LEVEL_ERROR", + 0: "LOG_LEVEL_UNKNOWN", + 1: "LOG_LEVEL_TRACE", + 5: "LOG_LEVEL_DEBUG", + 9: "LOG_LEVEL_INFO", + 13: "LOG_LEVEL_WARN", + 17: "LOG_LEVEL_ERROR", } LogLevel_value = map[string]int32{ - "LOG_LEVEL_TRACE": 0, - "LOG_LEVEL_DEBUG": 1, - "LOG_LEVEL_INFO": 2, - "LOG_LEVEL_WARN": 3, - "LOG_LEVEL_ERROR": 4, + "LOG_LEVEL_UNKNOWN": 0, + "LOG_LEVEL_TRACE": 1, + "LOG_LEVEL_DEBUG": 5, + "LOG_LEVEL_INFO": 9, + "LOG_LEVEL_WARN": 13, + "LOG_LEVEL_ERROR": 17, } ) @@ -183,6 +186,52 @@ func (LogLevel) EnumDescriptor() ([]byte, []int) { return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{2} } +type TimelineQuery_Order int32 + +const ( + TimelineQuery_ASC TimelineQuery_Order = 0 + TimelineQuery_DESC TimelineQuery_Order = 1 +) + +// Enum value maps for TimelineQuery_Order. +var ( + TimelineQuery_Order_name = map[int32]string{ + 0: "ASC", + 1: "DESC", + } + TimelineQuery_Order_value = map[string]int32{ + "ASC": 0, + "DESC": 1, + } +) + +func (x TimelineQuery_Order) Enum() *TimelineQuery_Order { + p := new(TimelineQuery_Order) + *p = x + return p +} + +func (x TimelineQuery_Order) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (TimelineQuery_Order) Descriptor() protoreflect.EnumDescriptor { + return file_xyz_block_ftl_v1_console_console_proto_enumTypes[3].Descriptor() +} + +func (TimelineQuery_Order) Type() protoreflect.EnumType { + return &file_xyz_block_ftl_v1_console_console_proto_enumTypes[3] +} + +func (x TimelineQuery_Order) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use TimelineQuery_Order.Descriptor instead. +func (TimelineQuery_Order) EnumDescriptor() ([]byte, []int) { + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{12, 0} +} + type Call struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -969,6 +1018,8 @@ type TimelineQuery struct { unknownFields protoimpl.UnknownFields Filters []*TimelineQuery_Filter `protobuf:"bytes,1,rep,name=filters,proto3" json:"filters,omitempty"` + Limit int32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` + Order TimelineQuery_Order `protobuf:"varint,3,opt,name=order,proto3,enum=xyz.block.ftl.v1.console.TimelineQuery_Order" json:"order,omitempty"` } func (x *TimelineQuery) Reset() { @@ -1010,6 +1061,20 @@ func (x *TimelineQuery) GetFilters() []*TimelineQuery_Filter { return nil } +func (x *TimelineQuery) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + +func (x *TimelineQuery) GetOrder() TimelineQuery_Order { + if x != nil { + return x.Order + } + return TimelineQuery_ASC +} + type StreamTimelineRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1241,18 +1306,18 @@ func (*TimelineEvent_Deployment) isTimelineEvent_Entry() {} func (*TimelineEvent_Log) isTimelineEvent_Entry() {} -type StreamLogsRequest struct { +type GetTimelineResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - UpdateInterval *durationpb.Duration `protobuf:"bytes,1,opt,name=update_interval,json=updateInterval,proto3,oneof" json:"update_interval,omitempty"` - AfterTime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=after_time,json=afterTime,proto3" json:"after_time,omitempty"` - DeploymentName string `protobuf:"bytes,3,opt,name=deployment_name,json=deploymentName,proto3" json:"deployment_name,omitempty"` + Events []*TimelineEvent `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` + // For pagination, this cursor is where we should start our next query + Cursor *int64 `protobuf:"varint,2,opt,name=cursor,proto3,oneof" json:"cursor,omitempty"` } -func (x *StreamLogsRequest) Reset() { - *x = StreamLogsRequest{} +func (x *GetTimelineResponse) Reset() { + *x = GetTimelineResponse{} if protoimpl.UnsafeEnabled { mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1260,13 +1325,13 @@ func (x *StreamLogsRequest) Reset() { } } -func (x *StreamLogsRequest) String() string { +func (x *GetTimelineResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*StreamLogsRequest) ProtoMessage() {} +func (*GetTimelineResponse) ProtoMessage() {} -func (x *StreamLogsRequest) ProtoReflect() protoreflect.Message { +func (x *GetTimelineResponse) ProtoReflect() protoreflect.Message { mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1278,99 +1343,36 @@ func (x *StreamLogsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use StreamLogsRequest.ProtoReflect.Descriptor instead. -func (*StreamLogsRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use GetTimelineResponse.ProtoReflect.Descriptor instead. +func (*GetTimelineResponse) Descriptor() ([]byte, []int) { return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{16} } -func (x *StreamLogsRequest) GetUpdateInterval() *durationpb.Duration { - if x != nil { - return x.UpdateInterval - } - return nil -} - -func (x *StreamLogsRequest) GetAfterTime() *timestamppb.Timestamp { +func (x *GetTimelineResponse) GetEvents() []*TimelineEvent { if x != nil { - return x.AfterTime + return x.Events } return nil } -func (x *StreamLogsRequest) GetDeploymentName() string { - if x != nil { - return x.DeploymentName +func (x *GetTimelineResponse) GetCursor() int64 { + if x != nil && x.Cursor != nil { + return *x.Cursor } - return "" + return 0 } -type StreamLogsResponse struct { +// Limit the number of events returned. +type TimelineQuery_LimitFilter struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Log *LogEntry `protobuf:"bytes,1,opt,name=log,proto3" json:"log,omitempty"` - // If true there are more logs immediately following this one as part of the initial batch. - // If false this is the last log in the initial batch, but others may follow later. - More bool `protobuf:"varint,2,opt,name=more,proto3" json:"more,omitempty"` + Limit int32 `protobuf:"varint,1,opt,name=limit,proto3" json:"limit,omitempty"` } -func (x *StreamLogsResponse) Reset() { - *x = StreamLogsResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *StreamLogsResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StreamLogsResponse) ProtoMessage() {} - -func (x *StreamLogsResponse) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[17] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StreamLogsResponse.ProtoReflect.Descriptor instead. -func (*StreamLogsResponse) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{17} -} - -func (x *StreamLogsResponse) GetLog() *LogEntry { - if x != nil { - return x.Log - } - return nil -} - -func (x *StreamLogsResponse) GetMore() bool { - if x != nil { - return x.More - } - return false -} - -type GetTimelineResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Events []*TimelineEvent `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` -} - -func (x *GetTimelineResponse) Reset() { - *x = GetTimelineResponse{} +func (x *TimelineQuery_LimitFilter) Reset() { + *x = TimelineQuery_LimitFilter{} if protoimpl.UnsafeEnabled { mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1378,13 +1380,13 @@ func (x *GetTimelineResponse) Reset() { } } -func (x *GetTimelineResponse) String() string { +func (x *TimelineQuery_LimitFilter) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetTimelineResponse) ProtoMessage() {} +func (*TimelineQuery_LimitFilter) ProtoMessage() {} -func (x *GetTimelineResponse) ProtoReflect() protoreflect.Message { +func (x *TimelineQuery_LimitFilter) ProtoReflect() protoreflect.Message { mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1396,16 +1398,16 @@ func (x *GetTimelineResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetTimelineResponse.ProtoReflect.Descriptor instead. -func (*GetTimelineResponse) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{18} +// Deprecated: Use TimelineQuery_LimitFilter.ProtoReflect.Descriptor instead. +func (*TimelineQuery_LimitFilter) Descriptor() ([]byte, []int) { + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{12, 0} } -func (x *GetTimelineResponse) GetEvents() []*TimelineEvent { +func (x *TimelineQuery_LimitFilter) GetLimit() int32 { if x != nil { - return x.Events + return x.Limit } - return nil + return 0 } // Filters events by log level. @@ -1420,7 +1422,7 @@ type TimelineQuery_LogLevelFilter struct { func (x *TimelineQuery_LogLevelFilter) Reset() { *x = TimelineQuery_LogLevelFilter{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[20] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1433,7 +1435,7 @@ func (x *TimelineQuery_LogLevelFilter) String() string { func (*TimelineQuery_LogLevelFilter) ProtoMessage() {} func (x *TimelineQuery_LogLevelFilter) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[20] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1446,14 +1448,14 @@ func (x *TimelineQuery_LogLevelFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use TimelineQuery_LogLevelFilter.ProtoReflect.Descriptor instead. func (*TimelineQuery_LogLevelFilter) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{12, 0} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{12, 1} } func (x *TimelineQuery_LogLevelFilter) GetLogLevel() LogLevel { if x != nil { return x.LogLevel } - return LogLevel_LOG_LEVEL_TRACE + return LogLevel_LOG_LEVEL_UNKNOWN } // Filters events by deployment name. @@ -1468,7 +1470,7 @@ type TimelineQuery_DeploymentFilter struct { func (x *TimelineQuery_DeploymentFilter) Reset() { *x = TimelineQuery_DeploymentFilter{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[21] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1481,7 +1483,7 @@ func (x *TimelineQuery_DeploymentFilter) String() string { func (*TimelineQuery_DeploymentFilter) ProtoMessage() {} func (x *TimelineQuery_DeploymentFilter) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[21] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1494,7 +1496,7 @@ func (x *TimelineQuery_DeploymentFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use TimelineQuery_DeploymentFilter.ProtoReflect.Descriptor instead. func (*TimelineQuery_DeploymentFilter) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{12, 1} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{12, 2} } func (x *TimelineQuery_DeploymentFilter) GetDeployments() []string { @@ -1516,7 +1518,7 @@ type TimelineQuery_RequestFilter struct { func (x *TimelineQuery_RequestFilter) Reset() { *x = TimelineQuery_RequestFilter{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[22] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1529,7 +1531,7 @@ func (x *TimelineQuery_RequestFilter) String() string { func (*TimelineQuery_RequestFilter) ProtoMessage() {} func (x *TimelineQuery_RequestFilter) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[22] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1542,7 +1544,7 @@ func (x *TimelineQuery_RequestFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use TimelineQuery_RequestFilter.ProtoReflect.Descriptor instead. func (*TimelineQuery_RequestFilter) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{12, 2} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{12, 3} } func (x *TimelineQuery_RequestFilter) GetRequests() []string { @@ -1564,7 +1566,7 @@ type TimelineQuery_EventTypeFilter struct { func (x *TimelineQuery_EventTypeFilter) Reset() { *x = TimelineQuery_EventTypeFilter{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[23] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1577,7 +1579,7 @@ func (x *TimelineQuery_EventTypeFilter) String() string { func (*TimelineQuery_EventTypeFilter) ProtoMessage() {} func (x *TimelineQuery_EventTypeFilter) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[23] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1590,7 +1592,7 @@ func (x *TimelineQuery_EventTypeFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use TimelineQuery_EventTypeFilter.ProtoReflect.Descriptor instead. func (*TimelineQuery_EventTypeFilter) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{12, 3} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{12, 4} } func (x *TimelineQuery_EventTypeFilter) GetEventTypes() []EventType { @@ -1615,7 +1617,7 @@ type TimelineQuery_TimeFilter struct { func (x *TimelineQuery_TimeFilter) Reset() { *x = TimelineQuery_TimeFilter{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[24] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1628,7 +1630,7 @@ func (x *TimelineQuery_TimeFilter) String() string { func (*TimelineQuery_TimeFilter) ProtoMessage() {} func (x *TimelineQuery_TimeFilter) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[24] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1641,7 +1643,7 @@ func (x *TimelineQuery_TimeFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use TimelineQuery_TimeFilter.ProtoReflect.Descriptor instead. func (*TimelineQuery_TimeFilter) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{12, 4} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{12, 5} } func (x *TimelineQuery_TimeFilter) GetOlderThan() *timestamppb.Timestamp { @@ -1673,7 +1675,7 @@ type TimelineQuery_IDFilter struct { func (x *TimelineQuery_IDFilter) Reset() { *x = TimelineQuery_IDFilter{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[25] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1686,7 +1688,7 @@ func (x *TimelineQuery_IDFilter) String() string { func (*TimelineQuery_IDFilter) ProtoMessage() {} func (x *TimelineQuery_IDFilter) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[25] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1699,7 +1701,7 @@ func (x *TimelineQuery_IDFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use TimelineQuery_IDFilter.ProtoReflect.Descriptor instead. func (*TimelineQuery_IDFilter) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{12, 5} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{12, 6} } func (x *TimelineQuery_IDFilter) GetLowerThan() int64 { @@ -1724,6 +1726,7 @@ type TimelineQuery_Filter struct { // These map 1:1 with filters in backend/controller/internal/dal/events.go // // Types that are assignable to Filter: + // *TimelineQuery_Filter_Limit // *TimelineQuery_Filter_LogLevel // *TimelineQuery_Filter_Deployments // *TimelineQuery_Filter_Requests @@ -1736,7 +1739,7 @@ type TimelineQuery_Filter struct { func (x *TimelineQuery_Filter) Reset() { *x = TimelineQuery_Filter{} if protoimpl.UnsafeEnabled { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[26] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1749,7 +1752,7 @@ func (x *TimelineQuery_Filter) String() string { func (*TimelineQuery_Filter) ProtoMessage() {} func (x *TimelineQuery_Filter) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[26] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1762,7 +1765,7 @@ func (x *TimelineQuery_Filter) ProtoReflect() protoreflect.Message { // Deprecated: Use TimelineQuery_Filter.ProtoReflect.Descriptor instead. func (*TimelineQuery_Filter) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{12, 6} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{12, 7} } func (m *TimelineQuery_Filter) GetFilter() isTimelineQuery_Filter_Filter { @@ -1772,6 +1775,13 @@ func (m *TimelineQuery_Filter) GetFilter() isTimelineQuery_Filter_Filter { return nil } +func (x *TimelineQuery_Filter) GetLimit() *TimelineQuery_LimitFilter { + if x, ok := x.GetFilter().(*TimelineQuery_Filter_Limit); ok { + return x.Limit + } + return nil +} + func (x *TimelineQuery_Filter) GetLogLevel() *TimelineQuery_LogLevelFilter { if x, ok := x.GetFilter().(*TimelineQuery_Filter_LogLevel); ok { return x.LogLevel @@ -1818,30 +1828,36 @@ type isTimelineQuery_Filter_Filter interface { isTimelineQuery_Filter_Filter() } +type TimelineQuery_Filter_Limit struct { + Limit *TimelineQuery_LimitFilter `protobuf:"bytes,1,opt,name=limit,proto3,oneof"` +} + type TimelineQuery_Filter_LogLevel struct { - LogLevel *TimelineQuery_LogLevelFilter `protobuf:"bytes,1,opt,name=log_level,json=logLevel,proto3,oneof"` + LogLevel *TimelineQuery_LogLevelFilter `protobuf:"bytes,2,opt,name=log_level,json=logLevel,proto3,oneof"` } type TimelineQuery_Filter_Deployments struct { - Deployments *TimelineQuery_DeploymentFilter `protobuf:"bytes,2,opt,name=deployments,proto3,oneof"` + Deployments *TimelineQuery_DeploymentFilter `protobuf:"bytes,3,opt,name=deployments,proto3,oneof"` } type TimelineQuery_Filter_Requests struct { - Requests *TimelineQuery_RequestFilter `protobuf:"bytes,3,opt,name=requests,proto3,oneof"` + Requests *TimelineQuery_RequestFilter `protobuf:"bytes,4,opt,name=requests,proto3,oneof"` } type TimelineQuery_Filter_EventTypes struct { - EventTypes *TimelineQuery_EventTypeFilter `protobuf:"bytes,4,opt,name=event_types,json=eventTypes,proto3,oneof"` + EventTypes *TimelineQuery_EventTypeFilter `protobuf:"bytes,5,opt,name=event_types,json=eventTypes,proto3,oneof"` } type TimelineQuery_Filter_Time struct { - Time *TimelineQuery_TimeFilter `protobuf:"bytes,5,opt,name=time,proto3,oneof"` + Time *TimelineQuery_TimeFilter `protobuf:"bytes,6,opt,name=time,proto3,oneof"` } type TimelineQuery_Filter_Id struct { - Id *TimelineQuery_IDFilter `protobuf:"bytes,6,opt,name=id,proto3,oneof"` + Id *TimelineQuery_IDFilter `protobuf:"bytes,7,opt,name=id,proto3,oneof"` } +func (*TimelineQuery_Filter_Limit) isTimelineQuery_Filter_Filter() {} + func (*TimelineQuery_Filter_LogLevel) isTimelineQuery_Filter_Filter() {} func (*TimelineQuery_Filter_Deployments) isTimelineQuery_Filter_Filter() {} @@ -1993,12 +2009,20 @@ var file_xyz_block_ftl_v1_console_console_proto_rawDesc = []byte{ 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x05, 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x22, - 0x93, 0x09, 0x0a, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x51, 0x75, 0x65, 0x72, + 0xfc, 0x0a, 0x0a, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x48, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x46, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x51, 0x0a, 0x0e, 0x4c, + 0x65, 0x72, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x12, 0x43, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x2d, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, + 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x6c, 0x69, 0x6e, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, + 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x1a, 0x23, 0x0a, 0x0b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x1a, 0x51, 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, @@ -2033,176 +2057,161 @@ var file_xyz_block_ftl_v1_console_console_proto_rawDesc = []byte{ 0x72, 0x5f, 0x74, 0x68, 0x61, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x0a, 0x68, 0x69, 0x67, 0x68, 0x65, 0x72, 0x54, 0x68, 0x61, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x74, 0x68, 0x61, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, - 0x5f, 0x68, 0x69, 0x67, 0x68, 0x65, 0x72, 0x5f, 0x74, 0x68, 0x61, 0x6e, 0x1a, 0x86, 0x04, 0x0a, - 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x55, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, - 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x78, 0x79, 0x7a, - 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x46, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x48, 0x00, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x5c, - 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, - 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x44, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, - 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x53, 0x0a, 0x08, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, - 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, - 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x6c, 0x69, - 0x6e, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x46, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x73, 0x12, 0x5a, 0x0a, 0x0b, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, + 0x5f, 0x68, 0x69, 0x67, 0x68, 0x65, 0x72, 0x5f, 0x74, 0x68, 0x61, 0x6e, 0x1a, 0xd3, 0x04, 0x0a, + 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x2e, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, - 0x00, 0x52, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x48, 0x0a, - 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x78, 0x79, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x05, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x12, 0x55, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, + 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, + 0x6c, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, + 0x00, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x5c, 0x0a, 0x0b, 0x64, + 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x38, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, + 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x6c, 0x69, 0x6e, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, + 0x6d, 0x65, 0x6e, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0b, 0x64, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x53, 0x0a, 0x08, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, - 0x00, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, + 0x75, 0x65, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x5a, + 0x0a, 0x0b, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x49, 0x44, 0x46, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, 0x42, 0x08, 0x0a, 0x06, 0x66, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0xd8, 0x01, 0x0a, 0x15, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x54, 0x69, 0x6d, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x47, 0x0a, 0x0f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, - 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0e, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x74, - 0x65, 0x72, 0x76, 0x61, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x0a, 0x61, 0x66, 0x74, 0x65, - 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x61, 0x66, 0x74, 0x65, 0x72, 0x54, - 0x69, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x12, 0x0a, 0x10, - 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, - 0x22, 0x6b, 0x0a, 0x16, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x69, 0x6d, 0x65, 0x6c, 0x69, - 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x05, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x78, 0x79, 0x7a, 0x2e, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x72, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x6d, 0x6f, 0x72, 0x65, 0x22, 0x99, 0x02, - 0x0a, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, - 0x39, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x34, 0x0a, 0x04, 0x63, 0x61, - 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, + 0x69, 0x6d, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0a, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x48, 0x0a, 0x04, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x6f, 0x6c, 0x65, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x48, 0x00, 0x52, 0x04, 0x63, 0x61, 0x6c, 0x6c, - 0x12, 0x46, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, - 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x64, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x36, 0x0a, 0x03, 0x6c, 0x6f, 0x67, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, - 0x2e, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x48, 0x00, 0x52, 0x03, 0x6c, 0x6f, 0x67, - 0x42, 0x07, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, 0xd4, 0x01, 0x0a, 0x11, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x47, 0x0a, 0x0f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, - 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0e, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x74, - 0x65, 0x72, 0x76, 0x61, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x0a, 0x61, 0x66, 0x74, 0x65, - 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6c, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x04, + 0x74, 0x69, 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, + 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x6c, 0x69, 0x6e, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x49, 0x44, 0x46, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, 0x42, 0x08, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x22, 0x1a, 0x0a, 0x05, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x07, 0x0a, 0x03, 0x41, + 0x53, 0x43, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x45, 0x53, 0x43, 0x10, 0x01, 0x22, 0xd8, + 0x01, 0x0a, 0x15, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x69, 0x6d, 0x65, 0x6c, 0x69, 0x6e, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x47, 0x0a, 0x0f, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0e, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x88, 0x01, + 0x01, 0x12, 0x39, 0x0a, 0x0a, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x09, 0x61, 0x66, 0x74, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, + 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0x6b, 0x0a, 0x16, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x54, 0x69, 0x6d, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, + 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x04, 0x6d, 0x6f, 0x72, 0x65, 0x22, 0x99, 0x02, 0x0a, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x6c, + 0x69, 0x6e, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, + 0x5f, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x61, 0x66, 0x74, 0x65, 0x72, 0x54, - 0x69, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x12, 0x0a, 0x10, - 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, - 0x22, 0x5e, 0x0a, 0x12, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x03, 0x6c, 0x6f, 0x67, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, - 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x4c, - 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x6c, 0x6f, 0x67, 0x12, 0x12, 0x0a, 0x04, - 0x6d, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x6d, 0x6f, 0x72, 0x65, - 0x22, 0x56, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, - 0x6c, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2a, 0x67, 0x0a, 0x09, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x19, 0x0a, - 0x15, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x50, 0x4c, - 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x56, 0x45, 0x4e, - 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x4c, 0x10, 0x02, 0x12, 0x12, 0x0a, - 0x0e, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x4f, 0x47, 0x10, - 0x03, 0x2a, 0x76, 0x0a, 0x13, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x45, 0x50, 0x4c, - 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, - 0x12, 0x16, 0x0a, 0x12, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x43, - 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x45, 0x50, 0x4c, - 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x02, - 0x12, 0x17, 0x0a, 0x13, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x52, - 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x44, 0x10, 0x03, 0x2a, 0x71, 0x0a, 0x08, 0x4c, 0x6f, 0x67, - 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, - 0x45, 0x4c, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, - 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x01, 0x12, - 0x12, 0x0a, 0x0e, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x49, 0x4e, 0x46, - 0x4f, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, - 0x5f, 0x57, 0x41, 0x52, 0x4e, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, - 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, 0x32, 0xe9, 0x05, 0x0a, - 0x0e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x4a, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x1d, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x67, 0x0a, 0x0a, 0x47, - 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x2b, 0x2e, 0x78, 0x79, 0x7a, 0x2e, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, + 0x61, 0x6d, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x34, 0x0a, 0x04, 0x63, 0x61, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, + 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x43, 0x61, 0x6c, + 0x6c, 0x48, 0x00, 0x52, 0x04, 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x46, 0x0a, 0x0a, 0x64, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x36, 0x0a, 0x03, 0x6c, 0x6f, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, + 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, + 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x48, 0x00, 0x52, 0x03, 0x6c, 0x6f, 0x67, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x22, 0x7e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6c, 0x69, 0x6e, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x65, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6c, 0x6c, 0x73, - 0x12, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, - 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x43, - 0x61, 0x6c, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x78, 0x79, + 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x63, 0x75, + 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x06, 0x63, 0x75, + 0x72, 0x73, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x63, 0x75, 0x72, 0x73, + 0x6f, 0x72, 0x2a, 0x67, 0x0a, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x16, 0x0a, 0x12, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, + 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x45, 0x56, 0x45, 0x4e, 0x54, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, + 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x43, 0x41, 0x4c, 0x4c, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x45, 0x56, 0x45, 0x4e, 0x54, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x4f, 0x47, 0x10, 0x03, 0x2a, 0x76, 0x0a, 0x13, 0x44, + 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, + 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x45, + 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, + 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, + 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x44, 0x45, + 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, + 0x44, 0x10, 0x03, 0x2a, 0x88, 0x01, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, + 0x12, 0x15, 0x0a, 0x11, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x55, 0x4e, + 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, + 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, + 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x44, 0x45, 0x42, 0x55, 0x47, 0x10, + 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x49, + 0x4e, 0x46, 0x4f, 0x10, 0x09, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, + 0x45, 0x4c, 0x5f, 0x57, 0x41, 0x52, 0x4e, 0x10, 0x0d, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, + 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x11, 0x32, 0xfe, + 0x04, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x4a, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x1d, 0x2e, 0x78, 0x79, 0x7a, 0x2e, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x69, 0x6e, + 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x69, 0x6e, 0x67, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x67, 0x0a, + 0x0a, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x2b, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6c, 0x6c, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x61, 0x6c, 0x6c, 0x73, 0x12, 0x30, 0x2e, 0x78, 0x79, 0x7a, - 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x43, 0x61, 0x6c, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x78, + 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x6f, 0x6c, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6c, + 0x6c, 0x73, 0x12, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, + 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x47, 0x65, + 0x74, 0x43, 0x61, 0x6c, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, + 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6c, 0x6c, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x0f, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x61, 0x6c, 0x6c, 0x73, 0x12, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x43, 0x61, 0x6c, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x75, 0x0a, 0x0e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x69, 0x6d, 0x65, 0x6c, 0x69, 0x6e, - 0x65, 0x12, 0x2f, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, - 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x54, 0x69, 0x6d, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, - 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x54, 0x69, 0x6d, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x65, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x54, 0x69, 0x6d, - 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x27, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x2d, + 0x73, 0x74, 0x43, 0x61, 0x6c, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, - 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x69, 0x6d, - 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x69, 0x0a, - 0x0a, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x2b, 0x2e, 0x78, 0x79, - 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4c, 0x6f, 0x67, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x6f, 0x6c, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x42, 0x48, 0x50, 0x01, 0x5a, 0x44, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x54, 0x42, 0x44, 0x35, 0x34, 0x35, 0x36, - 0x36, 0x39, 0x37, 0x35, 0x2f, 0x66, 0x74, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, - 0x78, 0x79, 0x7a, 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2f, 0x66, 0x74, 0x6c, 0x2f, 0x76, 0x31, - 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x3b, 0x70, 0x62, 0x63, 0x6f, 0x6e, 0x73, 0x6f, - 0x6c, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x43, 0x61, 0x6c, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x75, 0x0a, 0x0e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x69, 0x6d, 0x65, 0x6c, + 0x69, 0x6e, 0x65, 0x12, 0x2f, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, + 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x69, 0x6d, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, + 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x69, 0x6d, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x65, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x54, + 0x69, 0x6d, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x27, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, + 0x6c, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x1a, 0x2d, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, + 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x54, + 0x69, 0x6d, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, + 0x48, 0x50, 0x01, 0x5a, 0x44, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x54, 0x42, 0x44, 0x35, 0x34, 0x35, 0x36, 0x36, 0x39, 0x37, 0x35, 0x2f, 0x66, 0x74, 0x6c, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x78, 0x79, 0x7a, 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x2f, 0x66, 0x74, 0x6c, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x3b, + 0x70, 0x62, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( @@ -2217,32 +2226,32 @@ func file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP() []byte { return file_xyz_block_ftl_v1_console_console_proto_rawDescData } -var file_xyz_block_ftl_v1_console_console_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_xyz_block_ftl_v1_console_console_proto_msgTypes = make([]protoimpl.MessageInfo, 27) +var file_xyz_block_ftl_v1_console_console_proto_enumTypes = make([]protoimpl.EnumInfo, 4) +var file_xyz_block_ftl_v1_console_console_proto_msgTypes = make([]protoimpl.MessageInfo, 26) var file_xyz_block_ftl_v1_console_console_proto_goTypes = []interface{}{ (EventType)(0), // 0: xyz.block.ftl.v1.console.EventType (DeploymentEventType)(0), // 1: xyz.block.ftl.v1.console.DeploymentEventType (LogLevel)(0), // 2: xyz.block.ftl.v1.console.LogLevel - (*Call)(nil), // 3: xyz.block.ftl.v1.console.Call - (*Deployment)(nil), // 4: xyz.block.ftl.v1.console.Deployment - (*LogEntry)(nil), // 5: xyz.block.ftl.v1.console.LogEntry - (*Verb)(nil), // 6: xyz.block.ftl.v1.console.Verb - (*Data)(nil), // 7: xyz.block.ftl.v1.console.Data - (*Module)(nil), // 8: xyz.block.ftl.v1.console.Module - (*GetModulesRequest)(nil), // 9: xyz.block.ftl.v1.console.GetModulesRequest - (*GetModulesResponse)(nil), // 10: xyz.block.ftl.v1.console.GetModulesResponse - (*GetCallsRequest)(nil), // 11: xyz.block.ftl.v1.console.GetCallsRequest - (*GetCallsResponse)(nil), // 12: xyz.block.ftl.v1.console.GetCallsResponse - (*GetRequestCallsRequest)(nil), // 13: xyz.block.ftl.v1.console.GetRequestCallsRequest - (*GetRequestCallsResponse)(nil), // 14: xyz.block.ftl.v1.console.GetRequestCallsResponse - (*TimelineQuery)(nil), // 15: xyz.block.ftl.v1.console.TimelineQuery - (*StreamTimelineRequest)(nil), // 16: xyz.block.ftl.v1.console.StreamTimelineRequest - (*StreamTimelineResponse)(nil), // 17: xyz.block.ftl.v1.console.StreamTimelineResponse - (*TimelineEvent)(nil), // 18: xyz.block.ftl.v1.console.TimelineEvent - (*StreamLogsRequest)(nil), // 19: xyz.block.ftl.v1.console.StreamLogsRequest - (*StreamLogsResponse)(nil), // 20: xyz.block.ftl.v1.console.StreamLogsResponse - (*GetTimelineResponse)(nil), // 21: xyz.block.ftl.v1.console.GetTimelineResponse - nil, // 22: xyz.block.ftl.v1.console.LogEntry.AttributesEntry + (TimelineQuery_Order)(0), // 3: xyz.block.ftl.v1.console.TimelineQuery.Order + (*Call)(nil), // 4: xyz.block.ftl.v1.console.Call + (*Deployment)(nil), // 5: xyz.block.ftl.v1.console.Deployment + (*LogEntry)(nil), // 6: xyz.block.ftl.v1.console.LogEntry + (*Verb)(nil), // 7: xyz.block.ftl.v1.console.Verb + (*Data)(nil), // 8: xyz.block.ftl.v1.console.Data + (*Module)(nil), // 9: xyz.block.ftl.v1.console.Module + (*GetModulesRequest)(nil), // 10: xyz.block.ftl.v1.console.GetModulesRequest + (*GetModulesResponse)(nil), // 11: xyz.block.ftl.v1.console.GetModulesResponse + (*GetCallsRequest)(nil), // 12: xyz.block.ftl.v1.console.GetCallsRequest + (*GetCallsResponse)(nil), // 13: xyz.block.ftl.v1.console.GetCallsResponse + (*GetRequestCallsRequest)(nil), // 14: xyz.block.ftl.v1.console.GetRequestCallsRequest + (*GetRequestCallsResponse)(nil), // 15: xyz.block.ftl.v1.console.GetRequestCallsResponse + (*TimelineQuery)(nil), // 16: xyz.block.ftl.v1.console.TimelineQuery + (*StreamTimelineRequest)(nil), // 17: xyz.block.ftl.v1.console.StreamTimelineRequest + (*StreamTimelineResponse)(nil), // 18: xyz.block.ftl.v1.console.StreamTimelineResponse + (*TimelineEvent)(nil), // 19: xyz.block.ftl.v1.console.TimelineEvent + (*GetTimelineResponse)(nil), // 20: xyz.block.ftl.v1.console.GetTimelineResponse + nil, // 21: xyz.block.ftl.v1.console.LogEntry.AttributesEntry + (*TimelineQuery_LimitFilter)(nil), // 22: xyz.block.ftl.v1.console.TimelineQuery.LimitFilter (*TimelineQuery_LogLevelFilter)(nil), // 23: xyz.block.ftl.v1.console.TimelineQuery.LogLevelFilter (*TimelineQuery_DeploymentFilter)(nil), // 24: xyz.block.ftl.v1.console.TimelineQuery.DeploymentFilter (*TimelineQuery_RequestFilter)(nil), // 25: xyz.block.ftl.v1.console.TimelineQuery.RequestFilter @@ -2265,55 +2274,52 @@ var file_xyz_block_ftl_v1_console_console_proto_depIdxs = []int32{ 32, // 3: xyz.block.ftl.v1.console.Call.duration:type_name -> google.protobuf.Duration 1, // 4: xyz.block.ftl.v1.console.Deployment.event_type:type_name -> xyz.block.ftl.v1.console.DeploymentEventType 30, // 5: xyz.block.ftl.v1.console.LogEntry.time_stamp:type_name -> google.protobuf.Timestamp - 22, // 6: xyz.block.ftl.v1.console.LogEntry.attributes:type_name -> xyz.block.ftl.v1.console.LogEntry.AttributesEntry + 21, // 6: xyz.block.ftl.v1.console.LogEntry.attributes:type_name -> xyz.block.ftl.v1.console.LogEntry.AttributesEntry 33, // 7: xyz.block.ftl.v1.console.Verb.verb:type_name -> xyz.block.ftl.v1.schema.Verb 34, // 8: xyz.block.ftl.v1.console.Data.data:type_name -> xyz.block.ftl.v1.schema.Data - 6, // 9: xyz.block.ftl.v1.console.Module.verbs:type_name -> xyz.block.ftl.v1.console.Verb - 7, // 10: xyz.block.ftl.v1.console.Module.data:type_name -> xyz.block.ftl.v1.console.Data - 8, // 11: xyz.block.ftl.v1.console.GetModulesResponse.modules:type_name -> xyz.block.ftl.v1.console.Module - 3, // 12: xyz.block.ftl.v1.console.GetCallsResponse.calls:type_name -> xyz.block.ftl.v1.console.Call - 3, // 13: xyz.block.ftl.v1.console.GetRequestCallsResponse.calls:type_name -> xyz.block.ftl.v1.console.Call + 7, // 9: xyz.block.ftl.v1.console.Module.verbs:type_name -> xyz.block.ftl.v1.console.Verb + 8, // 10: xyz.block.ftl.v1.console.Module.data:type_name -> xyz.block.ftl.v1.console.Data + 9, // 11: xyz.block.ftl.v1.console.GetModulesResponse.modules:type_name -> xyz.block.ftl.v1.console.Module + 4, // 12: xyz.block.ftl.v1.console.GetCallsResponse.calls:type_name -> xyz.block.ftl.v1.console.Call + 4, // 13: xyz.block.ftl.v1.console.GetRequestCallsResponse.calls:type_name -> xyz.block.ftl.v1.console.Call 29, // 14: xyz.block.ftl.v1.console.TimelineQuery.filters:type_name -> xyz.block.ftl.v1.console.TimelineQuery.Filter - 32, // 15: xyz.block.ftl.v1.console.StreamTimelineRequest.update_interval:type_name -> google.protobuf.Duration - 30, // 16: xyz.block.ftl.v1.console.StreamTimelineRequest.after_time:type_name -> google.protobuf.Timestamp - 18, // 17: xyz.block.ftl.v1.console.StreamTimelineResponse.event:type_name -> xyz.block.ftl.v1.console.TimelineEvent - 30, // 18: xyz.block.ftl.v1.console.TimelineEvent.time_stamp:type_name -> google.protobuf.Timestamp - 3, // 19: xyz.block.ftl.v1.console.TimelineEvent.call:type_name -> xyz.block.ftl.v1.console.Call - 4, // 20: xyz.block.ftl.v1.console.TimelineEvent.deployment:type_name -> xyz.block.ftl.v1.console.Deployment - 5, // 21: xyz.block.ftl.v1.console.TimelineEvent.log:type_name -> xyz.block.ftl.v1.console.LogEntry - 32, // 22: xyz.block.ftl.v1.console.StreamLogsRequest.update_interval:type_name -> google.protobuf.Duration - 30, // 23: xyz.block.ftl.v1.console.StreamLogsRequest.after_time:type_name -> google.protobuf.Timestamp - 5, // 24: xyz.block.ftl.v1.console.StreamLogsResponse.log:type_name -> xyz.block.ftl.v1.console.LogEntry - 18, // 25: xyz.block.ftl.v1.console.GetTimelineResponse.events:type_name -> xyz.block.ftl.v1.console.TimelineEvent - 2, // 26: xyz.block.ftl.v1.console.TimelineQuery.LogLevelFilter.log_level:type_name -> xyz.block.ftl.v1.console.LogLevel - 0, // 27: xyz.block.ftl.v1.console.TimelineQuery.EventTypeFilter.event_types:type_name -> xyz.block.ftl.v1.console.EventType - 30, // 28: xyz.block.ftl.v1.console.TimelineQuery.TimeFilter.older_than:type_name -> google.protobuf.Timestamp - 30, // 29: xyz.block.ftl.v1.console.TimelineQuery.TimeFilter.newer_than:type_name -> google.protobuf.Timestamp - 23, // 30: xyz.block.ftl.v1.console.TimelineQuery.Filter.log_level:type_name -> xyz.block.ftl.v1.console.TimelineQuery.LogLevelFilter - 24, // 31: xyz.block.ftl.v1.console.TimelineQuery.Filter.deployments:type_name -> xyz.block.ftl.v1.console.TimelineQuery.DeploymentFilter - 25, // 32: xyz.block.ftl.v1.console.TimelineQuery.Filter.requests:type_name -> xyz.block.ftl.v1.console.TimelineQuery.RequestFilter - 26, // 33: xyz.block.ftl.v1.console.TimelineQuery.Filter.event_types:type_name -> xyz.block.ftl.v1.console.TimelineQuery.EventTypeFilter - 27, // 34: xyz.block.ftl.v1.console.TimelineQuery.Filter.time:type_name -> xyz.block.ftl.v1.console.TimelineQuery.TimeFilter - 28, // 35: xyz.block.ftl.v1.console.TimelineQuery.Filter.id:type_name -> xyz.block.ftl.v1.console.TimelineQuery.IDFilter - 35, // 36: xyz.block.ftl.v1.console.ConsoleService.Ping:input_type -> xyz.block.ftl.v1.PingRequest - 9, // 37: xyz.block.ftl.v1.console.ConsoleService.GetModules:input_type -> xyz.block.ftl.v1.console.GetModulesRequest - 11, // 38: xyz.block.ftl.v1.console.ConsoleService.GetCalls:input_type -> xyz.block.ftl.v1.console.GetCallsRequest - 13, // 39: xyz.block.ftl.v1.console.ConsoleService.GetRequestCalls:input_type -> xyz.block.ftl.v1.console.GetRequestCallsRequest - 16, // 40: xyz.block.ftl.v1.console.ConsoleService.StreamTimeline:input_type -> xyz.block.ftl.v1.console.StreamTimelineRequest - 15, // 41: xyz.block.ftl.v1.console.ConsoleService.GetTimeline:input_type -> xyz.block.ftl.v1.console.TimelineQuery - 19, // 42: xyz.block.ftl.v1.console.ConsoleService.StreamLogs:input_type -> xyz.block.ftl.v1.console.StreamLogsRequest - 36, // 43: xyz.block.ftl.v1.console.ConsoleService.Ping:output_type -> xyz.block.ftl.v1.PingResponse - 10, // 44: xyz.block.ftl.v1.console.ConsoleService.GetModules:output_type -> xyz.block.ftl.v1.console.GetModulesResponse - 12, // 45: xyz.block.ftl.v1.console.ConsoleService.GetCalls:output_type -> xyz.block.ftl.v1.console.GetCallsResponse - 14, // 46: xyz.block.ftl.v1.console.ConsoleService.GetRequestCalls:output_type -> xyz.block.ftl.v1.console.GetRequestCallsResponse - 17, // 47: xyz.block.ftl.v1.console.ConsoleService.StreamTimeline:output_type -> xyz.block.ftl.v1.console.StreamTimelineResponse - 21, // 48: xyz.block.ftl.v1.console.ConsoleService.GetTimeline:output_type -> xyz.block.ftl.v1.console.GetTimelineResponse - 20, // 49: xyz.block.ftl.v1.console.ConsoleService.StreamLogs:output_type -> xyz.block.ftl.v1.console.StreamLogsResponse - 43, // [43:50] is the sub-list for method output_type - 36, // [36:43] is the sub-list for method input_type - 36, // [36:36] is the sub-list for extension type_name - 36, // [36:36] is the sub-list for extension extendee - 0, // [0:36] is the sub-list for field type_name + 3, // 15: xyz.block.ftl.v1.console.TimelineQuery.order:type_name -> xyz.block.ftl.v1.console.TimelineQuery.Order + 32, // 16: xyz.block.ftl.v1.console.StreamTimelineRequest.update_interval:type_name -> google.protobuf.Duration + 30, // 17: xyz.block.ftl.v1.console.StreamTimelineRequest.after_time:type_name -> google.protobuf.Timestamp + 19, // 18: xyz.block.ftl.v1.console.StreamTimelineResponse.event:type_name -> xyz.block.ftl.v1.console.TimelineEvent + 30, // 19: xyz.block.ftl.v1.console.TimelineEvent.time_stamp:type_name -> google.protobuf.Timestamp + 4, // 20: xyz.block.ftl.v1.console.TimelineEvent.call:type_name -> xyz.block.ftl.v1.console.Call + 5, // 21: xyz.block.ftl.v1.console.TimelineEvent.deployment:type_name -> xyz.block.ftl.v1.console.Deployment + 6, // 22: xyz.block.ftl.v1.console.TimelineEvent.log:type_name -> xyz.block.ftl.v1.console.LogEntry + 19, // 23: xyz.block.ftl.v1.console.GetTimelineResponse.events:type_name -> xyz.block.ftl.v1.console.TimelineEvent + 2, // 24: xyz.block.ftl.v1.console.TimelineQuery.LogLevelFilter.log_level:type_name -> xyz.block.ftl.v1.console.LogLevel + 0, // 25: xyz.block.ftl.v1.console.TimelineQuery.EventTypeFilter.event_types:type_name -> xyz.block.ftl.v1.console.EventType + 30, // 26: xyz.block.ftl.v1.console.TimelineQuery.TimeFilter.older_than:type_name -> google.protobuf.Timestamp + 30, // 27: xyz.block.ftl.v1.console.TimelineQuery.TimeFilter.newer_than:type_name -> google.protobuf.Timestamp + 22, // 28: xyz.block.ftl.v1.console.TimelineQuery.Filter.limit:type_name -> xyz.block.ftl.v1.console.TimelineQuery.LimitFilter + 23, // 29: xyz.block.ftl.v1.console.TimelineQuery.Filter.log_level:type_name -> xyz.block.ftl.v1.console.TimelineQuery.LogLevelFilter + 24, // 30: xyz.block.ftl.v1.console.TimelineQuery.Filter.deployments:type_name -> xyz.block.ftl.v1.console.TimelineQuery.DeploymentFilter + 25, // 31: xyz.block.ftl.v1.console.TimelineQuery.Filter.requests:type_name -> xyz.block.ftl.v1.console.TimelineQuery.RequestFilter + 26, // 32: xyz.block.ftl.v1.console.TimelineQuery.Filter.event_types:type_name -> xyz.block.ftl.v1.console.TimelineQuery.EventTypeFilter + 27, // 33: xyz.block.ftl.v1.console.TimelineQuery.Filter.time:type_name -> xyz.block.ftl.v1.console.TimelineQuery.TimeFilter + 28, // 34: xyz.block.ftl.v1.console.TimelineQuery.Filter.id:type_name -> xyz.block.ftl.v1.console.TimelineQuery.IDFilter + 35, // 35: xyz.block.ftl.v1.console.ConsoleService.Ping:input_type -> xyz.block.ftl.v1.PingRequest + 10, // 36: xyz.block.ftl.v1.console.ConsoleService.GetModules:input_type -> xyz.block.ftl.v1.console.GetModulesRequest + 12, // 37: xyz.block.ftl.v1.console.ConsoleService.GetCalls:input_type -> xyz.block.ftl.v1.console.GetCallsRequest + 14, // 38: xyz.block.ftl.v1.console.ConsoleService.GetRequestCalls:input_type -> xyz.block.ftl.v1.console.GetRequestCallsRequest + 17, // 39: xyz.block.ftl.v1.console.ConsoleService.StreamTimeline:input_type -> xyz.block.ftl.v1.console.StreamTimelineRequest + 16, // 40: xyz.block.ftl.v1.console.ConsoleService.GetTimeline:input_type -> xyz.block.ftl.v1.console.TimelineQuery + 36, // 41: xyz.block.ftl.v1.console.ConsoleService.Ping:output_type -> xyz.block.ftl.v1.PingResponse + 11, // 42: xyz.block.ftl.v1.console.ConsoleService.GetModules:output_type -> xyz.block.ftl.v1.console.GetModulesResponse + 13, // 43: xyz.block.ftl.v1.console.ConsoleService.GetCalls:output_type -> xyz.block.ftl.v1.console.GetCallsResponse + 15, // 44: xyz.block.ftl.v1.console.ConsoleService.GetRequestCalls:output_type -> xyz.block.ftl.v1.console.GetRequestCallsResponse + 18, // 45: xyz.block.ftl.v1.console.ConsoleService.StreamTimeline:output_type -> xyz.block.ftl.v1.console.StreamTimelineResponse + 20, // 46: xyz.block.ftl.v1.console.ConsoleService.GetTimeline:output_type -> xyz.block.ftl.v1.console.GetTimelineResponse + 41, // [41:47] is the sub-list for method output_type + 35, // [35:41] is the sub-list for method input_type + 35, // [35:35] is the sub-list for extension type_name + 35, // [35:35] is the sub-list for extension extendee + 0, // [0:35] is the sub-list for field type_name } func init() { file_xyz_block_ftl_v1_console_console_proto_init() } @@ -2515,19 +2521,7 @@ func file_xyz_block_ftl_v1_console_console_proto_init() { } } file_xyz_block_ftl_v1_console_console_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StreamLogsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_xyz_block_ftl_v1_console_console_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StreamLogsResponse); i { + switch v := v.(*GetTimelineResponse); i { case 0: return &v.state case 1: @@ -2539,7 +2533,7 @@ func file_xyz_block_ftl_v1_console_console_proto_init() { } } file_xyz_block_ftl_v1_console_console_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTimelineResponse); i { + switch v := v.(*TimelineQuery_LimitFilter); i { case 0: return &v.state case 1: @@ -2550,7 +2544,7 @@ func file_xyz_block_ftl_v1_console_console_proto_init() { return nil } } - file_xyz_block_ftl_v1_console_console_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + file_xyz_block_ftl_v1_console_console_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TimelineQuery_LogLevelFilter); i { case 0: return &v.state @@ -2562,7 +2556,7 @@ func file_xyz_block_ftl_v1_console_console_proto_init() { return nil } } - file_xyz_block_ftl_v1_console_console_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + file_xyz_block_ftl_v1_console_console_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TimelineQuery_DeploymentFilter); i { case 0: return &v.state @@ -2574,7 +2568,7 @@ func file_xyz_block_ftl_v1_console_console_proto_init() { return nil } } - file_xyz_block_ftl_v1_console_console_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + file_xyz_block_ftl_v1_console_console_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TimelineQuery_RequestFilter); i { case 0: return &v.state @@ -2586,7 +2580,7 @@ func file_xyz_block_ftl_v1_console_console_proto_init() { return nil } } - file_xyz_block_ftl_v1_console_console_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + file_xyz_block_ftl_v1_console_console_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TimelineQuery_EventTypeFilter); i { case 0: return &v.state @@ -2598,7 +2592,7 @@ func file_xyz_block_ftl_v1_console_console_proto_init() { return nil } } - file_xyz_block_ftl_v1_console_console_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + file_xyz_block_ftl_v1_console_console_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TimelineQuery_TimeFilter); i { case 0: return &v.state @@ -2610,7 +2604,7 @@ func file_xyz_block_ftl_v1_console_console_proto_init() { return nil } } - file_xyz_block_ftl_v1_console_console_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + file_xyz_block_ftl_v1_console_console_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TimelineQuery_IDFilter); i { case 0: return &v.state @@ -2622,7 +2616,7 @@ func file_xyz_block_ftl_v1_console_console_proto_init() { return nil } } - file_xyz_block_ftl_v1_console_console_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + file_xyz_block_ftl_v1_console_console_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TimelineQuery_Filter); i { case 0: return &v.state @@ -2645,9 +2639,10 @@ func file_xyz_block_ftl_v1_console_console_proto_init() { (*TimelineEvent_Log)(nil), } file_xyz_block_ftl_v1_console_console_proto_msgTypes[16].OneofWrappers = []interface{}{} + file_xyz_block_ftl_v1_console_console_proto_msgTypes[23].OneofWrappers = []interface{}{} file_xyz_block_ftl_v1_console_console_proto_msgTypes[24].OneofWrappers = []interface{}{} - file_xyz_block_ftl_v1_console_console_proto_msgTypes[25].OneofWrappers = []interface{}{} - file_xyz_block_ftl_v1_console_console_proto_msgTypes[26].OneofWrappers = []interface{}{ + file_xyz_block_ftl_v1_console_console_proto_msgTypes[25].OneofWrappers = []interface{}{ + (*TimelineQuery_Filter_Limit)(nil), (*TimelineQuery_Filter_LogLevel)(nil), (*TimelineQuery_Filter_Deployments)(nil), (*TimelineQuery_Filter_Requests)(nil), @@ -2660,8 +2655,8 @@ func file_xyz_block_ftl_v1_console_console_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_xyz_block_ftl_v1_console_console_proto_rawDesc, - NumEnums: 3, - NumMessages: 27, + NumEnums: 4, + NumMessages: 26, NumExtensions: 0, NumServices: 1, }, diff --git a/protos/xyz/block/ftl/v1/console/console.proto b/protos/xyz/block/ftl/v1/console/console.proto index ccc70dd639..1917784330 100644 --- a/protos/xyz/block/ftl/v1/console/console.proto +++ b/protos/xyz/block/ftl/v1/console/console.proto @@ -98,15 +98,20 @@ message GetRequestCallsResponse { } enum LogLevel { - LOG_LEVEL_TRACE = 0; - LOG_LEVEL_DEBUG = 1; - LOG_LEVEL_INFO = 2; - LOG_LEVEL_WARN = 3; - LOG_LEVEL_ERROR = 4; + LOG_LEVEL_UNKNOWN = 0; + LOG_LEVEL_TRACE = 1; + LOG_LEVEL_DEBUG = 5; + LOG_LEVEL_INFO = 9; + LOG_LEVEL_WARN = 13; + LOG_LEVEL_ERROR = 17; } // Query for timeline events. message TimelineQuery { + // Limit the number of events returned. + message LimitFilter { + int32 limit = 1; + } // Filters events by log level. message LogLevelFilter { LogLevel log_level = 1; @@ -138,19 +143,27 @@ message TimelineQuery { optional int64 higher_than = 2; } + enum Order { + ASC = 0; + DESC = 1; + } + message Filter { // These map 1:1 with filters in backend/controller/internal/dal/events.go oneof filter { - LogLevelFilter log_level = 1; - DeploymentFilter deployments = 2; - RequestFilter requests = 3; - EventTypeFilter event_types = 4; - TimeFilter time = 5; - IDFilter id = 6; + LimitFilter limit = 1; + LogLevelFilter log_level = 2; + DeploymentFilter deployments = 3; + RequestFilter requests = 4; + EventTypeFilter event_types = 5; + TimeFilter time = 6; + IDFilter id = 7; } } repeated Filter filters = 1; + int32 limit = 2; + Order order = 3; } message StreamTimelineRequest { @@ -178,22 +191,11 @@ message TimelineEvent { } } -message StreamLogsRequest { - optional google.protobuf.Duration update_interval = 1; - google.protobuf.Timestamp after_time = 2; - string deployment_name = 3; -} - -message StreamLogsResponse { - LogEntry log = 1; - - // If true there are more logs immediately following this one as part of the initial batch. - // If false this is the last log in the initial batch, but others may follow later. - bool more = 2; -} - message GetTimelineResponse { repeated TimelineEvent events = 1; + + // For pagination, this cursor is where we should start our next query + optional int64 cursor = 2; } service ConsoleService { @@ -207,5 +209,4 @@ service ConsoleService { rpc GetRequestCalls(GetRequestCallsRequest) returns (GetRequestCallsResponse); rpc StreamTimeline(StreamTimelineRequest) returns (stream StreamTimelineResponse); rpc GetTimeline(TimelineQuery) returns (GetTimelineResponse); - rpc StreamLogs(StreamLogsRequest) returns (stream StreamLogsResponse); } diff --git a/protos/xyz/block/ftl/v1/console/pbconsoleconnect/console.connect.go b/protos/xyz/block/ftl/v1/console/pbconsoleconnect/console.connect.go index fb258f0829..770df0fb26 100644 --- a/protos/xyz/block/ftl/v1/console/pbconsoleconnect/console.connect.go +++ b/protos/xyz/block/ftl/v1/console/pbconsoleconnect/console.connect.go @@ -50,9 +50,6 @@ const ( // ConsoleServiceGetTimelineProcedure is the fully-qualified name of the ConsoleService's // GetTimeline RPC. ConsoleServiceGetTimelineProcedure = "/xyz.block.ftl.v1.console.ConsoleService/GetTimeline" - // ConsoleServiceStreamLogsProcedure is the fully-qualified name of the ConsoleService's StreamLogs - // RPC. - ConsoleServiceStreamLogsProcedure = "/xyz.block.ftl.v1.console.ConsoleService/StreamLogs" ) // ConsoleServiceClient is a client for the xyz.block.ftl.v1.console.ConsoleService service. @@ -64,7 +61,6 @@ type ConsoleServiceClient interface { GetRequestCalls(context.Context, *connect_go.Request[console.GetRequestCallsRequest]) (*connect_go.Response[console.GetRequestCallsResponse], error) StreamTimeline(context.Context, *connect_go.Request[console.StreamTimelineRequest]) (*connect_go.ServerStreamForClient[console.StreamTimelineResponse], error) GetTimeline(context.Context, *connect_go.Request[console.TimelineQuery]) (*connect_go.Response[console.GetTimelineResponse], error) - StreamLogs(context.Context, *connect_go.Request[console.StreamLogsRequest]) (*connect_go.ServerStreamForClient[console.StreamLogsResponse], error) } // NewConsoleServiceClient constructs a client for the xyz.block.ftl.v1.console.ConsoleService @@ -108,11 +104,6 @@ func NewConsoleServiceClient(httpClient connect_go.HTTPClient, baseURL string, o baseURL+ConsoleServiceGetTimelineProcedure, opts..., ), - streamLogs: connect_go.NewClient[console.StreamLogsRequest, console.StreamLogsResponse]( - httpClient, - baseURL+ConsoleServiceStreamLogsProcedure, - opts..., - ), } } @@ -124,7 +115,6 @@ type consoleServiceClient struct { getRequestCalls *connect_go.Client[console.GetRequestCallsRequest, console.GetRequestCallsResponse] streamTimeline *connect_go.Client[console.StreamTimelineRequest, console.StreamTimelineResponse] getTimeline *connect_go.Client[console.TimelineQuery, console.GetTimelineResponse] - streamLogs *connect_go.Client[console.StreamLogsRequest, console.StreamLogsResponse] } // Ping calls xyz.block.ftl.v1.console.ConsoleService.Ping. @@ -157,11 +147,6 @@ func (c *consoleServiceClient) GetTimeline(ctx context.Context, req *connect_go. return c.getTimeline.CallUnary(ctx, req) } -// StreamLogs calls xyz.block.ftl.v1.console.ConsoleService.StreamLogs. -func (c *consoleServiceClient) StreamLogs(ctx context.Context, req *connect_go.Request[console.StreamLogsRequest]) (*connect_go.ServerStreamForClient[console.StreamLogsResponse], error) { - return c.streamLogs.CallServerStream(ctx, req) -} - // ConsoleServiceHandler is an implementation of the xyz.block.ftl.v1.console.ConsoleService // service. type ConsoleServiceHandler interface { @@ -172,7 +157,6 @@ type ConsoleServiceHandler interface { GetRequestCalls(context.Context, *connect_go.Request[console.GetRequestCallsRequest]) (*connect_go.Response[console.GetRequestCallsResponse], error) StreamTimeline(context.Context, *connect_go.Request[console.StreamTimelineRequest], *connect_go.ServerStream[console.StreamTimelineResponse]) error GetTimeline(context.Context, *connect_go.Request[console.TimelineQuery]) (*connect_go.Response[console.GetTimelineResponse], error) - StreamLogs(context.Context, *connect_go.Request[console.StreamLogsRequest], *connect_go.ServerStream[console.StreamLogsResponse]) error } // NewConsoleServiceHandler builds an HTTP handler from the service implementation. It returns the @@ -213,11 +197,6 @@ func NewConsoleServiceHandler(svc ConsoleServiceHandler, opts ...connect_go.Hand svc.GetTimeline, opts..., )) - mux.Handle(ConsoleServiceStreamLogsProcedure, connect_go.NewServerStreamHandler( - ConsoleServiceStreamLogsProcedure, - svc.StreamLogs, - opts..., - )) return "/xyz.block.ftl.v1.console.ConsoleService/", mux } @@ -247,7 +226,3 @@ func (UnimplementedConsoleServiceHandler) StreamTimeline(context.Context, *conne func (UnimplementedConsoleServiceHandler) GetTimeline(context.Context, *connect_go.Request[console.TimelineQuery]) (*connect_go.Response[console.GetTimelineResponse], error) { return nil, connect_go.NewError(connect_go.CodeUnimplemented, errors.New("xyz.block.ftl.v1.console.ConsoleService.GetTimeline is not implemented")) } - -func (UnimplementedConsoleServiceHandler) StreamLogs(context.Context, *connect_go.Request[console.StreamLogsRequest], *connect_go.ServerStream[console.StreamLogsResponse]) error { - return connect_go.NewError(connect_go.CodeUnimplemented, errors.New("xyz.block.ftl.v1.console.ConsoleService.StreamLogs is not implemented")) -}