diff --git a/coderd/database/dbgen/dbgen.go b/coderd/database/dbgen/dbgen.go index c325a9f484df1..e80778ee0953a 100644 --- a/coderd/database/dbgen/dbgen.go +++ b/coderd/database/dbgen/dbgen.go @@ -1615,6 +1615,7 @@ func provisionerJobTiming(t testing.TB, db database.Store, seed database.Provisi StartedAt: []time.Time{takeFirst(seed.StartedAt, dbtime.Now())}, EndedAt: []time.Time{takeFirst(seed.EndedAt, dbtime.Now())}, Stage: []database.ProvisionerJobTimingStage{takeFirst(seed.Stage, database.ProvisionerJobTimingStageInit)}, + StageSeq: []int32{seed.StageSeq}, Source: []string{takeFirst(seed.Source, "source")}, Action: []string{takeFirst(seed.Action, "action")}, Resource: []string{takeFirst(seed.Resource, "resource")}, diff --git a/coderd/database/dump.sql b/coderd/database/dump.sql index e7b46c2f3445c..11ec9ebfad726 100644 --- a/coderd/database/dump.sql +++ b/coderd/database/dump.sql @@ -1688,9 +1688,12 @@ CREATE TABLE provisioner_job_timings ( stage provisioner_job_timing_stage NOT NULL, source text NOT NULL, action text NOT NULL, - resource text NOT NULL + resource text NOT NULL, + stage_seq integer DEFAULT 0 NOT NULL ); +COMMENT ON COLUMN provisioner_job_timings.stage_seq IS 'Distinguish repeated runs of the same stage within a single build job.'; + CREATE TABLE provisioner_jobs ( id uuid NOT NULL, created_at timestamp with time zone NOT NULL, diff --git a/coderd/database/migrations/000399_build_timing_stage_seq.down.sql b/coderd/database/migrations/000399_build_timing_stage_seq.down.sql new file mode 100644 index 0000000000000..814f2974fb5fc --- /dev/null +++ b/coderd/database/migrations/000399_build_timing_stage_seq.down.sql @@ -0,0 +1,3 @@ +ALTER TABLE ONLY + provisioner_job_timings + DROP COLUMN IF EXISTS stage_seq; diff --git a/coderd/database/migrations/000399_build_timing_stage_seq.up.sql b/coderd/database/migrations/000399_build_timing_stage_seq.up.sql new file mode 100644 index 0000000000000..1523941b557e8 --- /dev/null +++ b/coderd/database/migrations/000399_build_timing_stage_seq.up.sql @@ -0,0 +1,7 @@ +ALTER TABLE ONLY + provisioner_job_timings + ADD COLUMN stage_seq integer NOT NULL DEFAULT 0; + +COMMENT ON COLUMN + provisioner_job_timings.stage_seq IS + 'Distinguish repeated runs of the same stage within a single build job.'; diff --git a/coderd/database/models.go b/coderd/database/models.go index af901c31ccad5..fbd369f1121f5 100644 --- a/coderd/database/models.go +++ b/coderd/database/models.go @@ -4134,6 +4134,8 @@ type ProvisionerJobTiming struct { Source string `db:"source" json:"source"` Action string `db:"action" json:"action"` Resource string `db:"resource" json:"resource"` + // Distinguish repeated runs of the same stage within a single build job. + StageSeq int32 `db:"stage_seq" json:"stage_seq"` } type ProvisionerKey struct { diff --git a/coderd/database/queries.sql.go b/coderd/database/queries.sql.go index 21cb7b1874b5e..7614418d58d77 100644 --- a/coderd/database/queries.sql.go +++ b/coderd/database/queries.sql.go @@ -10062,7 +10062,7 @@ func (q *sqlQuerier) GetProvisionerJobByIDWithLock(ctx context.Context, id uuid. } const getProvisionerJobTimingsByJobID = `-- name: GetProvisionerJobTimingsByJobID :many -SELECT job_id, started_at, ended_at, stage, source, action, resource FROM provisioner_job_timings +SELECT job_id, started_at, ended_at, stage, source, action, resource, stage_seq FROM provisioner_job_timings WHERE job_id = $1 ORDER BY started_at ASC ` @@ -10084,6 +10084,7 @@ func (q *sqlQuerier) GetProvisionerJobTimingsByJobID(ctx context.Context, jobID &i.Source, &i.Action, &i.Resource, + &i.StageSeq, ); err != nil { return nil, err } @@ -10676,7 +10677,7 @@ func (q *sqlQuerier) InsertProvisionerJob(ctx context.Context, arg InsertProvisi } const insertProvisionerJobTimings = `-- name: InsertProvisionerJobTimings :many -INSERT INTO provisioner_job_timings (job_id, started_at, ended_at, stage, source, action, resource) +INSERT INTO provisioner_job_timings (job_id, started_at, ended_at, stage, source, action, resource, stage_seq) SELECT $1::uuid AS provisioner_job_id, unnest($2::timestamptz[]), @@ -10684,8 +10685,9 @@ SELECT unnest($4::provisioner_job_timing_stage[]), unnest($5::text[]), unnest($6::text[]), - unnest($7::text[]) -RETURNING job_id, started_at, ended_at, stage, source, action, resource + unnest($7::text[]), + unnest($8::integer[]) +RETURNING job_id, started_at, ended_at, stage, source, action, resource, stage_seq ` type InsertProvisionerJobTimingsParams struct { @@ -10696,6 +10698,7 @@ type InsertProvisionerJobTimingsParams struct { Source []string `db:"source" json:"source"` Action []string `db:"action" json:"action"` Resource []string `db:"resource" json:"resource"` + StageSeq []int32 `db:"stage_seq" json:"stage_seq"` } func (q *sqlQuerier) InsertProvisionerJobTimings(ctx context.Context, arg InsertProvisionerJobTimingsParams) ([]ProvisionerJobTiming, error) { @@ -10707,6 +10710,7 @@ func (q *sqlQuerier) InsertProvisionerJobTimings(ctx context.Context, arg Insert pq.Array(arg.Source), pq.Array(arg.Action), pq.Array(arg.Resource), + pq.Array(arg.StageSeq), ) if err != nil { return nil, err @@ -10723,6 +10727,7 @@ func (q *sqlQuerier) InsertProvisionerJobTimings(ctx context.Context, arg Insert &i.Source, &i.Action, &i.Resource, + &i.StageSeq, ); err != nil { return nil, err } diff --git a/coderd/database/queries/provisionerjobs.sql b/coderd/database/queries/provisionerjobs.sql index 02d67d628a861..d424f5f176a58 100644 --- a/coderd/database/queries/provisionerjobs.sql +++ b/coderd/database/queries/provisionerjobs.sql @@ -329,7 +329,7 @@ ORDER BY random() LIMIT @max_jobs; -- name: InsertProvisionerJobTimings :many -INSERT INTO provisioner_job_timings (job_id, started_at, ended_at, stage, source, action, resource) +INSERT INTO provisioner_job_timings (job_id, started_at, ended_at, stage, source, action, resource, stage_seq) SELECT @job_id::uuid AS provisioner_job_id, unnest(@started_at::timestamptz[]), @@ -337,7 +337,8 @@ SELECT unnest(@stage::provisioner_job_timing_stage[]), unnest(@source::text[]), unnest(@action::text[]), - unnest(@resource::text[]) + unnest(@resource::text[]), + unnest(@stage_seq::integer[]) RETURNING *; -- name: GetProvisionerJobTimingsByJobID :many diff --git a/coderd/provisionerdserver/provisionerdserver.go b/coderd/provisionerdserver/provisionerdserver.go index 39e707a87f016..5f3fef687e649 100644 --- a/coderd/provisionerdserver/provisionerdserver.go +++ b/coderd/provisionerdserver/provisionerdserver.go @@ -2182,6 +2182,7 @@ func (s *server) completeWorkspaceBuildJob(ctx context.Context, job database.Pro } params.Stage = append(params.Stage, stg) + params.StageSeq = append(params.StageSeq, t.StageSeq) params.Source = append(params.Source, t.Source) params.Resource = append(params.Resource, t.Resource) params.Action = append(params.Action, t.Action) diff --git a/coderd/workspacebuilds.go b/coderd/workspacebuilds.go index 0c58b902e2158..106e9774669a5 100644 --- a/coderd/workspacebuilds.go +++ b/coderd/workspacebuilds.go @@ -1295,13 +1295,14 @@ func (api *API) buildTimings(ctx context.Context, build database.WorkspaceBuild) } res.ProvisionerTimings = append(res.ProvisionerTimings, codersdk.ProvisionerTiming{ - JobID: t.JobID, - Stage: codersdk.TimingStage(t.Stage), - Source: t.Source, - Action: t.Action, - Resource: t.Resource, - StartedAt: t.StartedAt, - EndedAt: t.EndedAt, + JobID: t.JobID, + Stage: codersdk.TimingStage(t.Stage), + StageSequence: t.StageSeq, + Source: t.Source, + Action: t.Action, + Resource: t.Resource, + StartedAt: t.StartedAt, + EndedAt: t.EndedAt, }) } for _, t := range agentScriptTimings { diff --git a/codersdk/workspacebuilds.go b/codersdk/workspacebuilds.go index a91148ab2ad9e..ae3ca0edbab3d 100644 --- a/codersdk/workspacebuilds.go +++ b/codersdk/workspacebuilds.go @@ -231,13 +231,14 @@ const ( ) type ProvisionerTiming struct { - JobID uuid.UUID `json:"job_id" format:"uuid"` - StartedAt time.Time `json:"started_at" format:"date-time"` - EndedAt time.Time `json:"ended_at" format:"date-time"` - Stage TimingStage `json:"stage"` - Source string `json:"source"` - Action string `json:"action"` - Resource string `json:"resource"` + JobID uuid.UUID `json:"job_id" format:"uuid"` + StartedAt time.Time `json:"started_at" format:"date-time"` + EndedAt time.Time `json:"ended_at" format:"date-time"` + Stage TimingStage `json:"stage"` + StageSequence int32 `json:"stage_sequence"` + Source string `json:"source"` + Action string `json:"action"` + Resource string `json:"resource"` } type AgentScriptTiming struct { diff --git a/provisioner/terraform/executor.go b/provisioner/terraform/executor.go index 3d9270a6ddbab..963c3ad20c090 100644 --- a/provisioner/terraform/executor.go +++ b/provisioner/terraform/executor.go @@ -325,7 +325,7 @@ func (e *executor) plan(ctx, killCtx context.Context, env, vars []string, logr l <-doneErr }() - endStage := e.timings.startStage(database.ProvisionerJobTimingStagePlan) + endStage := e.timings.startStage(database.ProvisionerJobTimingStagePlan, 0) err := e.execWriteOutput(ctx, killCtx, args, env, outWriter, errWriter) endStage(err) if err != nil { @@ -333,12 +333,10 @@ func (e *executor) plan(ctx, killCtx context.Context, env, vars []string, logr l } // Capture the duration of the call to `terraform graph`. - graphTimings := newTimingAggregator(database.ProvisionerJobTimingStageGraph) - graphTimings.ingest(createGraphTimingsEvent(timingGraphStart)) - + endGraph := e.timings.startStage(database.ProvisionerJobTimingStageGraph, 0) state, plan, err := e.planResources(ctx, killCtx, planfilePath) + endGraph(err) if err != nil { - graphTimings.ingest(createGraphTimingsEvent(timingGraphErrored)) return nil, xerrors.Errorf("plan resources: %w", err) } planJSON, err := json.Marshal(plan) @@ -346,8 +344,6 @@ func (e *executor) plan(ctx, killCtx context.Context, env, vars []string, logr l return nil, xerrors.Errorf("marshal plan: %w", err) } - graphTimings.ingest(createGraphTimingsEvent(timingGraphComplete)) - var moduleFiles []byte // Skipping modules archiving is useful if the caller does not need it, eg during // a workspace build. This removes some added costs of sending the modules @@ -390,7 +386,7 @@ func (e *executor) plan(ctx, killCtx context.Context, env, vars []string, logr l Parameters: state.Parameters, Resources: state.Resources, ExternalAuthProviders: state.ExternalAuthProviders, - Timings: append(e.timings.aggregate(), graphTimings.aggregate()...), + Timings: e.timings.aggregate(), Presets: state.Presets, Plan: planJSON, ResourceReplacements: resReps, @@ -599,7 +595,7 @@ func (e *executor) apply( }() // `terraform apply` - endStage := e.timings.startStage(database.ProvisionerJobTimingStageApply) + endStage := e.timings.startStage(database.ProvisionerJobTimingStageApply, 0) err := e.execWriteOutput(ctx, killCtx, args, env, outWriter, errWriter) endStage(err) if err != nil { @@ -607,10 +603,14 @@ func (e *executor) apply( } // `terraform show` & `terraform graph` + // The sequence number is `1` as `graph` has already been called during `plan`. (the 0th stage) + endGraph := e.timings.startStage(database.ProvisionerJobTimingStageGraph, 1) state, err := e.stateResources(ctx, killCtx) + endGraph(err) if err != nil { return nil, err } + statefilePath := e.files.StateFilePath() stateContent, err := os.ReadFile(statefilePath) if err != nil { diff --git a/provisioner/terraform/provision.go b/provisioner/terraform/provision.go index c99ee55ad8cc6..9e86737692331 100644 --- a/provisioner/terraform/provision.go +++ b/provisioner/terraform/provision.go @@ -109,8 +109,8 @@ func (s *server) Plan( // The JSON output of `terraform init` doesn't include discrete fields for capturing timings of each plugin, // so we capture the whole init process. - initTimings := newTimingAggregator(database.ProvisionerJobTimingStageInit) - endStage := initTimings.startStage(database.ProvisionerJobTimingStageInit) + initTimings := newTimingAggregator(database.ProvisionerJobTimingStageInit, 0) + endStage := initTimings.startStage(database.ProvisionerJobTimingStageInit, 0) err = e.init(ctx, killCtx, sess) endStage(err) diff --git a/provisioner/terraform/serve.go b/provisioner/terraform/serve.go index 32b5343f6f3ce..e7f83f399f197 100644 --- a/provisioner/terraform/serve.go +++ b/provisioner/terraform/serve.go @@ -170,6 +170,6 @@ func (s *server) executor(files tfpath.Layouter, stage database.ProvisionerJobTi cliConfigPath: s.cliConfigPath, files: files, logger: s.logger.Named("executor"), - timings: newTimingAggregator(stage), + timings: newTimingAggregator(stage, 0), } } diff --git a/provisioner/terraform/timings.go b/provisioner/terraform/timings.go index 0b150d2eafd4d..7d8d4ccac5e1c 100644 --- a/provisioner/terraform/timings.go +++ b/provisioner/terraform/timings.go @@ -75,7 +75,8 @@ const ( ) type timingAggregator struct { - stage database.ProvisionerJobTimingStage + stage database.ProvisionerJobTimingStage + stageSequence int32 // Protects the stateLookup map. lookupMu sync.Mutex @@ -88,16 +89,18 @@ type timingSpan struct { messageCode initMessageCode start, end time.Time stage database.ProvisionerJobTimingStage + stageSeq int32 action, provider, resource string state proto.TimingState } // newTimingAggregator creates a new aggregator which measures the duration of resource init/plan/apply actions; stage // represents the stage of provisioning the timings are occurring within. -func newTimingAggregator(stage database.ProvisionerJobTimingStage) *timingAggregator { +func newTimingAggregator(stage database.ProvisionerJobTimingStage, seq int32) *timingAggregator { return &timingAggregator{ - stage: stage, - stateLookup: make(map[uint64]*timingSpan), + stage: stage, + stageSequence: seq, + stateLookup: make(map[uint64]*timingSpan), } } @@ -109,7 +112,12 @@ func (t *timingAggregator) ingest(ts time.Time, s *timingSpan) { return } - s.stage = t.stage + // Only set the stage if it hasn't already been set on the span. + // Explicitly set stage takes precedence. + if s.stage == "" { + s.stage = t.stage + s.stageSeq = t.stageSequence + } ts = dbtime.Time(ts.UTC()) switch s.kind { @@ -184,13 +192,14 @@ func (t *timingAggregator) aggregate() []*proto.Timing { // should be called to mark the end of the stage. This is used to measure a // stage's total duration across all it's discrete events and unmeasured // overhead/events. -func (t *timingAggregator) startStage(stage database.ProvisionerJobTimingStage) (end func(err error)) { +func (t *timingAggregator) startStage(stage database.ProvisionerJobTimingStage, seq int32) (end func(err error)) { ts := timingSpan{ kind: timingStageStart, stage: stage, resource: "coder_stage_" + string(stage), action: "terraform", provider: "coder", + stageSeq: seq, } endTs := ts t.ingest(dbtime.Now(), &ts) @@ -279,6 +288,7 @@ func (e *timingSpan) toProto() *proto.Timing { Source: e.provider, Resource: e.resource, State: e.state, + StageSeq: e.stageSeq, } } diff --git a/provisioner/terraform/timings_internal_test.go b/provisioner/terraform/timings_internal_test.go index 99f057a97e6af..9b7bf45374374 100644 --- a/provisioner/terraform/timings_internal_test.go +++ b/provisioner/terraform/timings_internal_test.go @@ -104,7 +104,7 @@ func TestAggregation(t *testing.T) { require.Truef(t, stage.Valid(), "%q is not a valid stage name; acceptable values: %v", file.Name, database.AllProvisionerJobTimingStageValues()) - agg := newTimingAggregator(stage) + agg := newTimingAggregator(stage, 0) ingestAllSpans(t, file.Data, agg) actualTimings = append(actualTimings, agg.aggregate()...) } diff --git a/provisionerd/proto/provisionerd_drpc.pb.go b/provisionerd/proto/provisionerd_drpc.pb.go index 72f131b5c5fd6..8b40a31a57488 100644 --- a/provisionerd/proto/provisionerd_drpc.pb.go +++ b/provisionerd/proto/provisionerd_drpc.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-drpc. DO NOT EDIT. -// protoc-gen-go-drpc version: v0.0.34 +// protoc-gen-go-drpc version: (devel) // source: provisionerd/proto/provisionerd.proto package proto diff --git a/provisionerd/proto/version.go b/provisionerd/proto/version.go index 0c23b3939d4f2..46c91b7795737 100644 --- a/provisionerd/proto/version.go +++ b/provisionerd/proto/version.go @@ -62,9 +62,12 @@ import "github.com/coder/coder/v2/apiversion" // - Added new field `template_version_id` to `provisioner.Metadata` // - Added new field `exp_reuse_terraform_workspace` to `provisioner.Job.WorkspaceBuild` // - Added fields `template_version_id`, `template_id`, and `exp_reuse_terraform_workspace` to `provisioner.Config` +// +// API v1.13: +// - Added new field `stage_seq` to `Timing` to distinguish repeated stages const ( CurrentMajor = 1 - CurrentMinor = 12 + CurrentMinor = 13 ) // CurrentVersion is the current provisionerd API version. diff --git a/provisionersdk/proto/provisioner.pb.go b/provisionersdk/proto/provisioner.pb.go index 72741a1036b41..7fe073265acf2 100644 --- a/provisionersdk/proto/provisioner.pb.go +++ b/provisionersdk/proto/provisioner.pb.go @@ -3759,6 +3759,11 @@ type Timing struct { Resource string `protobuf:"bytes,5,opt,name=resource,proto3" json:"resource,omitempty"` Stage string `protobuf:"bytes,6,opt,name=stage,proto3" json:"stage,omitempty"` State TimingState `protobuf:"varint,7,opt,name=state,proto3,enum=provisioner.TimingState" json:"state,omitempty"` + // stage_que distinguishes repeated runs of the same stage. + // 0 is the first occurrence, 1 is the second, etc. + // Repeated stages are not ideal, but they do exist and should be known + // to be unique by this field. + StageSeq int32 `protobuf:"varint,8,opt,name=stage_seq,json=stageSeq,proto3" json:"stage_seq,omitempty"` } func (x *Timing) Reset() { @@ -3842,6 +3847,13 @@ func (x *Timing) GetState() TimingState { return TimingState_STARTED } +func (x *Timing) GetStageSeq() int32 { + if x != nil { + return x.StageSeq + } + return 0 +} + // CancelRequest requests that the previous request be canceled gracefully. type CancelRequest struct { state protoimpl.MessageState @@ -5026,8 +5038,8 @@ var file_provisionersdk_proto_provisioner_proto_rawDesc = []byte{ 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x2e, 0x0a, 0x08, 0x61, 0x69, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x41, - 0x49, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x07, 0x61, 0x69, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0xfa, - 0x01, 0x0a, 0x06, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x49, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x07, 0x61, 0x69, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x97, + 0x02, 0x0a, 0x06, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 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, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x03, 0x65, @@ -5042,108 +5054,110 @@ var file_provisionersdk_proto_provisioner_proto_rawDesc = []byte{ 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x0f, 0x0a, 0x0d, 0x43, - 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x8c, 0x02, 0x0a, - 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, - 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x31, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x73, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x48, 0x00, 0x52, 0x05, 0x70, 0x61, 0x72, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x04, 0x70, 0x6c, - 0x61, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x48, 0x00, 0x52, 0x04, 0x70, 0x6c, 0x61, 0x6e, 0x12, 0x31, 0x0a, 0x05, 0x61, 0x70, - 0x70, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x05, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x12, 0x34, 0x0a, - 0x06, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x43, 0x61, 0x6e, 0x63, - 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x06, 0x63, 0x61, 0x6e, - 0x63, 0x65, 0x6c, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xc9, 0x02, 0x0a, 0x08, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x03, 0x6c, 0x6f, 0x67, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x65, 0x72, 0x2e, 0x4c, 0x6f, 0x67, 0x48, 0x00, 0x52, 0x03, 0x6c, 0x6f, 0x67, 0x12, 0x32, - 0x0a, 0x05, 0x70, 0x61, 0x72, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x61, 0x72, 0x73, - 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x48, 0x00, 0x52, 0x05, 0x70, 0x61, 0x72, - 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x04, 0x70, 0x6c, 0x61, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x50, - 0x6c, 0x61, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x48, 0x00, 0x52, 0x04, 0x70, - 0x6c, 0x61, 0x6e, 0x12, 0x32, 0x0a, 0x05, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, - 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x48, 0x00, - 0x52, 0x05, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, - 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x55, - 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x00, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x55, 0x70, 0x6c, - 0x6f, 0x61, 0x64, 0x12, 0x3a, 0x0a, 0x0b, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x70, 0x69, 0x65, - 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x50, 0x69, 0x65, 0x63, - 0x65, 0x48, 0x00, 0x52, 0x0a, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x50, 0x69, 0x65, 0x63, 0x65, 0x42, - 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, - 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x3c, 0x0a, 0x0b, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x55, 0x70, - 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x68, 0x61, 0x73, - 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x48, 0x61, 0x73, - 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, - 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, 0x67, 0x0a, 0x0a, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x50, - 0x69, 0x65, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0e, 0x66, 0x75, 0x6c, 0x6c, - 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x0c, 0x66, 0x75, 0x6c, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1f, - 0x0a, 0x0b, 0x70, 0x69, 0x65, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0a, 0x70, 0x69, 0x65, 0x63, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x2a, - 0xa8, 0x01, 0x0a, 0x11, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x46, 0x6f, 0x72, - 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, - 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, - 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x41, 0x44, 0x49, 0x4f, 0x10, 0x02, 0x12, 0x0c, 0x0a, - 0x08, 0x44, 0x52, 0x4f, 0x50, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x49, - 0x4e, 0x50, 0x55, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x54, 0x45, 0x58, 0x54, 0x41, 0x52, - 0x45, 0x41, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x4c, 0x49, 0x44, 0x45, 0x52, 0x10, 0x06, - 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x42, 0x4f, 0x58, 0x10, 0x07, 0x12, 0x0a, - 0x0a, 0x06, 0x53, 0x57, 0x49, 0x54, 0x43, 0x48, 0x10, 0x08, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x41, - 0x47, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x10, 0x09, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x55, 0x4c, - 0x54, 0x49, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x10, 0x0a, 0x2a, 0x3f, 0x0a, 0x08, 0x4c, 0x6f, - 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x09, 0x0a, 0x05, 0x54, 0x52, 0x41, 0x43, 0x45, 0x10, - 0x00, 0x12, 0x09, 0x0a, 0x05, 0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, - 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x41, 0x52, 0x4e, 0x10, 0x03, - 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, 0x2a, 0x3b, 0x0a, 0x0f, 0x41, - 0x70, 0x70, 0x53, 0x68, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x09, - 0x0a, 0x05, 0x4f, 0x57, 0x4e, 0x45, 0x52, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x41, 0x55, 0x54, - 0x48, 0x45, 0x4e, 0x54, 0x49, 0x43, 0x41, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, - 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x10, 0x02, 0x2a, 0x35, 0x0a, 0x09, 0x41, 0x70, 0x70, 0x4f, - 0x70, 0x65, 0x6e, 0x49, 0x6e, 0x12, 0x0e, 0x0a, 0x06, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x10, - 0x00, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x4c, 0x49, 0x4d, 0x5f, 0x57, 0x49, - 0x4e, 0x44, 0x4f, 0x57, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x41, 0x42, 0x10, 0x02, 0x2a, - 0x37, 0x0a, 0x13, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x54, 0x41, 0x52, 0x54, 0x10, - 0x00, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x54, 0x4f, 0x50, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x44, - 0x45, 0x53, 0x54, 0x52, 0x4f, 0x59, 0x10, 0x02, 0x2a, 0x3e, 0x0a, 0x1b, 0x50, 0x72, 0x65, 0x62, - 0x75, 0x69, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x42, 0x75, 0x69, - 0x6c, 0x64, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, - 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x01, 0x12, 0x09, 0x0a, - 0x05, 0x43, 0x4c, 0x41, 0x49, 0x4d, 0x10, 0x02, 0x2a, 0x35, 0x0a, 0x0b, 0x54, 0x69, 0x6d, 0x69, - 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x41, 0x52, 0x54, - 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, - 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x2a, - 0x47, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x50, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x55, 0x50, - 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x4f, 0x44, 0x55, 0x4c, 0x45, - 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x53, 0x10, 0x01, 0x32, 0x49, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x12, 0x3a, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, - 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x28, - 0x01, 0x30, 0x01, 0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2f, 0x76, 0x32, - 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x73, 0x64, 0x6b, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x73, + 0x74, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, + 0x73, 0x74, 0x61, 0x67, 0x65, 0x53, 0x65, 0x71, 0x22, 0x0f, 0x0a, 0x0d, 0x43, 0x61, 0x6e, 0x63, + 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x8c, 0x02, 0x0a, 0x07, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x06, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x31, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x73, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, + 0x72, 0x2e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, + 0x52, 0x05, 0x70, 0x61, 0x72, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x04, 0x70, 0x6c, 0x61, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, + 0x00, 0x52, 0x04, 0x70, 0x6c, 0x61, 0x6e, 0x12, 0x31, 0x0a, 0x05, 0x61, 0x70, 0x70, 0x6c, 0x79, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x48, 0x00, 0x52, 0x05, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x12, 0x34, 0x0a, 0x06, 0x63, 0x61, + 0x6e, 0x63, 0x65, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x06, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, + 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xc9, 0x02, 0x0a, 0x08, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x03, 0x6c, 0x6f, 0x67, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, + 0x2e, 0x4c, 0x6f, 0x67, 0x48, 0x00, 0x52, 0x03, 0x6c, 0x6f, 0x67, 0x12, 0x32, 0x0a, 0x05, 0x70, + 0x61, 0x72, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x43, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x48, 0x00, 0x52, 0x05, 0x70, 0x61, 0x72, 0x73, 0x65, 0x12, + 0x2f, 0x0a, 0x04, 0x70, 0x6c, 0x61, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x6c, 0x61, 0x6e, + 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x48, 0x00, 0x52, 0x04, 0x70, 0x6c, 0x61, 0x6e, + 0x12, 0x32, 0x0a, 0x05, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x41, 0x70, + 0x70, 0x6c, 0x79, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x48, 0x00, 0x52, 0x05, 0x61, + 0x70, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x75, 0x70, 0x6c, + 0x6f, 0x61, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x55, 0x70, 0x6c, 0x6f, + 0x61, 0x64, 0x48, 0x00, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, + 0x12, 0x3a, 0x0a, 0x0b, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x70, 0x69, 0x65, 0x63, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x65, 0x72, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x50, 0x69, 0x65, 0x63, 0x65, 0x48, 0x00, + 0x52, 0x0a, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x50, 0x69, 0x65, 0x63, 0x65, 0x42, 0x06, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x55, 0x70, 0x6c, + 0x6f, 0x61, 0x64, 0x12, 0x3c, 0x0a, 0x0b, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x55, 0x70, 0x6c, 0x6f, 0x61, + 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1b, + 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x75, + 0x6e, 0x6b, 0x73, 0x22, 0x67, 0x0a, 0x0a, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x50, 0x69, 0x65, 0x63, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0e, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x64, 0x61, + 0x74, 0x61, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x66, + 0x75, 0x6c, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x70, + 0x69, 0x65, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0a, 0x70, 0x69, 0x65, 0x63, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x2a, 0xa8, 0x01, 0x0a, + 0x11, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x46, 0x6f, 0x72, 0x6d, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x00, 0x12, + 0x0e, 0x0a, 0x0a, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x01, 0x12, + 0x09, 0x0a, 0x05, 0x52, 0x41, 0x44, 0x49, 0x4f, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x52, + 0x4f, 0x50, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x49, 0x4e, 0x50, 0x55, + 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x54, 0x45, 0x58, 0x54, 0x41, 0x52, 0x45, 0x41, 0x10, + 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x4c, 0x49, 0x44, 0x45, 0x52, 0x10, 0x06, 0x12, 0x0c, 0x0a, + 0x08, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x42, 0x4f, 0x58, 0x10, 0x07, 0x12, 0x0a, 0x0a, 0x06, 0x53, + 0x57, 0x49, 0x54, 0x43, 0x48, 0x10, 0x08, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x41, 0x47, 0x53, 0x45, + 0x4c, 0x45, 0x43, 0x54, 0x10, 0x09, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x53, + 0x45, 0x4c, 0x45, 0x43, 0x54, 0x10, 0x0a, 0x2a, 0x3f, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x4c, 0x65, + 0x76, 0x65, 0x6c, 0x12, 0x09, 0x0a, 0x05, 0x54, 0x52, 0x41, 0x43, 0x45, 0x10, 0x00, 0x12, 0x09, + 0x0a, 0x05, 0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x46, + 0x4f, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x41, 0x52, 0x4e, 0x10, 0x03, 0x12, 0x09, 0x0a, + 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, 0x2a, 0x3b, 0x0a, 0x0f, 0x41, 0x70, 0x70, 0x53, + 0x68, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x09, 0x0a, 0x05, 0x4f, + 0x57, 0x4e, 0x45, 0x52, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x41, 0x55, 0x54, 0x48, 0x45, 0x4e, + 0x54, 0x49, 0x43, 0x41, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x55, 0x42, + 0x4c, 0x49, 0x43, 0x10, 0x02, 0x2a, 0x35, 0x0a, 0x09, 0x41, 0x70, 0x70, 0x4f, 0x70, 0x65, 0x6e, + 0x49, 0x6e, 0x12, 0x0e, 0x0a, 0x06, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x10, 0x00, 0x1a, 0x02, + 0x08, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x4c, 0x49, 0x4d, 0x5f, 0x57, 0x49, 0x4e, 0x44, 0x4f, + 0x57, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x41, 0x42, 0x10, 0x02, 0x2a, 0x37, 0x0a, 0x13, + 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x54, 0x41, 0x52, 0x54, 0x10, 0x00, 0x12, 0x08, + 0x0a, 0x04, 0x53, 0x54, 0x4f, 0x50, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x53, 0x54, + 0x52, 0x4f, 0x59, 0x10, 0x02, 0x2a, 0x3e, 0x0a, 0x1b, 0x50, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, + 0x74, 0x61, 0x67, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0a, + 0x0a, 0x06, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x43, 0x4c, + 0x41, 0x49, 0x4d, 0x10, 0x02, 0x2a, 0x35, 0x0a, 0x0b, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x01, + 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x2a, 0x47, 0x0a, 0x0e, + 0x44, 0x61, 0x74, 0x61, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, + 0x0a, 0x13, 0x55, 0x50, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, + 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x55, 0x50, 0x4c, 0x4f, 0x41, + 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x4f, 0x44, 0x55, 0x4c, 0x45, 0x5f, 0x46, 0x49, + 0x4c, 0x45, 0x53, 0x10, 0x01, 0x32, 0x49, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x65, 0x72, 0x12, 0x3a, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x28, 0x01, 0x30, 0x01, + 0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, + 0x6f, 0x64, 0x65, 0x72, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x73, 0x64, 0x6b, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/provisionersdk/proto/provisioner.proto b/provisionersdk/proto/provisioner.proto index 89a69ce7022ca..48b8159bd6163 100644 --- a/provisionersdk/proto/provisioner.proto +++ b/provisionersdk/proto/provisioner.proto @@ -457,6 +457,11 @@ message Timing { string resource = 5; string stage = 6; TimingState state = 7; + // stage_que distinguishes repeated runs of the same stage. + // 0 is the first occurrence, 1 is the second, etc. + // Repeated stages are not ideal, but they do exist and should be known + // to be unique by this field. + int32 stage_seq = 8; } enum TimingState { diff --git a/provisionersdk/proto/provisioner_drpc.pb.go b/provisionersdk/proto/provisioner_drpc.pb.go index e9c75e16404a2..c9c54002439c2 100644 --- a/provisionersdk/proto/provisioner_drpc.pb.go +++ b/provisionersdk/proto/provisioner_drpc.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-drpc. DO NOT EDIT. -// protoc-gen-go-drpc version: v0.0.34 +// protoc-gen-go-drpc version: (devel) // source: provisionersdk/proto/provisioner.proto package proto diff --git a/site/e2e/google/protobuf/timestampGenerated.ts b/site/e2e/google/protobuf/timestampGenerated.ts index 6cddbb0b0b781..91665685bd185 100644 --- a/site/e2e/google/protobuf/timestampGenerated.ts +++ b/site/e2e/google/protobuf/timestampGenerated.ts @@ -1,7 +1,7 @@ // Code generated by protoc-gen-ts_proto. DO NOT EDIT. // versions: // protoc-gen-ts_proto v1.181.2 -// protoc v4.23.4 +// protoc v6.32.0 // source: google/protobuf/timestamp.proto /* eslint-disable */ diff --git a/site/e2e/provisionerGenerated.ts b/site/e2e/provisionerGenerated.ts index ba9071ab625e8..44b4fd3f4aed9 100644 --- a/site/e2e/provisionerGenerated.ts +++ b/site/e2e/provisionerGenerated.ts @@ -1,7 +1,7 @@ // Code generated by protoc-gen-ts_proto. DO NOT EDIT. // versions: // protoc-gen-ts_proto v1.181.2 -// protoc v4.23.4 +// protoc v6.32.0 // source: provisioner.proto /* eslint-disable */ @@ -513,6 +513,13 @@ export interface Timing { resource: string; stage: string; state: TimingState; + /** + * stage_que distinguishes repeated runs of the same stage. + * 0 is the first occurrence, 1 is the second, etc. + * Repeated stages are not ideal, but they do exist and should be known + * to be unique by this field. + */ + stageSeq: number; } /** CancelRequest requests that the previous request be canceled gracefully. */ @@ -1507,6 +1514,9 @@ export const Timing = { if (message.state !== 0) { writer.uint32(56).int32(message.state); } + if (message.stageSeq !== 0) { + writer.uint32(64).int32(message.stageSeq); + } return writer; }, }; diff --git a/site/src/api/typesGenerated.ts b/site/src/api/typesGenerated.ts index c2c94aa314b3d..08f1a4f43083a 100644 --- a/site/src/api/typesGenerated.ts +++ b/site/src/api/typesGenerated.ts @@ -3766,6 +3766,7 @@ export interface ProvisionerTiming { readonly started_at: string; readonly ended_at: string; readonly stage: TimingStage; + readonly stage_sequence: number; readonly source: string; readonly action: string; readonly resource: string; diff --git a/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.stories.tsx b/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.stories.tsx index f82f1ccae5975..75e8f51660cb5 100644 --- a/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.stories.tsx +++ b/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.stories.tsx @@ -188,6 +188,7 @@ export const MissedAction: Story = { source: "coder", stage: "apply", started_at: "2025-03-12T18:08:07.194957Z", + stage_sequence: 0, }, { action: "create", @@ -197,6 +198,7 @@ export const MissedAction: Story = { source: "null", stage: "apply", started_at: "2025-03-12T18:08:07.399387Z", + stage_sequence: 0, }, { action: "create", @@ -206,6 +208,7 @@ export const MissedAction: Story = { source: "random", stage: "apply", started_at: "2025-03-12T18:08:07.403171Z", + stage_sequence: 0, }, { action: "missed action", @@ -215,6 +218,7 @@ export const MissedAction: Story = { source: "null", stage: "apply", started_at: "2025-03-12T18:08:07.410219Z", + stage_sequence: 0, }, ], }, diff --git a/site/src/modules/workspaces/WorkspaceTiming/storybookData.ts b/site/src/modules/workspaces/WorkspaceTiming/storybookData.ts index c45b56ec5a52e..dd959a32d5ab6 100644 --- a/site/src/modules/workspaces/WorkspaceTiming/storybookData.ts +++ b/site/src/modules/workspaces/WorkspaceTiming/storybookData.ts @@ -10,6 +10,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "coder", action: "terraform", resource: "coder_stage_init", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -19,6 +20,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "coder", action: "terraform", resource: "coder_stage_plan", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -28,6 +30,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "coder", action: "read", resource: "data.coder_workspace_owner.me", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -37,6 +40,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "coder", action: "read", resource: "data.coder_parameter.repo_base_dir", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -46,6 +50,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "coder", action: "read", resource: "module.coder-login.data.coder_workspace_owner.me", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -55,6 +60,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "coder", action: "read", resource: "data.coder_parameter.image_type", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -64,6 +70,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "coder", action: "read", resource: "data.coder_external_auth.github", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -73,6 +80,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "coder", action: "read", resource: "module.dotfiles.data.coder_parameter.dotfiles_uri[0]", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -82,6 +90,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "coder", action: "read", resource: "module.jetbrains_gateway.data.coder_parameter.jetbrains_ide", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -91,6 +100,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "coder", action: "read", resource: "module.jetbrains_gateway.data.coder_workspace.me", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -100,6 +110,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "coder", action: "read", resource: "data.coder_workspace.me", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -109,6 +120,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "coder", action: "read", resource: "data.coder_parameter.region", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -118,6 +130,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "coder", action: "read", resource: "module.filebrowser.data.coder_workspace_owner.me", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -127,6 +140,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "coder", action: "read", resource: "module.cursor.data.coder_workspace_owner.me", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -136,6 +150,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "coder", action: "read", resource: "module.cursor.data.coder_workspace.me", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -146,6 +161,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { action: "read", resource: 'module.jetbrains_gateway.data.http.jetbrains_ide_versions["WS"]', + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -155,6 +171,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "coder", action: "read", resource: "module.coder-login.data.coder_workspace.me", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -164,6 +181,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "coder", action: "read", resource: "module.filebrowser.data.coder_workspace.me", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -174,6 +192,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { action: "read", resource: 'module.jetbrains_gateway.data.http.jetbrains_ide_versions["GO"]', + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -183,6 +202,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "coder", action: "state refresh", resource: "coder_agent.dev", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -192,6 +212,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "coder", action: "state refresh", resource: "module.slackme.coder_script.install_slackme", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -201,6 +222,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "coder", action: "state refresh", resource: "module.dotfiles.coder_script.dotfiles", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -210,6 +232,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "coder", action: "state refresh", resource: "module.git-clone.coder_script.git_clone", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -219,6 +242,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "coder", action: "state refresh", resource: "module.personalize.coder_script.personalize", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -228,6 +252,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "coder", action: "state refresh", resource: "module.code-server.coder_app.code-server", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -237,6 +262,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "coder", action: "state refresh", resource: "module.cursor.coder_app.cursor", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -246,6 +272,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "coder", action: "state refresh", resource: "module.coder-login.coder_script.coder-login", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -255,6 +282,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "coder", action: "state refresh", resource: "module.code-server.coder_script.code-server", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -264,6 +292,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "coder", action: "state refresh", resource: "module.filebrowser.coder_script.filebrowser", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -273,6 +302,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "coder", action: "state refresh", resource: "module.filebrowser.coder_app.filebrowser", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -282,6 +312,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "coder", action: "state refresh", resource: "module.jetbrains_gateway.coder_app.gateway", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -291,6 +322,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "docker", action: "state refresh", resource: "docker_volume.home_volume", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -300,6 +332,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "docker", action: "read", resource: "data.docker_registry_image.dogfood", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -309,6 +342,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "docker", action: "state refresh", resource: "docker_image.dogfood", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -318,6 +352,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "terraform", action: "building terraform dependency graph", resource: "state file", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -327,6 +362,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "coder", action: "terraform", resource: "coder_stage_apply", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -336,6 +372,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "coder", action: "delete", resource: "module.coder-login.coder_script.coder-login", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -345,6 +382,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "coder", action: "create", resource: "module.coder-login.coder_script.coder-login", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -354,6 +392,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "docker", action: "create", resource: "docker_container.workspace[0]", + stage_sequence: 0, }, { job_id: "86fd4143-d95f-4602-b464-1149ede62269", @@ -363,6 +402,7 @@ export const WorkspaceTimingsResponse: WorkspaceBuildTimings = { source: "coder", action: "create", resource: "coder_metadata.container_info[0]", + stage_sequence: 0, }, ], agent_script_timings: [