From 145cab2b8969ba3519cdc2e5fb17258ec889fcdc Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Mon, 6 Jan 2025 19:48:14 -0500 Subject: [PATCH 01/36] add OTel span API + Go/Python SDK support Signed-off-by: Alex Suraci --- .../go/templates/src/_types/object.go.tmpl | 39 +++++++++-- core/query.go | 65 ++++++++++++++++++- core/schema/query.go | 44 +++++++++++++ core/telemetry.go | 2 +- core/tracing.go | 3 +- dagql/idtui/viztest/main.go | 8 +-- .../idtui/viztest/python/src/main/__init__.py | 10 +-- engine/server/session.go | 2 +- 8 files changed, 155 insertions(+), 18 deletions(-) diff --git a/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl b/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl index 63bc18d1db2..041d1f28ff9 100644 --- a/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl +++ b/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl @@ -3,6 +3,7 @@ type {{ .Name | FormatName }} struct { {{- with .Directives.SourceMap -}} // {{ .Module }} ({{ .Filelink | ModuleRelPath }}) {{- end }} query *querybuilder.Selection + client graphql.Client {{ range $field := .Fields }} {{- if $field.TypeRef.IsScalar }} @@ -28,9 +29,7 @@ func (r *{{ $.Name | FormatName }}) With(f With{{ .Name | FormatName }}Func) *{{ func (r *{{ .Name | FormatName }}) WithGraphQLQuery(q *querybuilder.Selection) *{{ $.Name | FormatName }} { return &{{ .Name | FormatName }}{ query: q, - {{- if eq .Name "Query" }} client: r.client, - {{ end }} } } @@ -72,6 +71,37 @@ type {{ $field | FieldOptionsStructName }} struct { {{- end }} {{- $convertID := $field | ConvertID }} {{- $supportsVoid := CheckVersionCompatibility "v0.12.0" }} +{{- if and (eq $field.ParentObject.Name "Query") (eq $field.Name "span") }} +func (r *{{ $.Name | FormatName }}) Span(ctx context.Context, name string) (context.Context, *{{ $field.TypeRef | FormatOutputType }}) { + spanQ := r.query. + Select("span"). + Arg("name", name) + + var spanID string + q := spanQ. + Select("query"). + Select("spanContext"). + Select("spanId"). + Bind(&spanID) + if err := q.Execute(ctx); err != nil { + panic(err) + } + + sc := trace.SpanContextFromContext(ctx) + tid := sc.TraceID() + sid, _ := trace.SpanIDFromHex(spanID) + return trace.ContextWithSpanContext(ctx, trace.NewSpanContext(trace.SpanContextConfig{ + TraceID: tid, + SpanID: sid, + Remote: true, + TraceFlags: sc.TraceFlags(), + TraceState: sc.TraceState(), + })), &{{ $field.TypeRef | FormatOutputType }}{ + query: spanQ, + client: r.client, + } +} +{{- else }} {{ FieldFunction $field false $supportsVoid }} { {{- with .Directives.SourceMap -}} // {{ .Module }} ({{ .Filelink | ModuleRelPath }}) {{- end }} {{- range $arg := $field.Args }} @@ -125,9 +155,7 @@ type {{ $field | FieldOptionsStructName }} struct { {{- else if $field.TypeRef.IsObject }} return &{{ $typeName }} { query: q, - {{- if eq $typeName "Client" }} client: r.client, - {{ end }} } {{- else if or $field.TypeRef.IsScalar $field.TypeRef.IsList }} @@ -199,7 +227,7 @@ func (r *{{ $.Name | FormatName }}) XXX_GraphQLID(ctx context.Context) (string, if err != nil { return "", err } - return string(id), nil + return string(id), nil } func (r *{{ $.Name | FormatName }}) MarshalJSON() ([]byte, error) { @@ -224,3 +252,4 @@ func (r *{{ $.Name | FormatName }}) UnmarshalJSON(bs []byte) error { {{ end }} {{ end -}} +{{ end -}} diff --git a/core/query.go b/core/query.go index 8b8a21499f1..1458c589a03 100644 --- a/core/query.go +++ b/core/query.go @@ -25,6 +25,64 @@ import ( // dependencies for evaluating queries. type Query struct { Server + + SpanContext SpanContext `field:"true"` +} + +type SpanContext struct { + // TODO: ...can this just be an alias? with a custom scalar for these? + TraceID string `field:"true"` + SpanID string `field:"true"` + Remote bool `field:"true"` + + // TODO: do we need to support TraceFlags and TraceState? +} + +func (c SpanContext) Type() *ast.Type { + return &ast.Type{ + NamedType: "SpanContext", + NonNull: true, + } +} + +func SpanContextFromContext(ctx context.Context) SpanContext { + sc := trace.SpanContextFromContext(ctx) + return SpanContext{ + TraceID: sc.TraceID().String(), + SpanID: sc.SpanID().String(), + Remote: sc.IsRemote(), + } +} + +func (c SpanContext) ToContext(ctx context.Context) context.Context { + sc := trace.SpanContextFromContext(ctx) + tid, _ := trace.TraceIDFromHex(c.TraceID) + sid, _ := trace.SpanIDFromHex(c.SpanID) + return trace.ContextWithSpanContext(ctx, trace.NewSpanContext(trace.SpanContextConfig{ + TraceID: tid, + SpanID: sid, + Remote: c.Remote, + TraceFlags: sc.TraceFlags(), + TraceState: sc.TraceState(), + })) +} + +type Span struct { + Span trace.Span + + Query *Query `field:"true"` +} + +func (c *Span) Type() *ast.Type { + return &ast.Type{ + NamedType: "Span", + NonNull: true, + } +} + +func (*Span) TypeDescription() string { + // TODO: rename to Task and come up with a nice description + return "An OpenTelemetry span." } var ErrNoCurrentModule = fmt.Errorf("no current module") @@ -131,8 +189,11 @@ func CurrentQuery(ctx context.Context) (*Query, error) { return q, nil } -func NewRoot(srv Server) *Query { - return &Query{Server: srv} +func NewRoot(ctx context.Context, srv Server) *Query { + return &Query{ + Server: srv, + SpanContext: SpanContextFromContext(ctx), + } } func (*Query) Type() *ast.Type { diff --git a/core/schema/query.go b/core/schema/query.go index 7cc7d8ff6f4..b2028815c28 100644 --- a/core/schema/query.go +++ b/core/schema/query.go @@ -12,6 +12,7 @@ import ( "github.com/dagger/dagger/dagql/introspection" "github.com/dagger/dagger/engine" "github.com/dagger/dagger/engine/sources/blob" + "go.opentelemetry.io/otel/codes" ) type querySchema struct { @@ -56,6 +57,8 @@ func (s *querySchema) Install() { dagql.Fields[Label]{}.Install(s.srv) + dagql.Fields[core.SpanContext]{}.Install(s.srv) + dagql.Fields[*core.Query]{ dagql.Func("pipeline", s.pipeline). View(BeforeVersion("v0.13.0")). @@ -69,6 +72,14 @@ func (s *querySchema) Install() { dagql.Func("version", s.version). Doc(`Get the current Dagger Engine version.`), + + dagql.Func("span", s.start). + Doc(`Create a new OpenTelemetry span.`), + }.Install(s.srv) + + dagql.Fields[*core.Span]{ + dagql.Func("end", s.spanEnd). + Doc(`End the OpenTelemetry span, with an optional error.`), }.Install(s.srv) } @@ -153,3 +164,36 @@ func (s *querySchema) schemaJSONFile( return fileInst.WithDigest(dgst), nil } + +func (s *querySchema) start(ctx context.Context, parent *core.Query, args struct { + Name string +}) (*core.Span, error) { + // First, grab the tracer based on the incoming (real) span. + tracer := core.Tracer(ctx) + // Overwrite the span in the context so we inherit from the query's span. + ctx = parent.SpanContext.ToContext(ctx) + // Start a span beneath the query span. + ctx, span := tracer.Start(ctx, args.Name) + // Update the query with the new span context. + child := parent.Clone() + child.SpanContext = core.SpanContextFromContext(ctx) + return &core.Span{ + Span: span, + Query: child, + }, nil +} + +func (s *querySchema) spanEnd(ctx context.Context, parent *core.Span, args struct { + Error dagql.Optional[dagql.ID[*core.Error]] +}) (dagql.Nullable[core.Void], error) { + if args.Error.Valid { + dagErr, err := args.Error.Value.Load(ctx, s.srv) + if err != nil { + parent.Span.SetStatus(codes.Error, fmt.Sprintf("failed to load error: %v", err)) + } else { + parent.Span.SetStatus(codes.Error, dagErr.Self.Message) + } + } + parent.Span.End() + return dagql.Null[core.Void](), nil +} diff --git a/core/telemetry.go b/core/telemetry.go index 25c3ab79e9d..ecb8278b5d8 100644 --- a/core/telemetry.go +++ b/core/telemetry.go @@ -220,7 +220,7 @@ func isIntrospection(id *call.ID) bool { // isMeta returns true if any type in the ID is "too meta" to show to the user, // for example span and error APIs. func isMeta(id *call.ID) bool { - if anyReturns(id, "Error") { + if anyReturns(id, "Error") || anyReturns(id, "Span") { return true } switch id.Field() { diff --git a/core/tracing.go b/core/tracing.go index d595b6bfec8..785a8bba977 100644 --- a/core/tracing.go +++ b/core/tracing.go @@ -3,11 +3,12 @@ package core import ( "context" + "dagger.io/dagger/telemetry" "go.opentelemetry.io/otel/trace" ) const InstrumentationLibrary = "dagger.io/core" func Tracer(ctx context.Context) trace.Tracer { - return trace.SpanFromContext(ctx).TracerProvider().Tracer(InstrumentationLibrary) + return telemetry.Tracer(ctx, InstrumentationLibrary) } diff --git a/dagql/idtui/viztest/main.go b/dagql/idtui/viztest/main.go index 1e2f6b80992..db98ef89cdd 100644 --- a/dagql/idtui/viztest/main.go +++ b/dagql/idtui/viztest/main.go @@ -114,8 +114,8 @@ func (*Viztest) ManyLines(n int) { } func (v *Viztest) CustomSpan(ctx context.Context) (res string, rerr error) { - ctx, span := Tracer().Start(ctx, "custom span") - defer telemetry.End(span, func() error { return rerr }) + ctx, span := dag.Span(ctx, "custom span") + defer span.End(ctx) return v.Echo(ctx, "hello from Go! it is currently "+time.Now().String()) } @@ -166,9 +166,9 @@ func (*Viztest) ManySpans( delayMs int, ) { for i := 1; i <= n; i++ { - _, span := Tracer().Start(ctx, fmt.Sprintf("span %d", i)) + ctx, span := dag.Span(ctx, fmt.Sprintf("span %d", i)) time.Sleep(time.Duration(delayMs) * time.Millisecond) - span.End() + span.End(ctx) } } diff --git a/dagql/idtui/viztest/python/src/main/__init__.py b/dagql/idtui/viztest/python/src/main/__init__.py index 625c77996fa..51c217bf7a1 100644 --- a/dagql/idtui/viztest/python/src/main/__init__.py +++ b/dagql/idtui/viztest/python/src/main/__init__.py @@ -1,10 +1,7 @@ -from opentelemetry import trace import datetime from dagger import dag, function, object_type -tracer = trace.get_tracer(__name__) - now = str(datetime.datetime.now()) @object_type @@ -20,9 +17,14 @@ async def echo(self, msg: str) -> str: @function async def custom_span(self) -> str: - with tracer.start_as_current_span("custom span"): + async with dag.span("custom span"): return await self.echo(f"hello from Python! it is currently {now}") + @function + async def exceptional_span(self) -> str: + async with dag.span("custom span"): + raise ValueError("oh no") + @function async def pending(self): return await ( diff --git a/engine/server/session.go b/engine/server/session.go index d2fbba7789d..6d49a794555 100644 --- a/engine/server/session.go +++ b/engine/server/session.go @@ -572,7 +572,7 @@ func (srv *Server) initializeDaggerClient( } // setup the graphql server + module/function state for the client - client.dagqlRoot = core.NewRoot(srv) + client.dagqlRoot = core.NewRoot(ctx, srv) // make query available via context to all APIs ctx = core.ContextWithQuery(ctx, client.dagqlRoot) From 9c9bd30de961a3767ea83a4f4c0d3ad18b3b1a98 Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Mon, 6 Jan 2025 22:21:06 -0500 Subject: [PATCH 02/36] go: switch to dag.Span(name).Start(ctx) * no more conflict with normal codegen'd method for Span * can support builder pattern (withFoo) in the future for customizing span, which will be much nicer than a ton of args especiall in Go Signed-off-by: Alex Suraci --- .../go/templates/src/_types/object.go.tmpl | 206 +++++++++--------- dagql/idtui/viztest/main.go | 4 +- 2 files changed, 100 insertions(+), 110 deletions(-) diff --git a/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl b/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl index 041d1f28ff9..aaf76ec3a4f 100644 --- a/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl +++ b/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl @@ -5,10 +5,10 @@ type {{ .Name | FormatName }} struct { query *querybuilder.Selection client graphql.Client - {{ range $field := .Fields }} - {{- if $field.TypeRef.IsScalar }} - {{ $field.Name }} *{{ $field.TypeRef | FormatOutputType }} - {{- end }} + {{ range $field := .Fields }} + {{- if $field.TypeRef.IsScalar }} + {{ $field.Name }} *{{ $field.TypeRef | FormatOutputType }} + {{- end }} {{- end }} } {{- end }} @@ -33,6 +33,28 @@ func (r *{{ .Name | FormatName }}) WithGraphQLQuery(q *querybuilder.Selection) * } } +{{- if eq .Name "Span" }} +func (r *Span) Start(ctx context.Context) (context.Context, *Span) { + spanID, err := r.Query().SpanContext().SpanID(ctx) + if err != nil { + panic(err) + } + sc := trace.SpanContextFromContext(ctx) + tid := sc.TraceID() + sid, err := trace.SpanIDFromHex(spanID) + if err != nil { + panic(err) + } + return trace.ContextWithSpanContext(ctx, trace.NewSpanContext(trace.SpanContextConfig{ + TraceID: tid, + SpanID: sid, + Remote: true, + TraceFlags: sc.TraceFlags(), + TraceState: sc.TraceState(), + })), r +} +{{- end }} + {{ range $field := .Fields }} {{- if HasOptionals $field.Args }} // {{ $field | FieldOptionsStructName }} contains options for {{ $.Name | FormatName }}.{{ $field.Name | FormatName }} @@ -71,66 +93,35 @@ type {{ $field | FieldOptionsStructName }} struct { {{- end }} {{- $convertID := $field | ConvertID }} {{- $supportsVoid := CheckVersionCompatibility "v0.12.0" }} -{{- if and (eq $field.ParentObject.Name "Query") (eq $field.Name "span") }} -func (r *{{ $.Name | FormatName }}) Span(ctx context.Context, name string) (context.Context, *{{ $field.TypeRef | FormatOutputType }}) { - spanQ := r.query. - Select("span"). - Arg("name", name) - - var spanID string - q := spanQ. - Select("query"). - Select("spanContext"). - Select("spanId"). - Bind(&spanID) - if err := q.Execute(ctx); err != nil { - panic(err) - } - - sc := trace.SpanContextFromContext(ctx) - tid := sc.TraceID() - sid, _ := trace.SpanIDFromHex(spanID) - return trace.ContextWithSpanContext(ctx, trace.NewSpanContext(trace.SpanContextConfig{ - TraceID: tid, - SpanID: sid, - Remote: true, - TraceFlags: sc.TraceFlags(), - TraceState: sc.TraceState(), - })), &{{ $field.TypeRef | FormatOutputType }}{ - query: spanQ, - client: r.client, - } -} -{{- else }} {{ FieldFunction $field false $supportsVoid }} { {{- with .Directives.SourceMap -}} // {{ .Module }} ({{ .Filelink | ModuleRelPath }}) {{- end }} {{- range $arg := $field.Args }} - {{- if and (IsPointer $arg) (not (IsArgOptional $arg)) }} - assertNotNil("{{ $arg.Name}}", {{ $arg.Name }}) - {{- end }} - {{- end }} - - {{- if and ($field.TypeRef.IsScalar) (ne $field.ParentObject.Name "Query") (not $convertID) }} - if r.{{ $field.Name }} != nil { - {{- if and $supportsVoid $field.TypeRef.IsVoid }} - return nil - {{- else }} - return *r.{{ $field.Name }}, nil - {{- end }} - } - {{- end }} + {{- if and (IsPointer $arg) (not (IsArgOptional $arg)) }} + assertNotNil("{{ $arg.Name}}", {{ $arg.Name }}) + {{- end }} + {{- end }} + + {{- if and ($field.TypeRef.IsScalar) (ne $field.ParentObject.Name "Query") (not $convertID) }} + if r.{{ $field.Name }} != nil { + {{- if and $supportsVoid $field.TypeRef.IsVoid }} + return nil + {{- else }} + return *r.{{ $field.Name }}, nil + {{- end }} + } + {{- end }} q := r.query.Select("{{ $field.Name }}") {{- if HasOptionals $field.Args }} for i := len(opts) - 1; i >= 0; i-- { - {{- range $arg := $field.Args }} - {{- if IsArgOptional $arg }} - // `{{ $arg.Name }}` optional argument - if !querybuilder.IsZeroValue(opts[i].{{ $arg.Name | FormatName }}) { - q = q.Arg("{{ $arg.Name }}", opts[i].{{ $arg.Name | FormatName }}) - } - {{- end }} - {{- end }} + {{- range $arg := $field.Args }} + {{- if IsArgOptional $arg }} + // `{{ $arg.Name }}` optional argument + if !querybuilder.IsZeroValue(opts[i].{{ $arg.Name | FormatName }}) { + q = q.Arg("{{ $arg.Name }}", opts[i].{{ $arg.Name | FormatName }}) + } + {{- end }} + {{- end }} } {{- end }} @@ -142,7 +133,7 @@ func (r *{{ $.Name | FormatName }}) Span(ctx context.Context, name string) (cont {{- end }} {{- $typeName := $field.TypeRef | FormatOutputType }} {{ if and $supportsVoid $field.TypeRef.IsVoid }} - return q.Execute(ctx) + return q.Execute(ctx) {{- else if $convertID }} var id {{ $typeName }} if err := q.Bind(&id).Execute(ctx); err != nil { @@ -159,51 +150,51 @@ func (r *{{ $.Name | FormatName }}) Span(ctx context.Context, name string) (cont } {{- else if or $field.TypeRef.IsScalar $field.TypeRef.IsList }} - {{- if and $field.TypeRef.IsList (IsListOfObject $field.TypeRef) }} - q = q.Select("{{ range $i, $v := $field | GetArrayField }}{{ if $i }} {{ end }}{{ $v.Name }}{{ end }}") - - type {{ $field.Name | ToLowerCase }} struct { - {{ range $v := $field | GetArrayField }} - {{ $v.Name | ToUpperCase }} {{ $v.TypeRef | FormatOutputType }} - {{- end }} - } - - {{$eleType := $field.TypeRef | InnerType}} - convert := func(fields []{{ $field.Name | ToLowerCase }}) {{ $field.TypeRef | FormatOutputType }} { - out := {{ $field.TypeRef | FormatOutputType }}{} - - for i := range fields { - val := {{ $field.TypeRef | FormatOutputType | FormatArrayToSingleType }}{{"{"}}{{ $field | GetArrayField | FormatArrayField }}{{"}"}} - {{- if $eleType | IsIDableObject }} - val.query = q.Root().Select("load{{$eleType | ObjectName}}FromID").Arg("id", fields[i].Id) - {{- end }} - out = append(out, val) - } - - return out - } - {{- end }} - - {{- if and $field.TypeRef.IsList (IsListOfObject $field.TypeRef) }} + {{- if and $field.TypeRef.IsList (IsListOfObject $field.TypeRef) }} + q = q.Select("{{ range $i, $v := $field | GetArrayField }}{{ if $i }} {{ end }}{{ $v.Name }}{{ end }}") + + type {{ $field.Name | ToLowerCase }} struct { + {{ range $v := $field | GetArrayField }} + {{ $v.Name | ToUpperCase }} {{ $v.TypeRef | FormatOutputType }} + {{- end }} + } + + {{$eleType := $field.TypeRef | InnerType}} + convert := func(fields []{{ $field.Name | ToLowerCase }}) {{ $field.TypeRef | FormatOutputType }} { + out := {{ $field.TypeRef | FormatOutputType }}{} + + for i := range fields { + val := {{ $field.TypeRef | FormatOutputType | FormatArrayToSingleType }}{{"{"}}{{ $field | GetArrayField | FormatArrayField }}{{"}"}} + {{- if $eleType | IsIDableObject }} + val.query = q.Root().Select("load{{$eleType | ObjectName}}FromID").Arg("id", fields[i].Id) + {{- end }} + out = append(out, val) + } + + return out + } + {{- end }} + + {{- if and $field.TypeRef.IsList (IsListOfObject $field.TypeRef) }} var response []{{ $field.Name | ToLowerCase }} - {{- else }} + {{- else }} var response {{ $field.TypeRef | FormatOutputType }} - {{- end }} + {{- end }} q = q.Bind(&response) {{- $typeName := $field.TypeRef | FormatOutputType }} {{- if ne $typeName "Client" }} - {{- if and $field.TypeRef.IsList (IsListOfObject $field.TypeRef) }} + {{- if and $field.TypeRef.IsList (IsListOfObject $field.TypeRef) }} err := q.Execute(ctx) if err != nil { - return nil, err + return nil, err } return convert(response), nil - {{- else }} + {{- else }} return response, q.Execute(ctx) - {{- end }} + {{- end }} {{- else }} return response, q.Execute(ctx, r.gql) {{- end }} @@ -223,33 +214,32 @@ func (r *{{ $.Name | FormatName }}) XXX_GraphQLIDType() string { // XXX_GraphQLID is an internal function. It returns the underlying type ID func (r *{{ $.Name | FormatName }}) XXX_GraphQLID(ctx context.Context) (string, error) { - id, err := r.ID(ctx) - if err != nil { - return "", err - } - return string(id), nil + id, err := r.ID(ctx) + if err != nil { + return "", err + } + return string(id), nil } func (r *{{ $.Name | FormatName }}) MarshalJSON() ([]byte, error) { - id, err := r.ID(marshalCtx) - if err != nil { - return nil, err - } - return json.Marshal(id) + id, err := r.ID(marshalCtx) + if err != nil { + return nil, err + } + return json.Marshal(id) } {{- if IsModuleCode }} func (r *{{ $.Name | FormatName }}) UnmarshalJSON(bs []byte) error { - var id string - err := json.Unmarshal(bs, &id) - if err != nil { - return err - } - *r = *dag.Load{{ $.Name | FormatName }}FromID({{$.Name | FormatName}}ID(id)) - return nil + var id string + err := json.Unmarshal(bs, &id) + if err != nil { + return err + } + *r = *dag.Load{{ $.Name | FormatName }}FromID({{$.Name | FormatName}}ID(id)) + return nil } {{- end }} {{ end }} {{ end -}} -{{ end -}} diff --git a/dagql/idtui/viztest/main.go b/dagql/idtui/viztest/main.go index db98ef89cdd..68f78ee78ef 100644 --- a/dagql/idtui/viztest/main.go +++ b/dagql/idtui/viztest/main.go @@ -114,7 +114,7 @@ func (*Viztest) ManyLines(n int) { } func (v *Viztest) CustomSpan(ctx context.Context) (res string, rerr error) { - ctx, span := dag.Span(ctx, "custom span") + ctx, span := dag.Span("custom span").Start(ctx) defer span.End(ctx) return v.Echo(ctx, "hello from Go! it is currently "+time.Now().String()) } @@ -166,7 +166,7 @@ func (*Viztest) ManySpans( delayMs int, ) { for i := 1; i <= n; i++ { - ctx, span := dag.Span(ctx, fmt.Sprintf("span %d", i)) + ctx, span := dag.Span(fmt.Sprintf("span %d", i)).Start(ctx) time.Sleep(time.Duration(delayMs) * time.Millisecond) span.End(ctx) } From 58efed81884a3facff8ce46842b2a1a63e0aec9f Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Tue, 7 Jan 2025 16:05:11 -0500 Subject: [PATCH 03/36] support configuring spans before starting them The previous implementation relied too much on DagQL query cache for keeping track of spans, and also started the span as soon as it was created. This meant it was impossible to create two spans with the same name. Now creating a span just gives you a Span object which can be started later. Next we can add more APIs for customzing the span. TODO: * Distinguish between SpanConfig and Span (started)? Signed-off-by: Alex Suraci --- .../go/templates/src/_types/object.go.tmpl | 36 +++++++--- core/query.go | 53 ++++++++++++++- core/schema/query.go | 66 +++++++++++++++---- dagql/idtui/viztest/main.go | 34 +++++++++- .../idtui/viztest/python/src/main/__init__.py | 17 +++++ sdk/python/codegen/src/codegen/generator.py | 55 ++++++++++++++++ 6 files changed, 234 insertions(+), 27 deletions(-) diff --git a/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl b/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl index aaf76ec3a4f..ad2f8d91296 100644 --- a/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl +++ b/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl @@ -34,24 +34,40 @@ func (r *{{ .Name | FormatName }}) WithGraphQLQuery(q *querybuilder.Selection) * } {{- if eq .Name "Span" }} -func (r *Span) Start(ctx context.Context) (context.Context, *Span) { - spanID, err := r.Query().SpanContext().SpanID(ctx) +func (r *Span) Context(ctx context.Context) (context.Context, *Span) { + started, err := r.Start(ctx) if err != nil { panic(err) } - sc := trace.SpanContextFromContext(ctx) - tid := sc.TraceID() - sid, err := trace.SpanIDFromHex(spanID) + spanIDHex, err := started.InternalID(ctx) if err != nil { panic(err) } + spanID, err := trace.SpanIDFromHex(spanIDHex) + if err != nil { + panic(err) + } + spanCtx := trace.SpanContextFromContext(ctx) return trace.ContextWithSpanContext(ctx, trace.NewSpanContext(trace.SpanContextConfig{ - TraceID: tid, - SpanID: sid, + TraceID: spanCtx.TraceID(), + SpanID: spanID, Remote: true, - TraceFlags: sc.TraceFlags(), - TraceState: sc.TraceState(), - })), r + TraceFlags: spanCtx.TraceFlags(), + TraceState: spanCtx.TraceState(), + })), started +} + +func (r *Span) Run(ctx context.Context, cb func(context.Context, *Span) error) error { + ctx, span := r.Context(ctx) + err := cb(ctx, span) + if err != nil { + _ = span.End(ctx, SpanEndOpts{ + Error: r.Query().Error(err.Error()), + }) + return err + } else { + return span.End(ctx) + } } {{- end }} diff --git a/core/query.go b/core/query.go index 1458c589a03..52eae2bf2b4 100644 --- a/core/query.go +++ b/core/query.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "net/http" + "sync" "github.com/containerd/containerd/content" bkcache "github.com/moby/buildkit/cache" @@ -26,7 +27,23 @@ import ( type Query struct { Server - SpanContext SpanContext `field:"true"` + SpanContext SpanContext + + spans map[string]*Span + spansL *sync.Mutex +} + +func (q *Query) LookupSpan(spanID string) (*Span, bool) { + q.spansL.Lock() + span, found := q.spans[spanID] + q.spansL.Unlock() + return span, found +} + +func (q *Query) StoreSpan(s *Span) { + q.spansL.Lock() + q.spans[s.InternalID()] = s + q.spansL.Unlock() } type SpanContext struct { @@ -68,9 +85,11 @@ func (c SpanContext) ToContext(ctx context.Context) context.Context { } type Span struct { - Span trace.Span + Name string `field:"true"` Query *Query `field:"true"` + + Span trace.Span } func (c *Span) Type() *ast.Type { @@ -85,6 +104,34 @@ func (*Span) TypeDescription() string { return "An OpenTelemetry span." } +func (s Span) Clone() *Span { + cp := &s + cp.Query = cp.Query.Clone() + return cp +} + +func (s *Span) Start(ctx context.Context) *Span { + started := s.Clone() + // First, grab the tracer based on the incoming (real) span. + tracer := Tracer(ctx) + // Overwrite the span in the context so we inherit from the query's span. + ctx = s.Query.SpanContext.ToContext(ctx) + // Start a span beneath the query span. + ctx, started.Span = tracer.Start(ctx, s.Name) + // Update the query with the new span context. + started.Query.SpanContext = SpanContextFromContext(ctx) + // Keep track of the new span so we can find it later. + started.Query.StoreSpan(started) + return started +} + +func (s *Span) InternalID() string { + if s.Span == nil { + return "" + } + return s.Span.SpanContext().SpanID().String() +} + var ErrNoCurrentModule = fmt.Errorf("no current module") // APIs from the server+session+client that are needed by core APIs @@ -193,6 +240,8 @@ func NewRoot(ctx context.Context, srv Server) *Query { return &Query{ Server: srv, SpanContext: SpanContextFromContext(ctx), + spans: map[string]*Span{}, + spansL: new(sync.Mutex), } } diff --git a/core/schema/query.go b/core/schema/query.go index b2028815c28..ffda39c72ff 100644 --- a/core/schema/query.go +++ b/core/schema/query.go @@ -73,11 +73,19 @@ func (s *querySchema) Install() { dagql.Func("version", s.version). Doc(`Get the current Dagger Engine version.`), - dagql.Func("span", s.start). + dagql.Func("span", s.span). Doc(`Create a new OpenTelemetry span.`), }.Install(s.srv) dagql.Fields[*core.Span]{ + dagql.NodeFunc("start", s.spanStart). + Doc(`Start a new instance of the span.`). + Impure("Creates a new span with each call."), + dagql.Func("internalId", s.spanInternalID). + Doc(`Returns the internal ID of the span.`), + dagql.Func("span", s.spanSpan). + Doc(`Create a new OpenTelemetry span.`). + Impure("Creates a new span with each call."), dagql.Func("end", s.spanEnd). Doc(`End the OpenTelemetry span, with an optional error.`), }.Install(s.srv) @@ -165,21 +173,53 @@ func (s *querySchema) schemaJSONFile( return fileInst.WithDigest(dgst), nil } -func (s *querySchema) start(ctx context.Context, parent *core.Query, args struct { +func (s *querySchema) span(ctx context.Context, parent *core.Query, args struct { + Name string + Key string `default:""` +}) (*core.Span, error) { + query := parent + if args.Key != "" { + span, found := query.LookupSpan(args.Key) + if !found { + return nil, fmt.Errorf("span not found: %s", args.Key) + } + return span, nil + } + return &core.Span{ + Name: args.Name, + Query: parent, + }, nil +} + +func (s *querySchema) spanStart(ctx context.Context, parent dagql.Instance[*core.Span], args struct { + Key string `default:""` +}) (dagql.ID[*core.Span], error) { + started := parent.Self.Start(ctx) + var inst dagql.Instance[*core.Span] + err := s.srv.Select(ctx, s.srv.Root(), &inst, dagql.Selector{ + Field: "span", + Pure: true, + Args: []dagql.NamedInput{ + {Name: "name", Value: dagql.NewString(started.Name)}, + {Name: "key", Value: dagql.NewString(started.InternalID())}, + }, + }) + if err != nil { + return dagql.ID[*core.Span]{}, err + } + return dagql.NewID[*core.Span](inst.ID()), nil +} + +func (s *querySchema) spanInternalID(ctx context.Context, parent *core.Span, args struct{}) (string, error) { + return parent.Span.SpanContext().SpanID().String(), nil +} + +func (s *querySchema) spanSpan(ctx context.Context, parent *core.Span, args struct { Name string }) (*core.Span, error) { - // First, grab the tracer based on the incoming (real) span. - tracer := core.Tracer(ctx) - // Overwrite the span in the context so we inherit from the query's span. - ctx = parent.SpanContext.ToContext(ctx) - // Start a span beneath the query span. - ctx, span := tracer.Start(ctx, args.Name) - // Update the query with the new span context. - child := parent.Clone() - child.SpanContext = core.SpanContextFromContext(ctx) return &core.Span{ - Span: span, - Query: child, + Name: args.Name, + Query: parent.Query, }, nil } diff --git a/dagql/idtui/viztest/main.go b/dagql/idtui/viztest/main.go index 68f78ee78ef..43ad9a70370 100644 --- a/dagql/idtui/viztest/main.go +++ b/dagql/idtui/viztest/main.go @@ -114,7 +114,7 @@ func (*Viztest) ManyLines(n int) { } func (v *Viztest) CustomSpan(ctx context.Context) (res string, rerr error) { - ctx, span := dag.Span("custom span").Start(ctx) + ctx, span := dag.Span("custom span").Context(ctx) defer span.End(ctx) return v.Echo(ctx, "hello from Go! it is currently "+time.Now().String()) } @@ -159,6 +159,36 @@ func (v *Viztest) RevealAndLog(ctx context.Context) (res string, rerr error) { return res, nil } +func (v *Viztest) NestedSpans(ctx context.Context) (res string, rerr error) { + err := dag.Span("custom span").Run(ctx, func(ctx context.Context, outer *dagger.Span) error { + if _, err := v.Echo(ctx, "outer"); err != nil { + return err + } + if err := outer.Span("sub span").Run(ctx, func(ctx context.Context, _ *dagger.Span) error { + _, err := v.Echo(ctx, "sub 1") + return err + }); err != nil { + return err + } + if err := outer.Span("sub span").Run(ctx, func(ctx context.Context, _ *dagger.Span) error { + _, err := v.Echo(ctx, "sub 2") + return err + }); err != nil { + return err + } + return outer.Span("another sub span").Run(ctx, func(ctx context.Context, inner *dagger.Span) error { + return inner.Span("sub span").Run(ctx, func(ctx context.Context, _ *dagger.Span) error { + _, err := v.Echo(ctx, "im even deeper") + return err + }) + }) + }) + if err != nil { + return "", err + } + return v.Echo(ctx, "hello from Go! it is currently "+time.Now().String()) +} + func (*Viztest) ManySpans( ctx context.Context, n int, @@ -166,7 +196,7 @@ func (*Viztest) ManySpans( delayMs int, ) { for i := 1; i <= n; i++ { - ctx, span := dag.Span(fmt.Sprintf("span %d", i)).Start(ctx) + ctx, span := dag.Span(fmt.Sprintf("span %d", i)).Context(ctx) time.Sleep(time.Duration(delayMs) * time.Millisecond) span.End(ctx) } diff --git a/dagql/idtui/viztest/python/src/main/__init__.py b/dagql/idtui/viztest/python/src/main/__init__.py index 51c217bf7a1..d639c3d49cf 100644 --- a/dagql/idtui/viztest/python/src/main/__init__.py +++ b/dagql/idtui/viztest/python/src/main/__init__.py @@ -25,6 +25,23 @@ async def exceptional_span(self) -> str: async with dag.span("custom span"): raise ValueError("oh no") + @function + async def nested_spans(self) -> str: + async with dag.span("custom span") as outer: + await self.echo("outer") + + async with outer.span("sub span"): + await self.echo("sub 1") + + async with outer.span("sub span"): + await self.echo("sub 2") + + async with outer.span("another sub span") as inner: + async with inner.span("sub span"): + await self.echo("im even deeper") + + return "done" + @function async def pending(self): return await ( diff --git a/sdk/python/codegen/src/codegen/generator.py b/sdk/python/codegen/src/codegen/generator.py index 269dd1dcfbb..27aca75f18e 100644 --- a/sdk/python/codegen/src/codegen/generator.py +++ b/sdk/python/codegen/src/codegen/generator.py @@ -824,6 +824,61 @@ def render_head(self, t: GraphQLObjectType) -> str: def render_body(self, t: GraphQLObjectType) -> Iterator[str]: yield super().render_body(t) + self_name = self.type_name(t) + + if self_name == "Span": + yield textwrap.dedent( + f''' + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.token = None + self.started = None + + async def __aenter__(self) -> "{self_name}": + # Fetch the actual span ID created by the engine + started = await self.start() + span_id_hex = await started.internal_id() + span_id = int(span_id_hex, 16) + + # Get the current span context + current_span = opentelemetry.trace.get_current_span() + current_span_context = current_span.get_span_context() + + # Extract trace ID and other fields from the current span context + trace_id = current_span_context.trace_id + trace_flags = current_span_context.trace_flags + trace_state = current_span_context.trace_state + + # Construct the new SpanContext + new_span_context = opentelemetry.trace.SpanContext( + trace_id=trace_id, + span_id=span_id, + is_remote=True, + trace_flags=trace_flags, + trace_state=trace_state or TraceState(), + ) + + # Create a new context with the new SpanContext + new_context = opentelemetry.trace.set_span_in_context(opentelemetry.trace.NonRecordingSpan(new_span_context)) + + # Attach the new context and save the token for detachment + self.token = opentelemetry.context.attach(new_context) + self.started = started + return started + + async def __aexit__(self, exception_type, exception_value, exception_traceback) -> Void | None: + error: Error | None = None + void: Void | None = None + if exception_type: + error = dag.error(f"{{exception_type.__name__}}: {{exception_value}}") + if self.started: + void = await self.started.end(error=error) + if self.token: + opentelemetry.context.detach(self.token) + return void + ''' # noqa: E501 + ) + if is_self_chainable(t): self_name = self.type_name(t) yield textwrap.dedent( From ad2745b38841c056da7f70d44a3cd8f99b51b334 Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Tue, 7 Jan 2025 17:22:07 -0500 Subject: [PATCH 04/36] fix module compatibility for span ending Signed-off-by: Alex Suraci --- .../generator/go/templates/src/_types/object.go.tmpl | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl b/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl index ad2f8d91296..46daf2793d8 100644 --- a/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl +++ b/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl @@ -57,13 +57,20 @@ func (r *Span) Context(ctx context.Context) (context.Context, *Span) { })), started } +{{- $supportsVoid := CheckVersionCompatibility "v0.12.0" }} func (r *Span) Run(ctx context.Context, cb func(context.Context, *Span) error) error { ctx, span := r.Context(ctx) err := cb(ctx, span) if err != nil { + {{ if $supportsVoid }} _ = span.End(ctx, SpanEndOpts{ Error: r.Query().Error(err.Error()), }) + {{ else }} + _, _ = span.End(ctx, SpanEndOpts{ + Error: r.Query().Error(err.Error()), + }) + {{ end }} return err } else { return span.End(ctx) From 9a9bfd9438433aa3115f031fe444df9481b33368 Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Tue, 7 Jan 2025 17:58:09 -0500 Subject: [PATCH 05/36] fix another void return case Signed-off-by: Alex Suraci --- .../go/templates/src/_types/object.go.tmpl | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl b/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl index 46daf2793d8..583541ab68a 100644 --- a/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl +++ b/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl @@ -61,20 +61,25 @@ func (r *Span) Context(ctx context.Context) (context.Context, *Span) { func (r *Span) Run(ctx context.Context, cb func(context.Context, *Span) error) error { ctx, span := r.Context(ctx) err := cb(ctx, span) + var endErr error if err != nil { - {{ if $supportsVoid }} - _ = span.End(ctx, SpanEndOpts{ + {{- if $supportsVoid }} + endErr = span.End(ctx, SpanEndOpts{ Error: r.Query().Error(err.Error()), }) - {{ else }} - _, _ = span.End(ctx, SpanEndOpts{ + {{- else }} + _, endErr = span.End(ctx, SpanEndOpts{ Error: r.Query().Error(err.Error()), }) - {{ end }} - return err + {{- end }} } else { - return span.End(ctx) + {{- if $supportsVoid }} + endErr = span.End(ctx) + {{- else }} + _, endErr = span.End(ctx) + {{- end }} } + return errors.Join(err, endErr) } {{- end }} From d704dd95d67551d2173af41e3b8ef9c6767d4fb4 Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Tue, 7 Jan 2025 21:40:10 -0500 Subject: [PATCH 06/36] appease linter Signed-off-by: Alex Suraci --- core/query.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/query.go b/core/query.go index 52eae2bf2b4..bf480a8952f 100644 --- a/core/query.go +++ b/core/query.go @@ -92,7 +92,7 @@ type Span struct { Span trace.Span } -func (c *Span) Type() *ast.Type { +func (*Span) Type() *ast.Type { return &ast.Type{ NamedType: "Span", NonNull: true, From 2684c5bb309ccf1af8f39e6209c1d9d5af80cfad Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Wed, 8 Jan 2025 17:02:01 -0500 Subject: [PATCH 07/36] remove Query.SpanContext not needed anymore! now that we skip the Span spans entirely in AroundFunc, we don't need to keep track of a starting point. Signed-off-by: Alex Suraci --- .../go/templates/src/_types/object.go.tmpl | 4 ++-- core/query.go | 21 +++++-------------- dagql/idtui/viztest/main.go | 10 ++++----- engine/server/session.go | 2 +- 4 files changed, 13 insertions(+), 24 deletions(-) diff --git a/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl b/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl index 583541ab68a..f58a9e6df23 100644 --- a/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl +++ b/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl @@ -58,9 +58,9 @@ func (r *Span) Context(ctx context.Context) (context.Context, *Span) { } {{- $supportsVoid := CheckVersionCompatibility "v0.12.0" }} -func (r *Span) Run(ctx context.Context, cb func(context.Context, *Span) error) error { +func (r *Span) Run(ctx context.Context, cb func(context.Context) error) error { ctx, span := r.Context(ctx) - err := cb(ctx, span) + err := cb(ctx) var endErr error if err != nil { {{- if $supportsVoid }} diff --git a/core/query.go b/core/query.go index bf480a8952f..41784e57c60 100644 --- a/core/query.go +++ b/core/query.go @@ -27,8 +27,6 @@ import ( type Query struct { Server - SpanContext SpanContext - spans map[string]*Span spansL *sync.Mutex } @@ -112,15 +110,7 @@ func (s Span) Clone() *Span { func (s *Span) Start(ctx context.Context) *Span { started := s.Clone() - // First, grab the tracer based on the incoming (real) span. - tracer := Tracer(ctx) - // Overwrite the span in the context so we inherit from the query's span. - ctx = s.Query.SpanContext.ToContext(ctx) - // Start a span beneath the query span. - ctx, started.Span = tracer.Start(ctx, s.Name) - // Update the query with the new span context. - started.Query.SpanContext = SpanContextFromContext(ctx) - // Keep track of the new span so we can find it later. + ctx, started.Span = Tracer(ctx).Start(ctx, s.Name) started.Query.StoreSpan(started) return started } @@ -236,12 +226,11 @@ func CurrentQuery(ctx context.Context) (*Query, error) { return q, nil } -func NewRoot(ctx context.Context, srv Server) *Query { +func NewRoot(srv Server) *Query { return &Query{ - Server: srv, - SpanContext: SpanContextFromContext(ctx), - spans: map[string]*Span{}, - spansL: new(sync.Mutex), + Server: srv, + spans: map[string]*Span{}, + spansL: new(sync.Mutex), } } diff --git a/dagql/idtui/viztest/main.go b/dagql/idtui/viztest/main.go index 43ad9a70370..6189547bbdf 100644 --- a/dagql/idtui/viztest/main.go +++ b/dagql/idtui/viztest/main.go @@ -160,24 +160,24 @@ func (v *Viztest) RevealAndLog(ctx context.Context) (res string, rerr error) { } func (v *Viztest) NestedSpans(ctx context.Context) (res string, rerr error) { - err := dag.Span("custom span").Run(ctx, func(ctx context.Context, outer *dagger.Span) error { + err := dag.Span("custom span").Run(ctx, func(ctx context.Context) error { if _, err := v.Echo(ctx, "outer"); err != nil { return err } - if err := outer.Span("sub span").Run(ctx, func(ctx context.Context, _ *dagger.Span) error { + if err := dag.Span("sub span").Run(ctx, func(ctx context.Context) error { _, err := v.Echo(ctx, "sub 1") return err }); err != nil { return err } - if err := outer.Span("sub span").Run(ctx, func(ctx context.Context, _ *dagger.Span) error { + if err := dag.Span("sub span").Run(ctx, func(ctx context.Context) error { _, err := v.Echo(ctx, "sub 2") return err }); err != nil { return err } - return outer.Span("another sub span").Run(ctx, func(ctx context.Context, inner *dagger.Span) error { - return inner.Span("sub span").Run(ctx, func(ctx context.Context, _ *dagger.Span) error { + return dag.Span("another sub span").Run(ctx, func(ctx context.Context) error { + return dag.Span("sub span").Run(ctx, func(ctx context.Context) error { _, err := v.Echo(ctx, "im even deeper") return err }) diff --git a/engine/server/session.go b/engine/server/session.go index 6d49a794555..d2fbba7789d 100644 --- a/engine/server/session.go +++ b/engine/server/session.go @@ -572,7 +572,7 @@ func (srv *Server) initializeDaggerClient( } // setup the graphql server + module/function state for the client - client.dagqlRoot = core.NewRoot(ctx, srv) + client.dagqlRoot = core.NewRoot(srv) // make query available via context to all APIs ctx = core.ContextWithQuery(ctx, client.dagqlRoot) From 8039e30f32025d6a6116465cd0b6526f48ce28eb Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Wed, 8 Jan 2025 18:14:45 -0500 Subject: [PATCH 08/36] remove Span.query - not needed anymore Previously this was used when chaining sub-spans from Spans. Now it's dependent on context. Signed-off-by: Alex Suraci --- .../generator/go/templates/src/_types/object.go.tmpl | 8 ++++++-- core/query.go | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl b/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl index f58a9e6df23..6129d729fd2 100644 --- a/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl +++ b/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl @@ -63,13 +63,17 @@ func (r *Span) Run(ctx context.Context, cb func(context.Context) error) error { err := cb(ctx) var endErr error if err != nil { + errClient := &Client{ + query: r.query, + client: r.client, + } {{- if $supportsVoid }} endErr = span.End(ctx, SpanEndOpts{ - Error: r.Query().Error(err.Error()), + Error: errClient.Error(err.Error()), }) {{- else }} _, endErr = span.End(ctx, SpanEndOpts{ - Error: r.Query().Error(err.Error()), + Error: errClient.Error(err.Error()), }) {{- end }} } else { diff --git a/core/query.go b/core/query.go index 41784e57c60..bf1a1d06a51 100644 --- a/core/query.go +++ b/core/query.go @@ -85,7 +85,7 @@ func (c SpanContext) ToContext(ctx context.Context) context.Context { type Span struct { Name string `field:"true"` - Query *Query `field:"true"` + Query *Query Span trace.Span } From 7a0cd9d27ec413c4ef18e6109b60a6790586ba9e Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Wed, 8 Jan 2025 18:21:20 -0500 Subject: [PATCH 09/36] remove SpanContext type, tidy API Signed-off-by: Alex Suraci --- core/query.go | 38 -------------------------------------- core/schema/query.go | 26 ++++++++------------------ 2 files changed, 8 insertions(+), 56 deletions(-) diff --git a/core/query.go b/core/query.go index bf1a1d06a51..713c6bef6cc 100644 --- a/core/query.go +++ b/core/query.go @@ -44,44 +44,6 @@ func (q *Query) StoreSpan(s *Span) { q.spansL.Unlock() } -type SpanContext struct { - // TODO: ...can this just be an alias? with a custom scalar for these? - TraceID string `field:"true"` - SpanID string `field:"true"` - Remote bool `field:"true"` - - // TODO: do we need to support TraceFlags and TraceState? -} - -func (c SpanContext) Type() *ast.Type { - return &ast.Type{ - NamedType: "SpanContext", - NonNull: true, - } -} - -func SpanContextFromContext(ctx context.Context) SpanContext { - sc := trace.SpanContextFromContext(ctx) - return SpanContext{ - TraceID: sc.TraceID().String(), - SpanID: sc.SpanID().String(), - Remote: sc.IsRemote(), - } -} - -func (c SpanContext) ToContext(ctx context.Context) context.Context { - sc := trace.SpanContextFromContext(ctx) - tid, _ := trace.TraceIDFromHex(c.TraceID) - sid, _ := trace.SpanIDFromHex(c.SpanID) - return trace.ContextWithSpanContext(ctx, trace.NewSpanContext(trace.SpanContextConfig{ - TraceID: tid, - SpanID: sid, - Remote: c.Remote, - TraceFlags: sc.TraceFlags(), - TraceState: sc.TraceState(), - })) -} - type Span struct { Name string `field:"true"` diff --git a/core/schema/query.go b/core/schema/query.go index ffda39c72ff..76c51aeef1d 100644 --- a/core/schema/query.go +++ b/core/schema/query.go @@ -57,8 +57,6 @@ func (s *querySchema) Install() { dagql.Fields[Label]{}.Install(s.srv) - dagql.Fields[core.SpanContext]{}.Install(s.srv) - dagql.Fields[*core.Query]{ dagql.Func("pipeline", s.pipeline). View(BeforeVersion("v0.13.0")). @@ -74,18 +72,18 @@ func (s *querySchema) Install() { Doc(`Get the current Dagger Engine version.`), dagql.Func("span", s.span). - Doc(`Create a new OpenTelemetry span.`), + Doc(`Create a new OpenTelemetry span.`). + ArgDoc("name", "Name of the span."), }.Install(s.srv) dagql.Fields[*core.Span]{ dagql.NodeFunc("start", s.spanStart). Doc(`Start a new instance of the span.`). Impure("Creates a new span with each call."), + dagql.Func("internalId", s.spanInternalID). Doc(`Returns the internal ID of the span.`), - dagql.Func("span", s.spanSpan). - Doc(`Create a new OpenTelemetry span.`). - Impure("Creates a new span with each call."), + dagql.Func("end", s.spanEnd). Doc(`End the OpenTelemetry span, with an optional error.`), }.Install(s.srv) @@ -191,9 +189,7 @@ func (s *querySchema) span(ctx context.Context, parent *core.Query, args struct }, nil } -func (s *querySchema) spanStart(ctx context.Context, parent dagql.Instance[*core.Span], args struct { - Key string `default:""` -}) (dagql.ID[*core.Span], error) { +func (s *querySchema) spanStart(ctx context.Context, parent dagql.Instance[*core.Span], args struct{}) (dagql.ID[*core.Span], error) { started := parent.Self.Start(ctx) var inst dagql.Instance[*core.Span] err := s.srv.Select(ctx, s.srv.Root(), &inst, dagql.Selector{ @@ -214,18 +210,12 @@ func (s *querySchema) spanInternalID(ctx context.Context, parent *core.Span, arg return parent.Span.SpanContext().SpanID().String(), nil } -func (s *querySchema) spanSpan(ctx context.Context, parent *core.Span, args struct { - Name string -}) (*core.Span, error) { - return &core.Span{ - Name: args.Name, - Query: parent.Query, - }, nil -} - func (s *querySchema) spanEnd(ctx context.Context, parent *core.Span, args struct { Error dagql.Optional[dagql.ID[*core.Error]] }) (dagql.Nullable[core.Void], error) { + if parent.Span == nil { + return dagql.Null[core.Void](), fmt.Errorf("span not started") + } if args.Error.Valid { dagErr, err := args.Error.Value.Load(ctx, s.srv) if err != nil { From d4790ca377eb5661982d37da59ce878044cd72e0 Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Wed, 8 Jan 2025 19:31:55 -0500 Subject: [PATCH 10/36] fix lint Signed-off-by: Alex Suraci --- core/query.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/query.go b/core/query.go index 713c6bef6cc..134d1cd73c9 100644 --- a/core/query.go +++ b/core/query.go @@ -72,7 +72,7 @@ func (s Span) Clone() *Span { func (s *Span) Start(ctx context.Context) *Span { started := s.Clone() - ctx, started.Span = Tracer(ctx).Start(ctx, s.Name) + _, started.Span = Tracer(ctx).Start(ctx, s.Name) started.Query.StoreSpan(started) return started } From 6a3abb4e552114f09589ad6dc3ff64f516760b28 Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Wed, 8 Jan 2025 20:14:12 -0500 Subject: [PATCH 11/36] fix python lint Signed-off-by: Alex Suraci --- sdk/python/codegen/src/codegen/generator.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/python/codegen/src/codegen/generator.py b/sdk/python/codegen/src/codegen/generator.py index 27aca75f18e..b894339362f 100644 --- a/sdk/python/codegen/src/codegen/generator.py +++ b/sdk/python/codegen/src/codegen/generator.py @@ -828,7 +828,7 @@ def render_body(self, t: GraphQLObjectType) -> Iterator[str]: if self_name == "Span": yield textwrap.dedent( - f''' + f""" def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.token = None @@ -876,7 +876,7 @@ async def __aexit__(self, exception_type, exception_value, exception_traceback) if self.token: opentelemetry.context.detach(self.token) return void - ''' # noqa: E501 + """ # noqa: E501 ) if is_self_chainable(t): From 6fe231e6a0d682482707fb7a2f039d14920b75cf Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Thu, 9 Jan 2025 15:28:41 -0500 Subject: [PATCH 12/36] typescript: implement higher level span API Signed-off-by: Alex Suraci --- .../typescript/templates/src/header.ts.gtpl | 3 +- .../typescript/templates/src/object.ts.gtpl | 45 ++++++++++++++++++ dagql/idtui/viztest/typescript/src/index.ts | 47 ++++++++++++++++--- 3 files changed, 87 insertions(+), 8 deletions(-) diff --git a/cmd/codegen/generator/typescript/templates/src/header.ts.gtpl b/cmd/codegen/generator/typescript/templates/src/header.ts.gtpl index 53c71af0469..743ea7fc629 100644 --- a/cmd/codegen/generator/typescript/templates/src/header.ts.gtpl +++ b/cmd/codegen/generator/typescript/templates/src/header.ts.gtpl @@ -7,6 +7,7 @@ inherited by futures objects and common types. * This file was auto-generated by `client-gen`. * Do not make direct changes to the file. */ +import * as opentelemetry from "@opentelemetry/api" {{- if IsBundle }} import { Context } from "./core.js" {{- else if (not IsClientOnly)}} @@ -24,7 +25,7 @@ async function serveModuleDependencies(client: Client): Promise { {{- range $i, $dep := $dependencies -}} {{- if eq $dep.Kind "GIT_SOURCE" }} await client.moduleSource( - "{{ $dep.Source }}", + "{{ $dep.Source }}", { refPin: "{{ $dep.Pin }}" }, ) .withName("{{ $dep.Name }}") diff --git a/cmd/codegen/generator/typescript/templates/src/object.ts.gtpl b/cmd/codegen/generator/typescript/templates/src/object.ts.gtpl index a45e019626b..6c77698d0cb 100644 --- a/cmd/codegen/generator/typescript/templates/src/object.ts.gtpl +++ b/cmd/codegen/generator/typescript/templates/src/object.ts.gtpl @@ -67,6 +67,51 @@ export class {{ .Name | QueryToClient | FormatName }} extends BaseClient { {{- w {{- end }} {{- end }} +{{- if eq .Name "Span" }} + + public async run(fn: (span: Span) => Promise) { + const started = await this.start() + const spanIdHex = await started.internalId() + + // Get the current span context + const currentSpan = opentelemetry.trace.getSpan(opentelemetry.context.active()) || undefined; + const currentSpanContext = currentSpan?.spanContext(); + + if (!currentSpanContext) { + return await fn(this) + } + + // Extract trace ID and other fields + const traceId = currentSpanContext.traceId; + const traceFlags = currentSpanContext.traceFlags; + const traceState = currentSpanContext.traceState; + + // Construct the new SpanContext + const newSpanContext: opentelemetry.SpanContext = { + traceId, + spanId: spanIdHex, + traceFlags, + isRemote: true, + traceState, + }; + + // Bind the new context + const newContext = opentelemetry.trace.setSpan( + opentelemetry.context.active(), + opentelemetry.trace.wrapSpanContext(newSpanContext), + ); + + let spanError: Error | undefined = undefined + try { + return await opentelemetry.context.with(newContext, fn, this, started) + } catch (e) { + spanError = dag.error(e.message) + throw e + } finally { + await started.end({ error: spanError }) + } + } +{{- end }} {{- if . | IsSelfChainable }} {{""}} /** diff --git a/dagql/idtui/viztest/typescript/src/index.ts b/dagql/idtui/viztest/typescript/src/index.ts index d41d8db3eb4..9be25ae9f75 100644 --- a/dagql/idtui/viztest/typescript/src/index.ts +++ b/dagql/idtui/viztest/typescript/src/index.ts @@ -14,13 +14,6 @@ export class Typescript { .stdout() } - @func() - async customSpan(): Promise { - return getTracer().startActiveSpan("custom span", async () => { - return this.echo(`hello from TypeScript! it is currently ${now}`) - }) - } - @func() async pending(): Promise { await dag @@ -61,4 +54,44 @@ export class Typescript { .from("alpine") .withExec(["sh", "-c", "echo this is a failing effect; exit 1"]) } + + @func() + async customSpan(): Promise { + return dag.span("custom span").run(async () => { + return this.echo(`hello from TypeScript! it is currently ${now}`) + }) + } + + @func() + async exceptionalSpan(): Promise { + return dag.span("custom span").run(async () => { + throw new Error("oh no"); + }); + } + + @func() + async nestedSpans(): Promise { + return dag.span("custom span").run(async () => { + await this.echo("outer"); + + // First sub-span + await dag.span("sub span").run(async () => { + await this.echo("sub 1"); + }); + + // Second sub-span + await dag.span("sub span").run(async () => { + await this.echo("sub 2"); + }); + + // Nested sub-span + await dag.span("another sub span").run(async () => { + await dag.span("sub span").run(async () => { + await this.echo("im even deeper"); + }); + }); + + return "done"; + }); + } } From 32f974c83b37c56d5fa1f32c53477697f0f6d90b Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Thu, 9 Jan 2025 16:20:10 -0500 Subject: [PATCH 13/36] add golden tests for spans + nesting Signed-off-by: Alex Suraci --- .../go/templates/src/_types/object.go.tmpl | 2 +- dagql/idtui/golden_test.go | 6 +++ .../TestTelemetry/TestGolden/nested-spans | 51 +++++++++++++++++++ .../TestTelemetry/TestGolden/nested-spans#01 | 42 +++++++++++++++ .../TestGolden/viztest/python/nested-spans | 45 ++++++++++++++++ .../TestGolden/viztest/python/nested-spans#01 | 41 +++++++++++++++ .../viztest/typescript/nested-spans | 45 ++++++++++++++++ .../viztest/typescript/nested-spans#01 | 48 +++++++++++++++++ dagql/idtui/viztest/main.go | 19 ++++--- .../idtui/viztest/python/src/main/__init__.py | 26 +++++----- dagql/idtui/viztest/typescript/src/index.ts | 21 ++++---- 11 files changed, 313 insertions(+), 33 deletions(-) create mode 100644 dagql/idtui/testdata/TestTelemetry/TestGolden/nested-spans create mode 100644 dagql/idtui/testdata/TestTelemetry/TestGolden/nested-spans#01 create mode 100644 dagql/idtui/testdata/TestTelemetry/TestGolden/viztest/python/nested-spans create mode 100644 dagql/idtui/testdata/TestTelemetry/TestGolden/viztest/python/nested-spans#01 create mode 100644 dagql/idtui/testdata/TestTelemetry/TestGolden/viztest/typescript/nested-spans create mode 100644 dagql/idtui/testdata/TestTelemetry/TestGolden/viztest/typescript/nested-spans#01 diff --git a/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl b/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl index 6129d729fd2..9a56e7c85c3 100644 --- a/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl +++ b/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl @@ -64,7 +64,7 @@ func (r *Span) Run(ctx context.Context, cb func(context.Context) error) error { var endErr error if err != nil { errClient := &Client{ - query: r.query, + query: querybuilder.Query().Client(r.client), client: r.client, } {{- if $supportsVoid }} diff --git a/dagql/idtui/golden_test.go b/dagql/idtui/golden_test.go index fa019a79e5a..cbfc07a9744 100644 --- a/dagql/idtui/golden_test.go +++ b/dagql/idtui/golden_test.go @@ -91,6 +91,8 @@ func (s TelemetrySuite) TestGolden(ctx context.Context, t *testctx.T) { require.Contains(t, attrs, attribute.String("fizz", "buzz")) }, }, + {Function: "nested-spans"}, + {Function: "nested-spans", Args: []string{"--fail"}, Fail: true}, {Function: "use-exec-service"}, {Function: "use-no-exec-service"}, {Function: "docker-build", Args: []string{ @@ -152,6 +154,8 @@ func (s TelemetrySuite) TestGolden(ctx context.Context, t *testctx.T) { // Python SDK tests {Module: "./viztest/python", Function: "pending", Fail: true}, {Module: "./viztest/python", Function: "custom-span"}, + {Module: "./viztest/python", Function: "nested-spans"}, + {Module: "./viztest/python", Function: "nested-spans", Args: []string{"--fail"}, Fail: true}, // TypeScript SDK tests {Module: "./viztest/typescript", Function: "pending", Fail: true}, @@ -159,6 +163,8 @@ func (s TelemetrySuite) TestGolden(ctx context.Context, t *testctx.T) { {Module: "./viztest/typescript", Function: "fail-log", Fail: true}, {Module: "./viztest/typescript", Function: "fail-effect", Fail: true}, {Module: "./viztest/typescript", Function: "fail-log-native", Fail: true}, + {Module: "./viztest/typescript", Function: "nested-spans"}, + {Module: "./viztest/typescript", Function: "nested-spans", Args: []string{"--fail"}, Fail: true}, } { testName := ex.Function if ex.Module != "" { diff --git a/dagql/idtui/testdata/TestTelemetry/TestGolden/nested-spans b/dagql/idtui/testdata/TestTelemetry/TestGolden/nested-spans new file mode 100644 index 00000000000..af5b95e270e --- /dev/null +++ b/dagql/idtui/testdata/TestTelemetry/TestGolden/nested-spans @@ -0,0 +1,51 @@ +Expected stdout: + +hello from Go! it is currently 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X + + +Expected stderr: + +✔ connect X.Xs +│ ✔ starting engine X.Xs +│ ✔ connecting to engine X.Xs +│ ✔ starting session X.Xs + +✔ load module X.Xs +│ ✔ finding module configuration X.Xs +│ ✔ initializing module X.Xs +│ ✔ inspecting module metadata X.Xs +│ ✔ loading type definitions X.Xs + +✔ parsing command line arguments X.Xs + +✔ viztest: Viztest! X.Xs +✔ .nestedSpans: String! X.Xs +│ ✔ custom span X.Xs +│ │ ✔ container: Container! X.Xs +│ │ $ .from(address: "alpine"): Container! X.Xs CACHED +│ │ ✔ .withExec(args: ["echo", "outer: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X"]): Container! X.Xs +│ │ ┃ outer: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X +│ │ ✔ .stdout: String! X.Xs +│ │ +│ │ ✔ sub span X.Xs +│ │ │ ✔ Container.withExec(args: ["echo", "sub 1: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X"]): Container! X.Xs +│ │ │ ┃ sub 1: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X +│ │ │ ✔ .stdout: String! X.Xs +│ │ +│ │ ✔ sub span X.Xs +│ │ │ ✔ Container.withExec(args: ["echo", "sub 2: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X"]): Container! X.Xs +│ │ │ ┃ sub 2: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X +│ │ │ ✔ .stdout: String! X.Xs +│ │ +│ │ ✔ another sub span X.Xs +│ │ │ ✔ sub span X.Xs +│ │ │ │ ✔ Container.withExec(args: ["echo", "im even deeper: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X"]): Container! X.Xs +│ │ │ │ ┃ im even deeper: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X +│ │ │ │ ✔ .stdout: String! X.Xs +│ +│ ✔ Container.withExec(args: ["echo", "hello from Go! it is currently 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X"]): Container! X.Xs +│ ┃ hello from Go! it is currently 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X +│ ✔ .stdout: String! X.Xs + + +Setup tracing at https://dagger.cloud/traces/setup. To hide set DAGGER_NO_NAG=1 diff --git a/dagql/idtui/testdata/TestTelemetry/TestGolden/nested-spans#01 b/dagql/idtui/testdata/TestTelemetry/TestGolden/nested-spans#01 new file mode 100644 index 00000000000..a444581e694 --- /dev/null +++ b/dagql/idtui/testdata/TestTelemetry/TestGolden/nested-spans#01 @@ -0,0 +1,42 @@ +Expected stderr: + +✔ connect X.Xs +│ ✔ starting engine X.Xs +│ ✔ connecting to engine X.Xs +│ ✔ starting session X.Xs + +✔ load module X.Xs +│ ✔ finding module configuration X.Xs +│ ✔ initializing module X.Xs +│ ✔ inspecting module metadata X.Xs +│ ✔ loading type definitions X.Xs + +✔ parsing command line arguments X.Xs + +✔ viztest: Viztest! X.Xs +✘ .nestedSpans(fail: true): String! X.Xs +! oh no +│ ✘ custom span X.Xs +│ ! oh no +│ │ ✔ container: Container! X.Xs +│ │ $ .from(address: "alpine"): Container! X.Xs CACHED +│ │ ✔ .withExec(args: ["echo", "outer: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X"]): Container! X.Xs +│ │ ┃ outer: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X +│ │ ✔ .stdout: String! X.Xs +│ │ +│ │ ✔ sub span X.Xs +│ │ │ ✔ Container.withExec(args: ["echo", "sub 1: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X"]): Container! X.Xs +│ │ │ ┃ sub 1: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X +│ │ │ ✔ .stdout: String! X.Xs +│ │ +│ │ ✔ sub span X.Xs +│ │ │ ✔ Container.withExec(args: ["echo", "sub 2: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X"]): Container! X.Xs +│ │ │ ┃ sub 2: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X +│ │ │ ✔ .stdout: String! X.Xs +│ │ +│ │ ✘ another sub span X.Xs +│ │ ! oh no +│ │ │ ✘ sub span X.Xs +│ │ │ ! oh no + +Setup tracing at https://dagger.cloud/traces/setup. To hide set DAGGER_NO_NAG=1 diff --git a/dagql/idtui/testdata/TestTelemetry/TestGolden/viztest/python/nested-spans b/dagql/idtui/testdata/TestTelemetry/TestGolden/viztest/python/nested-spans new file mode 100644 index 00000000000..4a91431bec5 --- /dev/null +++ b/dagql/idtui/testdata/TestTelemetry/TestGolden/viztest/python/nested-spans @@ -0,0 +1,45 @@ +Expected stdout: + +done + +Expected stderr: + +✔ connect X.Xs +│ ✔ starting engine X.Xs +│ ✔ connecting to engine X.Xs +│ ✔ starting session X.Xs + +✔ load module X.Xs +│ ✔ finding module configuration X.Xs +│ ✔ initializing module X.Xs +│ ✔ inspecting module metadata X.Xs +│ ✔ loading type definitions X.Xs + +✔ parsing command line arguments X.Xs + +✔ python: Python! X.Xs +✔ .nestedSpans: String! X.Xs +│ ✔ custom span X.Xs +│ │ $ Container.from(address: "alpine:latest"): Container! X.Xs CACHED +│ │ ✔ .withExec(args: ["echo", "outer: 20XX-XX-XX XX:XX:XX.XXXX"]): Container! X.Xs +│ │ ┃ outer: 20XX-XX-XX XX:XX:XX.XXXX +│ │ ✔ .stdout: String! X.Xs +│ │ +│ │ ✔ sub span X.Xs +│ │ │ ✔ Container.withExec(args: ["echo", "sub 1: 20XX-XX-XX XX:XX:XX.XXXX"]): Container! X.Xs +│ │ │ ┃ sub 1: 20XX-XX-XX XX:XX:XX.XXXX +│ │ │ ✔ .stdout: String! X.Xs +│ │ +│ │ ✔ sub span X.Xs +│ │ │ ✔ Container.withExec(args: ["echo", "sub 2: 20XX-XX-XX XX:XX:XX.XXXX"]): Container! X.Xs +│ │ │ ┃ sub 2: 20XX-XX-XX XX:XX:XX.XXXX +│ │ │ ✔ .stdout: String! X.Xs +│ │ +│ │ ✔ another sub span X.Xs +│ │ │ ✔ sub span X.Xs +│ │ │ │ ✔ Container.withExec(args: ["echo", "im even deeper: 20XX-XX-XX XX:XX:XX.XXXX"]): Container! X.Xs +│ │ │ │ ┃ im even deeper: 20XX-XX-XX XX:XX:XX.XXXX +│ │ │ │ ✔ .stdout: String! X.Xs + + +Setup tracing at https://dagger.cloud/traces/setup. To hide set DAGGER_NO_NAG=1 diff --git a/dagql/idtui/testdata/TestTelemetry/TestGolden/viztest/python/nested-spans#01 b/dagql/idtui/testdata/TestTelemetry/TestGolden/viztest/python/nested-spans#01 new file mode 100644 index 00000000000..af8ea113aef --- /dev/null +++ b/dagql/idtui/testdata/TestTelemetry/TestGolden/viztest/python/nested-spans#01 @@ -0,0 +1,41 @@ +Expected stderr: + +✔ connect X.Xs +│ ✔ starting engine X.Xs +│ ✔ connecting to engine X.Xs +│ ✔ starting session X.Xs + +✔ load module X.Xs +│ ✔ finding module configuration X.Xs +│ ✔ initializing module X.Xs +│ ✔ inspecting module metadata X.Xs +│ ✔ loading type definitions X.Xs + +✔ parsing command line arguments X.Xs + +✔ python: Python! X.Xs +✘ .nestedSpans(fail: true): String! X.Xs +! oh no +│ ✘ custom span X.Xs +│ ! ValueError: oh no +│ │ $ Container.from(address: "alpine:latest"): Container! X.Xs CACHED +│ │ ✔ .withExec(args: ["echo", "outer: 20XX-XX-XX XX:XX:XX.XXXX"]): Container! X.Xs +│ │ ┃ outer: 20XX-XX-XX XX:XX:XX.XXXX +│ │ ✔ .stdout: String! X.Xs +│ │ +│ │ ✔ sub span X.Xs +│ │ │ ✔ Container.withExec(args: ["echo", "sub 1: 20XX-XX-XX XX:XX:XX.XXXX"]): Container! X.Xs +│ │ │ ┃ sub 1: 20XX-XX-XX XX:XX:XX.XXXX +│ │ │ ✔ .stdout: String! X.Xs +│ │ +│ │ ✔ sub span X.Xs +│ │ │ ✔ Container.withExec(args: ["echo", "sub 2: 20XX-XX-XX XX:XX:XX.XXXX"]): Container! X.Xs +│ │ │ ┃ sub 2: 20XX-XX-XX XX:XX:XX.XXXX +│ │ │ ✔ .stdout: String! X.Xs +│ │ +│ │ ✘ another sub span X.Xs +│ │ ! ValueError: oh no +│ │ │ ✘ sub span X.Xs +│ │ │ ! ValueError: oh no + +Setup tracing at https://dagger.cloud/traces/setup. To hide set DAGGER_NO_NAG=1 diff --git a/dagql/idtui/testdata/TestTelemetry/TestGolden/viztest/typescript/nested-spans b/dagql/idtui/testdata/TestTelemetry/TestGolden/viztest/typescript/nested-spans new file mode 100644 index 00000000000..7506c853829 --- /dev/null +++ b/dagql/idtui/testdata/TestTelemetry/TestGolden/viztest/typescript/nested-spans @@ -0,0 +1,45 @@ +Expected stdout: + +done + +Expected stderr: + +✔ connect X.Xs +│ ✔ starting engine X.Xs +│ ✔ connecting to engine X.Xs +│ ✔ starting session X.Xs + +✔ load module X.Xs +│ ✔ finding module configuration X.Xs +│ ✔ initializing module X.Xs +│ ✔ inspecting module metadata X.Xs +│ ✔ loading type definitions X.Xs + +✔ parsing command line arguments X.Xs + +✔ typescript: Typescript! X.Xs +✔ .nestedSpans: String! X.Xs +│ ✔ custom span X.Xs +│ │ $ Container.from(address: "alpine:latest"): Container! X.Xs CACHED +│ │ ✔ .withExec(args: ["echo", "outer: XXXX-XX-XXTXX:XX:XX.XXXZ"]): Container! X.Xs +│ │ ┃ outer: XXXX-XX-XXTXX:XX:XX.XXXZ +│ │ ✔ .stdout: String! X.Xs +│ │ +│ │ ✔ sub span X.Xs +│ │ │ ✔ Container.withExec(args: ["echo", "sub 1: XXXX-XX-XXTXX:XX:XX.XXXZ"]): Container! X.Xs +│ │ │ ┃ sub 1: XXXX-XX-XXTXX:XX:XX.XXXZ +│ │ │ ✔ .stdout: String! X.Xs +│ │ +│ │ ✔ sub span X.Xs +│ │ │ ✔ Container.withExec(args: ["echo", "sub 2: XXXX-XX-XXTXX:XX:XX.XXXZ"]): Container! X.Xs +│ │ │ ┃ sub 2: XXXX-XX-XXTXX:XX:XX.XXXZ +│ │ │ ✔ .stdout: String! X.Xs +│ │ +│ │ ✔ another sub span X.Xs +│ │ │ ✔ sub span X.Xs +│ │ │ │ ✔ Container.withExec(args: ["echo", "im even deeper: XXXX-XX-XXTXX:XX:XX.XXXZ"]): Container! X.Xs +│ │ │ │ ┃ im even deeper: XXXX-XX-XXTXX:XX:XX.XXXZ +│ │ │ │ ✔ .stdout: String! X.Xs + + +Setup tracing at https://dagger.cloud/traces/setup. To hide set DAGGER_NO_NAG=1 diff --git a/dagql/idtui/testdata/TestTelemetry/TestGolden/viztest/typescript/nested-spans#01 b/dagql/idtui/testdata/TestTelemetry/TestGolden/viztest/typescript/nested-spans#01 new file mode 100644 index 00000000000..84487310c4d --- /dev/null +++ b/dagql/idtui/testdata/TestTelemetry/TestGolden/viztest/typescript/nested-spans#01 @@ -0,0 +1,48 @@ +Expected stderr: + +✔ connect X.Xs +│ ✔ starting engine X.Xs +│ ✔ connecting to engine X.Xs +│ ✔ starting session X.Xs + +✔ load module X.Xs +│ ✔ finding module configuration X.Xs +│ ✔ initializing module X.Xs +│ ✔ inspecting module metadata X.Xs +│ ✔ loading type definitions X.Xs + +✔ parsing command line arguments X.Xs + +✔ typescript: Typescript! X.Xs +✘ .nestedSpans(fail: true): String! X.Xs +┃ Error: oh no +! process "tsx --no-deprecation --tsconfig /src/tsconfig.json /src/src/__dagger.entrypoint.ts" did not complete successfully: exit code: 1 +│ ✘ custom span X.Xs +│ ! oh no +│ │ $ Container.from(address: "alpine:latest"): Container! X.Xs CACHED +│ │ ✔ .withExec(args: ["echo", "outer: XXXX-XX-XXTXX:XX:XX.XXXZ"]): Container! X.Xs +│ │ ┃ outer: XXXX-XX-XXTXX:XX:XX.XXXZ +│ │ ✔ .stdout: String! X.Xs +│ │ +│ │ ✔ sub span X.Xs +│ │ │ ✔ Container.withExec(args: ["echo", "sub 1: XXXX-XX-XXTXX:XX:XX.XXXZ"]): Container! X.Xs +│ │ │ ┃ sub 1: XXXX-XX-XXTXX:XX:XX.XXXZ +│ │ │ ✔ .stdout: String! X.Xs +│ │ +│ │ ✔ sub span X.Xs +│ │ │ ✔ Container.withExec(args: ["echo", "sub 2: XXXX-XX-XXTXX:XX:XX.XXXZ"]): Container! X.Xs +│ │ │ ┃ sub 2: XXXX-XX-XXTXX:XX:XX.XXXZ +│ │ │ ✔ .stdout: String! X.Xs +│ │ +│ │ ✘ another sub span X.Xs +│ │ ! oh no +│ │ │ ✘ sub span X.Xs +│ │ │ ! oh no + +Error logs: + +✘ .nestedSpans(fail: true): String! X.Xs +Error: oh no +! process "tsx --no-deprecation --tsconfig /src/tsconfig.json /src/src/__dagger.entrypoint.ts" did not complete successfully: exit code: 1 + +Setup tracing at https://dagger.cloud/traces/setup. To hide set DAGGER_NO_NAG=1 diff --git a/dagql/idtui/viztest/main.go b/dagql/idtui/viztest/main.go index 6189547bbdf..f22af2b87ab 100644 --- a/dagql/idtui/viztest/main.go +++ b/dagql/idtui/viztest/main.go @@ -159,27 +159,34 @@ func (v *Viztest) RevealAndLog(ctx context.Context) (res string, rerr error) { return res, nil } -func (v *Viztest) NestedSpans(ctx context.Context) (res string, rerr error) { +func (v *Viztest) NestedSpans(ctx context.Context, + // +default=false + fail bool, +) (res string, rerr error) { err := dag.Span("custom span").Run(ctx, func(ctx context.Context) error { - if _, err := v.Echo(ctx, "outer"); err != nil { + if _, err := v.Echo(ctx, "outer: "+time.Now().String()); err != nil { return err } if err := dag.Span("sub span").Run(ctx, func(ctx context.Context) error { - _, err := v.Echo(ctx, "sub 1") + _, err := v.Echo(ctx, "sub 1: "+time.Now().String()) return err }); err != nil { return err } if err := dag.Span("sub span").Run(ctx, func(ctx context.Context) error { - _, err := v.Echo(ctx, "sub 2") + _, err := v.Echo(ctx, "sub 2: "+time.Now().String()) return err }); err != nil { return err } return dag.Span("another sub span").Run(ctx, func(ctx context.Context) error { return dag.Span("sub span").Run(ctx, func(ctx context.Context) error { - _, err := v.Echo(ctx, "im even deeper") - return err + if fail { + return errors.New("oh no") + } else { + _, err := v.Echo(ctx, "im even deeper: "+time.Now().String()) + return err + } }) }) }) diff --git a/dagql/idtui/viztest/python/src/main/__init__.py b/dagql/idtui/viztest/python/src/main/__init__.py index d639c3d49cf..25d8b4bfe18 100644 --- a/dagql/idtui/viztest/python/src/main/__init__.py +++ b/dagql/idtui/viztest/python/src/main/__init__.py @@ -21,24 +21,22 @@ async def custom_span(self) -> str: return await self.echo(f"hello from Python! it is currently {now}") @function - async def exceptional_span(self) -> str: + async def nested_spans(self, fail: bool = False) -> str: async with dag.span("custom span"): - raise ValueError("oh no") + await self.echo(f"outer: {now}") - @function - async def nested_spans(self) -> str: - async with dag.span("custom span") as outer: - await self.echo("outer") - - async with outer.span("sub span"): - await self.echo("sub 1") + async with dag.span("sub span"): + await self.echo(f"sub 1: {now}") - async with outer.span("sub span"): - await self.echo("sub 2") + async with dag.span("sub span"): + await self.echo(f"sub 2: {now}") - async with outer.span("another sub span") as inner: - async with inner.span("sub span"): - await self.echo("im even deeper") + async with dag.span("another sub span"): + async with dag.span("sub span"): + if fail: + raise ValueError("oh no") + else: + await self.echo(f"im even deeper: {now}") return "done" diff --git a/dagql/idtui/viztest/typescript/src/index.ts b/dagql/idtui/viztest/typescript/src/index.ts index 9be25ae9f75..48e04e5cae4 100644 --- a/dagql/idtui/viztest/typescript/src/index.ts +++ b/dagql/idtui/viztest/typescript/src/index.ts @@ -63,31 +63,28 @@ export class Typescript { } @func() - async exceptionalSpan(): Promise { + async nestedSpans(fail = false): Promise { return dag.span("custom span").run(async () => { - throw new Error("oh no"); - }); - } - - @func() - async nestedSpans(): Promise { - return dag.span("custom span").run(async () => { - await this.echo("outer"); + await this.echo(`outer: ${now}`); // First sub-span await dag.span("sub span").run(async () => { - await this.echo("sub 1"); + await this.echo(`sub 1: ${now}`); }); // Second sub-span await dag.span("sub span").run(async () => { - await this.echo("sub 2"); + await this.echo(`sub 2: ${now}`); }); // Nested sub-span await dag.span("another sub span").run(async () => { await dag.span("sub span").run(async () => { - await this.echo("im even deeper"); + if (fail) { + throw new Error("oh no"); + } else { + await this.echo(`im even deeper: ${now}`); + } }); }); From 1f81fbcfda18cea208635c88b8bda96f2cb6d217 Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Fri, 10 Jan 2025 00:30:09 -0500 Subject: [PATCH 14/36] fix ts lint Signed-off-by: Alex Suraci --- .../generator/typescript/templates/src/object.ts.gtpl | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cmd/codegen/generator/typescript/templates/src/object.ts.gtpl b/cmd/codegen/generator/typescript/templates/src/object.ts.gtpl index 6c77698d0cb..c809a4badfe 100644 --- a/cmd/codegen/generator/typescript/templates/src/object.ts.gtpl +++ b/cmd/codegen/generator/typescript/templates/src/object.ts.gtpl @@ -104,8 +104,10 @@ export class {{ .Name | QueryToClient | FormatName }} extends BaseClient { {{- w let spanError: Error | undefined = undefined try { return await opentelemetry.context.with(newContext, fn, this, started) - } catch (e) { - spanError = dag.error(e.message) + } catch (e: unknown) { + if (e instanceof globalThis.Error) { + spanError = dag.error(e.message) + } throw e } finally { await started.end({ error: spanError }) From f3d437eb6403e50e520dd9e71eca1d919b4f0539 Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Fri, 10 Jan 2025 10:09:14 -0500 Subject: [PATCH 15/36] typescript: handle non-Error thrown values dunno what this would be, but shouldn't drop it on the floor Signed-off-by: Alex Suraci --- cmd/codegen/generator/typescript/templates/src/object.ts.gtpl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmd/codegen/generator/typescript/templates/src/object.ts.gtpl b/cmd/codegen/generator/typescript/templates/src/object.ts.gtpl index c809a4badfe..608c2f1d3da 100644 --- a/cmd/codegen/generator/typescript/templates/src/object.ts.gtpl +++ b/cmd/codegen/generator/typescript/templates/src/object.ts.gtpl @@ -107,6 +107,8 @@ export class {{ .Name | QueryToClient | FormatName }} extends BaseClient { {{- w } catch (e: unknown) { if (e instanceof globalThis.Error) { spanError = dag.error(e.message) + } else { + spanError = dag.error(`Unknown error: ${e}`) } throw e } finally { From 1b89a7bd1c0da3ca65078546d3d6a1ccc1008303 Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Sat, 15 Feb 2025 20:27:55 -0500 Subject: [PATCH 16/36] refactor: split Span impl out of Query Signed-off-by: Alex Suraci --- core/query.go | 79 +++++++++++++++----------------------------- core/schema/query.go | 28 ++++++++++++---- core/span.go | 59 +++++++++++++++++++++++++++++++++ 3 files changed, 106 insertions(+), 60 deletions(-) create mode 100644 core/span.go diff --git a/core/query.go b/core/query.go index 134d1cd73c9..1230d850439 100644 --- a/core/query.go +++ b/core/query.go @@ -6,6 +6,7 @@ import ( "net/http" "sync" + "dagger.io/dagger/telemetry" "github.com/containerd/containerd/content" bkcache "github.com/moby/buildkit/cache" bkclient "github.com/moby/buildkit/client" @@ -13,6 +14,8 @@ import ( "github.com/moby/buildkit/util/leaseutil" "github.com/moby/locker" "github.com/vektah/gqlparser/v2/ast" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/trace" "github.com/dagger/dagger/auth" "github.com/dagger/dagger/dagql" @@ -31,59 +34,6 @@ type Query struct { spansL *sync.Mutex } -func (q *Query) LookupSpan(spanID string) (*Span, bool) { - q.spansL.Lock() - span, found := q.spans[spanID] - q.spansL.Unlock() - return span, found -} - -func (q *Query) StoreSpan(s *Span) { - q.spansL.Lock() - q.spans[s.InternalID()] = s - q.spansL.Unlock() -} - -type Span struct { - Name string `field:"true"` - - Query *Query - - Span trace.Span -} - -func (*Span) Type() *ast.Type { - return &ast.Type{ - NamedType: "Span", - NonNull: true, - } -} - -func (*Span) TypeDescription() string { - // TODO: rename to Task and come up with a nice description - return "An OpenTelemetry span." -} - -func (s Span) Clone() *Span { - cp := &s - cp.Query = cp.Query.Clone() - return cp -} - -func (s *Span) Start(ctx context.Context) *Span { - started := s.Clone() - _, started.Span = Tracer(ctx).Start(ctx, s.Name) - started.Query.StoreSpan(started) - return started -} - -func (s *Span) InternalID() string { - if s.Span == nil { - return "" - } - return s.Span.SpanContext().SpanID().String() -} - var ErrNoCurrentModule = fmt.Errorf("no current module") // APIs from the server+session+client that are needed by core APIs @@ -215,6 +165,29 @@ func (q *Query) WithPipeline(name, desc string) *Query { return q.Clone() } +func (q *Query) StartSpan(ctx context.Context, s *Span) *Span { + started := s.Clone() + var opts []trace.SpanStartOption + if s.Actor != "" { + opts = append(opts, trace.WithAttributes(attribute.String("dagger.io/ui.actor", s.Actor))) + } + if s.Internal { + opts = append(opts, telemetry.Internal()) + } + _, started.Span = Tracer(ctx).Start(ctx, s.Name, opts...) + q.spansL.Lock() + q.spans[started.InternalID()] = started + q.spansL.Unlock() + return started +} + +func (q *Query) LookupSpan(spanID string) (*Span, bool) { + q.spansL.Lock() + span, found := q.spans[spanID] + q.spansL.Unlock() + return span, found +} + func (q *Query) NewContainer(platform Platform) *Container { return &Container{ Platform: platform, diff --git a/core/schema/query.go b/core/schema/query.go index 76c51aeef1d..68f825d9a48 100644 --- a/core/schema/query.go +++ b/core/schema/query.go @@ -77,13 +77,17 @@ func (s *querySchema) Install() { }.Install(s.srv) dagql.Fields[*core.Span]{ - dagql.NodeFunc("start", s.spanStart). - Doc(`Start a new instance of the span.`). - Impure("Creates a new span with each call."), + dagql.Func("withActor", s.spanWithActor), + + dagql.Func("withInternal", s.spanWithInternal), dagql.Func("internalId", s.spanInternalID). Doc(`Returns the internal ID of the span.`), + dagql.NodeFunc("start", s.spanStart). + Doc(`Start a new instance of the span.`). + Impure("Creates a new span with each call."), + dagql.Func("end", s.spanEnd). Doc(`End the OpenTelemetry span, with an optional error.`), }.Install(s.srv) @@ -206,10 +210,6 @@ func (s *querySchema) spanStart(ctx context.Context, parent dagql.Instance[*core return dagql.NewID[*core.Span](inst.ID()), nil } -func (s *querySchema) spanInternalID(ctx context.Context, parent *core.Span, args struct{}) (string, error) { - return parent.Span.SpanContext().SpanID().String(), nil -} - func (s *querySchema) spanEnd(ctx context.Context, parent *core.Span, args struct { Error dagql.Optional[dagql.ID[*core.Error]] }) (dagql.Nullable[core.Void], error) { @@ -227,3 +227,17 @@ func (s *querySchema) spanEnd(ctx context.Context, parent *core.Span, args struc parent.Span.End() return dagql.Null[core.Void](), nil } + +func (s *querySchema) spanInternalID(ctx context.Context, parent *core.Span, args struct{}) (string, error) { + return parent.Span.SpanContext().SpanID().String(), nil +} + +func (s *querySchema) spanWithActor(ctx context.Context, parent *core.Span, args struct { + Actor string +}) (*core.Span, error) { + return parent.WithActor(args.Actor), nil +} + +func (s *querySchema) spanWithInternal(ctx context.Context, parent *core.Span, args struct{}) (*core.Span, error) { + return parent.WithInternal(), nil +} diff --git a/core/span.go b/core/span.go new file mode 100644 index 00000000000..dbf795870ad --- /dev/null +++ b/core/span.go @@ -0,0 +1,59 @@ +package core + +import ( + "context" + + "github.com/vektah/gqlparser/v2/ast" + "go.opentelemetry.io/otel/trace" +) + +type Span struct { + Name string `field:"true" doc:"The name of the span."` + Actor string `field:"true" doc:"An optional actor to display for the span."` + Internal bool `field:"true" doc:"Indicates that the span contains details that are not important to the user in the happy path."` + + Query *Query + + Span trace.Span +} + +func (*Span) Type() *ast.Type { + return &ast.Type{ + NamedType: "Span", + NonNull: true, + } +} + +func (*Span) TypeDescription() string { + // TODO: rename to Task and come up with a nice description + return "An OpenTelemetry span." +} + +func (s Span) Clone() *Span { + cp := &s + cp.Query = cp.Query.Clone() + return cp +} + +func (s *Span) WithActor(actor string) *Span { + cp := s.Clone() + cp.Actor = actor + return cp +} + +func (s *Span) WithInternal() *Span { + cp := s.Clone() + cp.Internal = true + return cp +} + +func (s *Span) Start(ctx context.Context) *Span { + return s.Query.StartSpan(ctx, s) +} + +func (s *Span) InternalID() string { + if s.Span == nil { + return "" + } + return s.Span.SpanContext().SpanID().String() +} From ea008b3922d025080060c2ced751de6af1c6a3df Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Mon, 17 Feb 2025 15:18:05 -0500 Subject: [PATCH 17/36] support span passthrough, add reveal shorthand general idea is to keep building on Span primitive as the gateway to context propagation, and to provide a simplified dag.Reveal() API for revealing a bunch of spans without wrapping them (by using a passthrough dummy span). Signed-off-by: Alex Suraci --- core/query.go | 12 +----------- core/schema/query.go | 39 +++++++++++++++++++++++++++++++++------ core/span.go | 40 +++++++++++++++++++++++++++++++++++++--- 3 files changed, 71 insertions(+), 20 deletions(-) diff --git a/core/query.go b/core/query.go index 1230d850439..1ae5a9e9cc1 100644 --- a/core/query.go +++ b/core/query.go @@ -6,7 +6,6 @@ import ( "net/http" "sync" - "dagger.io/dagger/telemetry" "github.com/containerd/containerd/content" bkcache "github.com/moby/buildkit/cache" bkclient "github.com/moby/buildkit/client" @@ -14,8 +13,6 @@ import ( "github.com/moby/buildkit/util/leaseutil" "github.com/moby/locker" "github.com/vektah/gqlparser/v2/ast" - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/trace" "github.com/dagger/dagger/auth" "github.com/dagger/dagger/dagql" @@ -167,14 +164,7 @@ func (q *Query) WithPipeline(name, desc string) *Query { func (q *Query) StartSpan(ctx context.Context, s *Span) *Span { started := s.Clone() - var opts []trace.SpanStartOption - if s.Actor != "" { - opts = append(opts, trace.WithAttributes(attribute.String("dagger.io/ui.actor", s.Actor))) - } - if s.Internal { - opts = append(opts, telemetry.Internal()) - } - _, started.Span = Tracer(ctx).Start(ctx, s.Name, opts...) + _, started.Span = Tracer(ctx).Start(ctx, s.Name, s.Opts()...) q.spansL.Lock() q.spans[started.InternalID()] = started q.spansL.Unlock() diff --git a/core/schema/query.go b/core/schema/query.go index 68f825d9a48..bf238913c0e 100644 --- a/core/schema/query.go +++ b/core/schema/query.go @@ -58,6 +58,9 @@ func (s *querySchema) Install() { dagql.Fields[Label]{}.Install(s.srv) dagql.Fields[*core.Query]{ + dagql.Func("reveal", s.reveal). + Doc(`Returns a span that reveals its child spans and hides itself.`), + dagql.Func("pipeline", s.pipeline). View(BeforeVersion("v0.13.0")). Deprecated("Explicit pipeline creation is now a no-op"). @@ -73,20 +76,28 @@ func (s *querySchema) Install() { dagql.Func("span", s.span). Doc(`Create a new OpenTelemetry span.`). - ArgDoc("name", "Name of the span."), + Args( + dagql.Arg("name").Doc("Name of the span."), + ), }.Install(s.srv) dagql.Fields[*core.Span]{ dagql.Func("withActor", s.spanWithActor), - dagql.Func("withInternal", s.spanWithInternal), + dagql.Func("withInternal", s.spanWithInternal). + Doc(`Returns a new span with the internal attribute set to true.`), + + dagql.Func("withPassthrough", s.spanWithPassthrough). + Doc(`Returns a new span with the passthrough attribute set to true.`), + + dagql.Func("withReveal", s.spanWithReveal). + Doc(`Returns a new span with the reveal attribute set to true.`), dagql.Func("internalId", s.spanInternalID). Doc(`Returns the internal ID of the span.`), - dagql.NodeFunc("start", s.spanStart). - Doc(`Start a new instance of the span.`). - Impure("Creates a new span with each call."), + dagql.NodeFuncWithCacheKey("start", s.spanStart, dagql.CachePerCall). + Doc(`Start a new instance of the span.`), dagql.Func("end", s.spanEnd). Doc(`End the OpenTelemetry span, with an optional error.`), @@ -193,12 +204,20 @@ func (s *querySchema) span(ctx context.Context, parent *core.Query, args struct }, nil } +func (s *querySchema) reveal(ctx context.Context, parent *core.Query, args struct{}) (*core.Span, error) { + return &core.Span{ + Name: "reveal", + Reveal: true, + Passthrough: true, + Query: parent, + }, nil +} + func (s *querySchema) spanStart(ctx context.Context, parent dagql.Instance[*core.Span], args struct{}) (dagql.ID[*core.Span], error) { started := parent.Self.Start(ctx) var inst dagql.Instance[*core.Span] err := s.srv.Select(ctx, s.srv.Root(), &inst, dagql.Selector{ Field: "span", - Pure: true, Args: []dagql.NamedInput{ {Name: "name", Value: dagql.NewString(started.Name)}, {Name: "key", Value: dagql.NewString(started.InternalID())}, @@ -241,3 +260,11 @@ func (s *querySchema) spanWithActor(ctx context.Context, parent *core.Span, args func (s *querySchema) spanWithInternal(ctx context.Context, parent *core.Span, args struct{}) (*core.Span, error) { return parent.WithInternal(), nil } + +func (s *querySchema) spanWithReveal(ctx context.Context, parent *core.Span, args struct{}) (*core.Span, error) { + return parent.WithReveal(), nil +} + +func (s *querySchema) spanWithPassthrough(ctx context.Context, parent *core.Span, args struct{}) (*core.Span, error) { + return parent.WithPassthrough(), nil +} diff --git a/core/span.go b/core/span.go index dbf795870ad..00f7131725e 100644 --- a/core/span.go +++ b/core/span.go @@ -3,14 +3,19 @@ package core import ( "context" + "dagger.io/dagger/telemetry" "github.com/vektah/gqlparser/v2/ast" + "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/trace" ) type Span struct { - Name string `field:"true" doc:"The name of the span."` - Actor string `field:"true" doc:"An optional actor to display for the span."` - Internal bool `field:"true" doc:"Indicates that the span contains details that are not important to the user in the happy path."` + Name string `field:"true" doc:"The name of the span."` + + Actor string + Internal bool + Reveal bool + Passthrough bool Query *Query @@ -47,6 +52,18 @@ func (s *Span) WithInternal() *Span { return cp } +func (s *Span) WithPassthrough() *Span { + cp := s.Clone() + cp.Passthrough = true + return cp +} + +func (s *Span) WithReveal() *Span { + cp := s.Clone() + cp.Reveal = true + return cp +} + func (s *Span) Start(ctx context.Context) *Span { return s.Query.StartSpan(ctx, s) } @@ -57,3 +74,20 @@ func (s *Span) InternalID() string { } return s.Span.SpanContext().SpanID().String() } + +func (s *Span) Opts() []trace.SpanStartOption { + var opts []trace.SpanStartOption + if s.Actor != "" { + opts = append(opts, trace.WithAttributes(attribute.String("dagger.io/ui.actor", s.Actor))) + } + if s.Internal { + opts = append(opts, telemetry.Internal()) + } + if s.Reveal { + opts = append(opts, trace.WithAttributes(attribute.Bool(telemetry.UIRevealAttr, true))) + } + if s.Passthrough { + opts = append(opts, trace.WithAttributes(attribute.Bool(telemetry.UIPassthroughAttr, true))) + } + return opts +} From ae07782d7ab7e4a3bf35d4bec4d779a671bd7d9c Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Tue, 24 Jun 2025 21:56:56 -0400 Subject: [PATCH 18/36] sdk/typescript: add opentelemetry dependency Signed-off-by: Alex Suraci --- sdk/typescript/runtime/template/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sdk/typescript/runtime/template/package.json b/sdk/typescript/runtime/template/package.json index cf9966abab6..4a443964dfe 100644 --- a/sdk/typescript/runtime/template/package.json +++ b/sdk/typescript/runtime/template/package.json @@ -1,6 +1,7 @@ { "type": "module", "dependencies": { - "typescript": "^5.5.4" + "typescript": "^5.5.4", + "@opentelemetry/api": "^1.9.0" } } From c6a7964e9c64d9e78af52ac18d0336d84022d71d Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Tue, 24 Jun 2025 21:57:13 -0400 Subject: [PATCH 19/36] regen Signed-off-by: Alex Suraci --- docs/docs-graphql/schema.graphqls | 48 + docs/static/api/reference/index.html | 251 +++++ sdk/elixir/lib/dagger/gen/client.ex | 45 + sdk/elixir/lib/dagger/gen/span.ex | 150 +++ sdk/elixir/lib/dagger/gen/span_id.ex | 10 + sdk/go/dag/dag.gen.go | 18 + sdk/go/dagger.gen.go | 1364 ++++++++++++++++++------- sdk/php/generated/Client.php | 32 + sdk/php/generated/Span.php | 97 ++ sdk/php/generated/SpanId.php | 16 + sdk/python/src/dagger/client/gen.py | 227 ++++ sdk/rust/crates/dagger-sdk/src/gen.rs | 186 ++++ sdk/typescript/src/api/client.gen.ts | 225 ++++ 13 files changed, 2298 insertions(+), 371 deletions(-) create mode 100644 sdk/elixir/lib/dagger/gen/span.ex create mode 100644 sdk/elixir/lib/dagger/gen/span_id.ex create mode 100644 sdk/php/generated/Span.php create mode 100644 sdk/php/generated/SpanId.php diff --git a/docs/docs-graphql/schema.graphqls b/docs/docs-graphql/schema.graphqls index 0fb40e713ae..6c003e5af12 100644 --- a/docs/docs-graphql/schema.graphqls +++ b/docs/docs-graphql/schema.graphqls @@ -3543,6 +3543,9 @@ type Query { """Load a SourceMap from its ID.""" loadSourceMapFromID(id: SourceMapID!): SourceMap! + """Load a Span from its ID.""" + loadSpanFromID(id: SpanID!): Span! + """Load a Terminal from its ID.""" loadTerminalFromID(id: TerminalID!): Terminal! @@ -3579,6 +3582,9 @@ type Query { requireKind: ModuleSourceKind ): ModuleSource! + """Returns a span that reveals its child spans and hides itself.""" + reveal: Span! + """Creates a new secret.""" secret( """The URI of the secret store""" @@ -3625,6 +3631,14 @@ type Query { column: Int! ): SourceMap! + """Create a new OpenTelemetry span.""" + span( + """Name of the span.""" + name: String! + + key: String = "" + ): Span! + """Create a new TypeDef.""" typeDef: TypeDef! @@ -3808,6 +3822,40 @@ The `SourceMapID` scalar type represents an identifier for an object of type Sou """ scalar SourceMapID +"""An OpenTelemetry span.""" +type Span { + """End the OpenTelemetry span, with an optional error.""" + end(error: ErrorID): Void + + """A unique identifier for this Span.""" + id: SpanID! + + """Returns the internal ID of the span.""" + internalId: String! + + """The name of the span.""" + name: String! + + """Start a new instance of the span.""" + start: SpanID! + + withActor(actor: String!): Span! + + """Returns a new span with the internal attribute set to true.""" + withInternal: Span! + + """Returns a new span with the passthrough attribute set to true.""" + withPassthrough: Span! + + """Returns a new span with the reveal attribute set to true.""" + withReveal: Span! +} + +""" +The `SpanID` scalar type represents an identifier for an object of type Span. +""" +scalar SpanID + """An interactive terminal that clients can connect to.""" type Terminal { """A unique identifier for this Terminal.""" diff --git a/docs/static/api/reference/index.html b/docs/static/api/reference/index.html index 6ed4587abc6..788c62f926a 100644 --- a/docs/static/api/reference/index.html +++ b/docs/static/api/reference/index.html @@ -89,13 +89,16 @@
  • loadServiceFromID
  • loadSocketFromID
  • loadSourceMapFromID
  • +
  • loadSpanFromID
  • loadTerminalFromID
  • loadTypeDefFromID
  • module
  • moduleSource
  • +
  • reveal
  • secret
  • setSecret
  • sourceMap
  • +
  • span
  • typeDef
  • version
  • @@ -202,6 +205,8 @@
  • SocketID
  • SourceMap
  • SourceMapID
  • +
  • Span
  • +
  • SpanID
  • String
  • Terminal
  • TerminalID
  • @@ -3474,6 +3479,59 @@
    Example
    +
    +
    + Queries +
    +

    + loadSpanFromID +

    +
    +
    +
    +
    Description
    +

    Load a Span from its ID.

    +
    +
    +
    +
    +
    +
    +
    Type
    +

    + Span! +

    +
    +
    +
    Arguments
    + + + + + + + + + + + + + +
    NameDescription
    + id - SpanID! + +
    +
    +
    +
    +
    +
    +
    +
    Example
    +
    +
    +
    +
    Queries @@ -3689,6 +3747,39 @@
    Example
    +
    +
    + Queries +
    +

    + reveal +

    +
    +
    +
    +
    Description
    +

    Returns a span that reveals its child spans and hides itself.

    +
    +
    +
    +
    +
    +
    +
    Type
    +

    + Span! +

    +
    +
    +
    +
    +
    +
    +
    Example
    +
    +
    +
    +
    Queries @@ -3880,6 +3971,64 @@
    Example
    +
    +
    + Queries +
    +

    + span +

    +
    +
    +
    +
    Description
    +

    Create a new OpenTelemetry span.

    +
    +
    +
    +
    +
    +
    +
    Type
    +

    + Span! +

    +
    +
    +
    Arguments
    + + + + + + + + + + + + + + + + + +
    NameDescription
    + name - String! + Name of the span.
    + key - String + Default = ""
    +
    +
    +
    +
    +
    +
    +
    Example
    +
    +
    +
    +
    Queries @@ -10926,6 +11075,108 @@
    Description
    +
    +
    + Types +
    +

    Span

    +
    +
    +
    +
    Description
    +

    An OpenTelemetry span.

    +
    +
    +
    Fields
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field NameDescription
    end - Void End the OpenTelemetry span, with an optional error.
    +
    +
    Arguments
    +
    +
    +
    error - ErrorID
    +
    +
    +
    +
    id - SpanID! A unique identifier for this Span.
    internalId - String! Returns the internal ID of the span.
    name - String! The name of the span.
    start - SpanID! Start a new instance of the span.
    withActor - Span! +
    +
    +
    Arguments
    +
    +
    +
    actor - String!
    +
    +
    +
    +
    withInternal - Span! Returns a new span with the internal attribute set to true.
    withPassthrough - Span! Returns a new span with the passthrough attribute set to true.
    withReveal - Span! Returns a new span with the reveal attribute set to true.
    +
    +
    +
    +
    +
    +
    + Types +
    +

    SpanID

    +
    +
    +
    +
    Description
    +

    The SpanID scalar type represents an identifier for an object of type Span.

    +
    +
    +
    +
    Types diff --git a/sdk/elixir/lib/dagger/gen/client.ex b/sdk/elixir/lib/dagger/gen/client.ex index 541d37a61e1..5d03c1a4c9f 100644 --- a/sdk/elixir/lib/dagger/gen/client.ex +++ b/sdk/elixir/lib/dagger/gen/client.ex @@ -936,6 +936,20 @@ defmodule Dagger.Client do } end + @doc """ + Load a Span from its ID. + """ + @spec load_span_from_id(t(), Dagger.SpanID.t()) :: Dagger.Span.t() + def load_span_from_id(%__MODULE__{} = client, id) do + query_builder = + client.query_builder |> QB.select("loadSpanFromID") |> QB.put_arg("id", id) + + %Dagger.Span{ + query_builder: query_builder, + client: client.client + } + end + @doc """ Load a Terminal from its ID. """ @@ -1003,6 +1017,20 @@ defmodule Dagger.Client do } end + @doc """ + Returns a span that reveals its child spans and hides itself. + """ + @spec reveal(t()) :: Dagger.Span.t() + def reveal(%__MODULE__{} = client) do + query_builder = + client.query_builder |> QB.select("reveal") + + %Dagger.Span{ + query_builder: query_builder, + client: client.client + } + end + @doc """ Creates a new secret. """ @@ -1057,6 +1085,23 @@ defmodule Dagger.Client do } end + @doc """ + Create a new OpenTelemetry span. + """ + @spec span(t(), String.t(), [{:key, String.t() | nil}]) :: Dagger.Span.t() + def span(%__MODULE__{} = client, name, optional_args \\ []) do + query_builder = + client.query_builder + |> QB.select("span") + |> QB.put_arg("name", name) + |> QB.maybe_put_arg("key", optional_args[:key]) + + %Dagger.Span{ + query_builder: query_builder, + client: client.client + } + end + @doc """ Create a new TypeDef. """ diff --git a/sdk/elixir/lib/dagger/gen/span.ex b/sdk/elixir/lib/dagger/gen/span.ex new file mode 100644 index 00000000000..dd606ddec0a --- /dev/null +++ b/sdk/elixir/lib/dagger/gen/span.ex @@ -0,0 +1,150 @@ +# This file generated by `dagger_codegen`. Please DO NOT EDIT. +defmodule Dagger.Span do + @moduledoc """ + An OpenTelemetry span. + """ + + use Dagger.Core.Base, kind: :object, name: "Span" + + alias Dagger.Core.Client + alias Dagger.Core.QueryBuilder, as: QB + + @derive Dagger.ID + + defstruct [:query_builder, :client] + + @type t() :: %__MODULE__{} + + @doc """ + End the OpenTelemetry span, with an optional error. + """ + @spec end_(t(), [{:error, Dagger.ErrorID.t() | nil}]) :: :ok | {:error, term()} + def end_(%__MODULE__{} = span, optional_args \\ []) do + query_builder = + span.query_builder |> QB.select("end") |> QB.maybe_put_arg("error", optional_args[:error]) + + case Client.execute(span.client, query_builder) do + {:ok, _} -> :ok + error -> error + end + end + + @doc """ + A unique identifier for this Span. + """ + @spec id(t()) :: {:ok, Dagger.SpanID.t()} | {:error, term()} + def id(%__MODULE__{} = span) do + query_builder = + span.query_builder |> QB.select("id") + + Client.execute(span.client, query_builder) + end + + @doc """ + Returns the internal ID of the span. + """ + @spec internal_id(t()) :: {:ok, String.t()} | {:error, term()} + def internal_id(%__MODULE__{} = span) do + query_builder = + span.query_builder |> QB.select("internalId") + + Client.execute(span.client, query_builder) + end + + @doc """ + The name of the span. + """ + @spec name(t()) :: {:ok, String.t()} | {:error, term()} + def name(%__MODULE__{} = span) do + query_builder = + span.query_builder |> QB.select("name") + + Client.execute(span.client, query_builder) + end + + @doc """ + Start a new instance of the span. + """ + @spec start(t()) :: {:ok, Dagger.Span.t()} | {:error, term()} + def start(%__MODULE__{} = span) do + query_builder = + span.query_builder |> QB.select("start") + + with {:ok, id} <- Client.execute(span.client, query_builder) do + {:ok, + %Dagger.Span{ + query_builder: + QB.query() + |> QB.select("loadSpanFromID") + |> QB.put_arg("id", id), + client: span.client + }} + end + end + + @spec with_actor(t(), String.t()) :: Dagger.Span.t() + def with_actor(%__MODULE__{} = span, actor) do + query_builder = + span.query_builder |> QB.select("withActor") |> QB.put_arg("actor", actor) + + %Dagger.Span{ + query_builder: query_builder, + client: span.client + } + end + + @doc """ + Returns a new span with the internal attribute set to true. + """ + @spec with_internal(t()) :: Dagger.Span.t() + def with_internal(%__MODULE__{} = span) do + query_builder = + span.query_builder |> QB.select("withInternal") + + %Dagger.Span{ + query_builder: query_builder, + client: span.client + } + end + + @doc """ + Returns a new span with the passthrough attribute set to true. + """ + @spec with_passthrough(t()) :: Dagger.Span.t() + def with_passthrough(%__MODULE__{} = span) do + query_builder = + span.query_builder |> QB.select("withPassthrough") + + %Dagger.Span{ + query_builder: query_builder, + client: span.client + } + end + + @doc """ + Returns a new span with the reveal attribute set to true. + """ + @spec with_reveal(t()) :: Dagger.Span.t() + def with_reveal(%__MODULE__{} = span) do + query_builder = + span.query_builder |> QB.select("withReveal") + + %Dagger.Span{ + query_builder: query_builder, + client: span.client + } + end +end + +defimpl Jason.Encoder, for: Dagger.Span do + def encode(span, opts) do + {:ok, id} = Dagger.Span.id(span) + Jason.Encode.string(id, opts) + end +end + +defimpl Nestru.Decoder, for: Dagger.Span do + def decode_fields_hint(_struct, _context, id) do + {:ok, Dagger.Client.load_span_from_id(Dagger.Global.dag(), id)} + end +end diff --git a/sdk/elixir/lib/dagger/gen/span_id.ex b/sdk/elixir/lib/dagger/gen/span_id.ex new file mode 100644 index 00000000000..5a1b9aee271 --- /dev/null +++ b/sdk/elixir/lib/dagger/gen/span_id.ex @@ -0,0 +1,10 @@ +# This file generated by `dagger_codegen`. Please DO NOT EDIT. +defmodule Dagger.SpanID do + @moduledoc """ + The `SpanID` scalar type represents an identifier for an object of type Span. + """ + + use Dagger.Core.Base, kind: :scalar, name: "SpanID" + + @type t() :: String.t() +end diff --git a/sdk/go/dag/dag.gen.go b/sdk/go/dag/dag.gen.go index 58ebcef1e20..0a470ae76b3 100644 --- a/sdk/go/dag/dag.gen.go +++ b/sdk/go/dag/dag.gen.go @@ -420,6 +420,12 @@ func LoadSourceMapFromID(id dagger.SourceMapID) *dagger.SourceMap { return client.LoadSourceMapFromID(id) } +// Load a Span from its ID. +func LoadSpanFromID(id dagger.SpanID) *dagger.Span { + client := initClient() + return client.LoadSpanFromID(id) +} + // Load a Terminal from its ID. func LoadTerminalFromID(id dagger.TerminalID) *dagger.Terminal { client := initClient() @@ -444,6 +450,12 @@ func ModuleSource(refString string, opts ...dagger.ModuleSourceOpts) *dagger.Mod return client.ModuleSource(refString, opts...) } +// Returns a span that reveals its child spans and hides itself. +func Reveal() *dagger.Span { + client := initClient() + return client.Reveal() +} + // Creates a new secret. func Secret(uri string, opts ...dagger.SecretOpts) *dagger.Secret { client := initClient() @@ -464,6 +476,12 @@ func SourceMap(filename string, line int, column int) *dagger.SourceMap { return client.SourceMap(filename, line, column) } +// Create a new OpenTelemetry span. +func Span(name string, opts ...dagger.SpanOpts) *dagger.Span { + client := initClient() + return client.Span(name, opts...) +} + // Create a new TypeDef. func TypeDef() *dagger.TypeDef { client := initClient() diff --git a/sdk/go/dagger.gen.go b/sdk/go/dagger.gen.go index deba1867e0d..cd3cafefafa 100644 --- a/sdk/go/dagger.gen.go +++ b/sdk/go/dagger.gen.go @@ -10,6 +10,7 @@ import ( "reflect" "dagger.io/dagger/querybuilder" + "github.com/Khan/genqlient/graphql" "github.com/vektah/gqlparser/v2/gqlerror" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/trace" @@ -265,6 +266,9 @@ type SocketID string // The `SourceMapID` scalar type represents an identifier for an object of type SourceMap. type SourceMapID string +// The `SpanID` scalar type represents an identifier for an object of type Span. +type SpanID string + // The `TerminalID` scalar type represents an identifier for an object of type Terminal. type TerminalID string @@ -307,7 +311,8 @@ type PortForward struct { } type Binding struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client asString *string digest *string @@ -319,7 +324,8 @@ type Binding struct { func (r *Binding) WithGraphQLQuery(q *querybuilder.Selection) *Binding { return &Binding{ - query: q, + query: q, + client: r.client, } } @@ -328,7 +334,8 @@ func (r *Binding) AsCacheVolume() *CacheVolume { q := r.query.Select("asCacheVolume") return &CacheVolume{ - query: q, + query: q, + client: r.client, } } @@ -337,7 +344,8 @@ func (r *Binding) AsCloud() *Cloud { q := r.query.Select("asCloud") return &Cloud{ - query: q, + query: q, + client: r.client, } } @@ -346,7 +354,8 @@ func (r *Binding) AsContainer() *Container { q := r.query.Select("asContainer") return &Container{ - query: q, + query: q, + client: r.client, } } @@ -355,7 +364,8 @@ func (r *Binding) AsDirectory() *Directory { q := r.query.Select("asDirectory") return &Directory{ - query: q, + query: q, + client: r.client, } } @@ -364,7 +374,8 @@ func (r *Binding) AsEnv() *Env { q := r.query.Select("asEnv") return &Env{ - query: q, + query: q, + client: r.client, } } @@ -373,7 +384,8 @@ func (r *Binding) AsFile() *File { q := r.query.Select("asFile") return &File{ - query: q, + query: q, + client: r.client, } } @@ -382,7 +394,8 @@ func (r *Binding) AsGitRef() *GitRef { q := r.query.Select("asGitRef") return &GitRef{ - query: q, + query: q, + client: r.client, } } @@ -391,7 +404,8 @@ func (r *Binding) AsGitRepository() *GitRepository { q := r.query.Select("asGitRepository") return &GitRepository{ - query: q, + query: q, + client: r.client, } } @@ -400,7 +414,8 @@ func (r *Binding) AsLLM() *LLM { q := r.query.Select("asLLM") return &LLM{ - query: q, + query: q, + client: r.client, } } @@ -409,7 +424,8 @@ func (r *Binding) AsModule() *Module { q := r.query.Select("asModule") return &Module{ - query: q, + query: q, + client: r.client, } } @@ -418,7 +434,8 @@ func (r *Binding) AsModuleConfigClient() *ModuleConfigClient { q := r.query.Select("asModuleConfigClient") return &ModuleConfigClient{ - query: q, + query: q, + client: r.client, } } @@ -427,7 +444,8 @@ func (r *Binding) AsModuleSource() *ModuleSource { q := r.query.Select("asModuleSource") return &ModuleSource{ - query: q, + query: q, + client: r.client, } } @@ -436,7 +454,8 @@ func (r *Binding) AsSecret() *Secret { q := r.query.Select("asSecret") return &Secret{ - query: q, + query: q, + client: r.client, } } @@ -445,7 +464,8 @@ func (r *Binding) AsService() *Service { q := r.query.Select("asService") return &Service{ - query: q, + query: q, + client: r.client, } } @@ -454,7 +474,8 @@ func (r *Binding) AsSocket() *Socket { q := r.query.Select("asSocket") return &Socket{ - query: q, + query: q, + client: r.client, } } @@ -565,14 +586,16 @@ func (r *Binding) TypeName(ctx context.Context) (string, error) { // A directory whose contents persist across runs. type CacheVolume struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client id *CacheVolumeID } func (r *CacheVolume) WithGraphQLQuery(q *querybuilder.Selection) *CacheVolume { return &CacheVolume{ - query: q, + query: q, + client: r.client, } } @@ -618,7 +641,8 @@ func (r *CacheVolume) MarshalJSON() ([]byte, error) { // Dagger Cloud configuration and state type Cloud struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client id *CloudID traceURL *string @@ -626,7 +650,8 @@ type Cloud struct { func (r *Cloud) WithGraphQLQuery(q *querybuilder.Selection) *Cloud { return &Cloud{ - query: q, + query: q, + client: r.client, } } @@ -685,7 +710,8 @@ func (r *Cloud) TraceURL(ctx context.Context) (string, error) { // An OCI-compatible container, also known as a Docker container. type Container struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client envVariable *string exitCode *int @@ -713,7 +739,8 @@ func (r *Container) With(f WithContainerFunc) *Container { func (r *Container) WithGraphQLQuery(q *querybuilder.Selection) *Container { return &Container{ - query: q, + query: q, + client: r.client, } } @@ -770,7 +797,8 @@ func (r *Container) AsService(opts ...ContainerAsServiceOpts) *Service { } return &Service{ - query: q, + query: q, + client: r.client, } } @@ -811,7 +839,8 @@ func (r *Container) AsTarball(opts ...ContainerAsTarballOpts) *File { } return &File{ - query: q, + query: q, + client: r.client, } } @@ -866,7 +895,8 @@ func (r *Container) Build(context *Directory, opts ...ContainerBuildOpts) *Conta q = q.Arg("context", context) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -900,7 +930,8 @@ func (r *Container) Directory(path string, opts ...ContainerDirectoryOpts) *Dire q = q.Arg("path", path) return &Directory{ - query: q, + query: q, + client: r.client, } } @@ -985,7 +1016,8 @@ func (r *Container) ExperimentalWithAllGPUs() *Container { q := r.query.Select("experimentalWithAllGPUs") return &Container{ - query: q, + query: q, + client: r.client, } } @@ -999,7 +1031,8 @@ func (r *Container) ExperimentalWithGPU(devices []string) *Container { q = q.Arg("devices", devices) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -1112,7 +1145,8 @@ func (r *Container) File(path string, opts ...ContainerFileOpts) *File { q = q.Arg("path", path) return &File{ - query: q, + query: q, + client: r.client, } } @@ -1122,7 +1156,8 @@ func (r *Container) From(address string) *Container { q = q.Arg("address", address) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -1198,7 +1233,8 @@ func (r *Container) Import(source *File, opts ...ContainerImportOpts) *Container q = q.Arg("source", source) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -1325,7 +1361,8 @@ func (r *Container) Rootfs() *Directory { q := r.query.Select("rootfs") return &Directory{ - query: q, + query: q, + client: r.client, } } @@ -1403,7 +1440,8 @@ func (r *Container) Terminal(opts ...ContainerTerminalOpts) *Container { } return &Container{ - query: q, + query: q, + client: r.client, } } @@ -1499,7 +1537,8 @@ func (r *Container) WithAnnotation(name string, value string) *Container { q = q.Arg("value", value) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -1509,7 +1548,8 @@ func (r *Container) WithDefaultArgs(args []string) *Container { q = q.Arg("args", args) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -1537,7 +1577,8 @@ func (r *Container) WithDefaultTerminalCmd(args []string, opts ...ContainerWithD q = q.Arg("args", args) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -1583,7 +1624,8 @@ func (r *Container) WithDirectory(path string, directory *Directory, opts ...Con q = q.Arg("directory", directory) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -1605,7 +1647,8 @@ func (r *Container) WithEntrypoint(args []string, opts ...ContainerWithEntrypoin q = q.Arg("args", args) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -1628,7 +1671,8 @@ func (r *Container) WithEnvVariable(name string, value string, opts ...Container q = q.Arg("value", value) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -1704,7 +1748,8 @@ func (r *Container) WithExec(args []string, opts ...ContainerWithExecOpts) *Cont q = q.Arg("args", args) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -1746,7 +1791,8 @@ func (r *Container) WithExposedPort(port int, opts ...ContainerWithExposedPortOp q = q.Arg("port", port) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -1786,7 +1832,8 @@ func (r *Container) WithFile(path string, source *File, opts ...ContainerWithFil q = q.Arg("source", source) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -1825,7 +1872,8 @@ func (r *Container) WithFiles(path string, sources []*File, opts ...ContainerWit q = q.Arg("sources", sources) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -1836,7 +1884,8 @@ func (r *Container) WithLabel(name string, value string) *Container { q = q.Arg("value", value) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -1886,7 +1935,8 @@ func (r *Container) WithMountedCache(path string, cache *CacheVolume, opts ...Co q = q.Arg("cache", cache) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -1920,7 +1970,8 @@ func (r *Container) WithMountedDirectory(path string, source *Directory, opts .. q = q.Arg("source", source) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -1954,7 +2005,8 @@ func (r *Container) WithMountedFile(path string, source *File, opts ...Container q = q.Arg("source", source) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -1998,7 +2050,8 @@ func (r *Container) WithMountedSecret(path string, source *Secret, opts ...Conta q = q.Arg("source", source) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -2026,7 +2079,8 @@ func (r *Container) WithMountedTemp(path string, opts ...ContainerWithMountedTem q = q.Arg("path", path) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -2067,7 +2121,8 @@ func (r *Container) WithNewFile(path string, contents string, opts ...ContainerW q = q.Arg("contents", contents) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -2080,7 +2135,8 @@ func (r *Container) WithRegistryAuth(address string, username string, secret *Se q = q.Arg("secret", secret) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -2091,7 +2147,8 @@ func (r *Container) WithRootfs(directory *Directory) *Container { q = q.Arg("directory", directory) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -2103,7 +2160,8 @@ func (r *Container) WithSecretVariable(name string, secret *Secret) *Container { q = q.Arg("secret", secret) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -2121,7 +2179,8 @@ func (r *Container) WithServiceBinding(alias string, service *Service) *Containe q = q.Arg("service", service) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -2144,7 +2203,8 @@ func (r *Container) WithSymlink(target string, linkName string, opts ...Containe q = q.Arg("linkName", linkName) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -2178,7 +2238,8 @@ func (r *Container) WithUnixSocket(path string, source *Socket, opts ...Containe q = q.Arg("source", source) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -2188,7 +2249,8 @@ func (r *Container) WithUser(name string) *Container { q = q.Arg("name", name) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -2210,7 +2272,8 @@ func (r *Container) WithWorkdir(path string, opts ...ContainerWithWorkdirOpts) * q = q.Arg("path", path) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -2220,7 +2283,8 @@ func (r *Container) WithoutAnnotation(name string) *Container { q = q.Arg("name", name) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -2229,7 +2293,8 @@ func (r *Container) WithoutDefaultArgs() *Container { q := r.query.Select("withoutDefaultArgs") return &Container{ - query: q, + query: q, + client: r.client, } } @@ -2251,7 +2316,8 @@ func (r *Container) WithoutDirectory(path string, opts ...ContainerWithoutDirect q = q.Arg("path", path) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -2272,7 +2338,8 @@ func (r *Container) WithoutEntrypoint(opts ...ContainerWithoutEntrypointOpts) *C } return &Container{ - query: q, + query: q, + client: r.client, } } @@ -2282,7 +2349,8 @@ func (r *Container) WithoutEnvVariable(name string) *Container { q = q.Arg("name", name) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -2306,7 +2374,8 @@ func (r *Container) WithoutExposedPort(port int, opts ...ContainerWithoutExposed q = q.Arg("port", port) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -2328,7 +2397,8 @@ func (r *Container) WithoutFile(path string, opts ...ContainerWithoutFileOpts) * q = q.Arg("path", path) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -2350,7 +2420,8 @@ func (r *Container) WithoutFiles(paths []string, opts ...ContainerWithoutFilesOp q = q.Arg("paths", paths) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -2360,7 +2431,8 @@ func (r *Container) WithoutLabel(name string) *Container { q = q.Arg("name", name) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -2382,7 +2454,8 @@ func (r *Container) WithoutMount(path string, opts ...ContainerWithoutMountOpts) q = q.Arg("path", path) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -2392,7 +2465,8 @@ func (r *Container) WithoutRegistryAuth(address string) *Container { q = q.Arg("address", address) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -2402,7 +2476,8 @@ func (r *Container) WithoutSecretVariable(name string) *Container { q = q.Arg("name", name) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -2424,7 +2499,8 @@ func (r *Container) WithoutUnixSocket(path string, opts ...ContainerWithoutUnixS q = q.Arg("path", path) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -2435,7 +2511,8 @@ func (r *Container) WithoutUser() *Container { q := r.query.Select("withoutUser") return &Container{ - query: q, + query: q, + client: r.client, } } @@ -2446,7 +2523,8 @@ func (r *Container) WithoutWorkdir() *Container { q := r.query.Select("withoutWorkdir") return &Container{ - query: q, + query: q, + client: r.client, } } @@ -2465,7 +2543,8 @@ func (r *Container) Workdir(ctx context.Context) (string, error) { // Reflective module API provided to functions at runtime. type CurrentModule struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client id *CurrentModuleID name *string @@ -2473,7 +2552,8 @@ type CurrentModule struct { func (r *CurrentModule) WithGraphQLQuery(q *querybuilder.Selection) *CurrentModule { return &CurrentModule{ - query: q, + query: q, + client: r.client, } } @@ -2535,7 +2615,8 @@ func (r *CurrentModule) Source() *Directory { q := r.query.Select("source") return &Directory{ - query: q, + query: q, + client: r.client, } } @@ -2563,7 +2644,8 @@ func (r *CurrentModule) Workdir(path string, opts ...CurrentModuleWorkdirOpts) * q = q.Arg("path", path) return &Directory{ - query: q, + query: q, + client: r.client, } } @@ -2573,13 +2655,15 @@ func (r *CurrentModule) WorkdirFile(path string) *File { q = q.Arg("path", path) return &File{ - query: q, + query: q, + client: r.client, } } // A directory. type Directory struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client digest *string export *string @@ -2598,7 +2682,8 @@ func (r *Directory) With(f WithDirectoryFunc) *Directory { func (r *Directory) WithGraphQLQuery(q *querybuilder.Selection) *Directory { return &Directory{ - query: q, + query: q, + client: r.client, } } @@ -2607,7 +2692,8 @@ func (r *Directory) AsGit() *GitRepository { q := r.query.Select("asGit") return &GitRepository{ - query: q, + query: q, + client: r.client, } } @@ -2632,7 +2718,8 @@ func (r *Directory) AsModule(opts ...DirectoryAsModuleOpts) *Module { } return &Module{ - query: q, + query: q, + client: r.client, } } @@ -2657,7 +2744,8 @@ func (r *Directory) AsModuleSource(opts ...DirectoryAsModuleSourceOpts) *ModuleS } return &ModuleSource{ - query: q, + query: q, + client: r.client, } } @@ -2668,7 +2756,8 @@ func (r *Directory) Diff(other *Directory) *Directory { q = q.Arg("other", other) return &Directory{ - query: q, + query: q, + client: r.client, } } @@ -2691,7 +2780,8 @@ func (r *Directory) Directory(path string) *Directory { q = q.Arg("path", path) return &Directory{ - query: q, + query: q, + client: r.client, } } @@ -2748,7 +2838,8 @@ func (r *Directory) DockerBuild(opts ...DirectoryDockerBuildOpts) *Container { } return &Container{ - query: q, + query: q, + client: r.client, } } @@ -2806,7 +2897,8 @@ func (r *Directory) File(path string) *File { q = q.Arg("path", path) return &File{ - query: q, + query: q, + client: r.client, } } @@ -2833,7 +2925,8 @@ func (r *Directory) Filter(opts ...DirectoryFilterOpts) *Directory { } return &Directory{ - query: q, + query: q, + client: r.client, } } @@ -2949,7 +3042,8 @@ func (r *Directory) Terminal(opts ...DirectoryTerminalOpts) *Directory { } return &Directory{ - query: q, + query: q, + client: r.client, } } @@ -2979,7 +3073,8 @@ func (r *Directory) WithDirectory(path string, directory *Directory, opts ...Dir q = q.Arg("directory", directory) return &Directory{ - query: q, + query: q, + client: r.client, } } @@ -3003,7 +3098,8 @@ func (r *Directory) WithFile(path string, source *File, opts ...DirectoryWithFil q = q.Arg("source", source) return &Directory{ - query: q, + query: q, + client: r.client, } } @@ -3026,7 +3122,8 @@ func (r *Directory) WithFiles(path string, sources []*File, opts ...DirectoryWit q = q.Arg("sources", sources) return &Directory{ - query: q, + query: q, + client: r.client, } } @@ -3050,7 +3147,8 @@ func (r *Directory) WithNewDirectory(path string, opts ...DirectoryWithNewDirect q = q.Arg("path", path) return &Directory{ - query: q, + query: q, + client: r.client, } } @@ -3075,7 +3173,8 @@ func (r *Directory) WithNewFile(path string, contents string, opts ...DirectoryW q = q.Arg("contents", contents) return &Directory{ - query: q, + query: q, + client: r.client, } } @@ -3086,7 +3185,8 @@ func (r *Directory) WithSymlink(target string, linkName string) *Directory { q = q.Arg("linkName", linkName) return &Directory{ - query: q, + query: q, + client: r.client, } } @@ -3096,7 +3196,8 @@ func (r *Directory) WithTimestamps(timestamp int) *Directory { q = q.Arg("timestamp", timestamp) return &Directory{ - query: q, + query: q, + client: r.client, } } @@ -3106,7 +3207,8 @@ func (r *Directory) WithoutDirectory(path string) *Directory { q = q.Arg("path", path) return &Directory{ - query: q, + query: q, + client: r.client, } } @@ -3116,7 +3218,8 @@ func (r *Directory) WithoutFile(path string) *Directory { q = q.Arg("path", path) return &Directory{ - query: q, + query: q, + client: r.client, } } @@ -3126,20 +3229,23 @@ func (r *Directory) WithoutFiles(paths []string) *Directory { q = q.Arg("paths", paths) return &Directory{ - query: q, + query: q, + client: r.client, } } // The Dagger engine configuration and state type Engine struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client id *EngineID } func (r *Engine) WithGraphQLQuery(q *querybuilder.Selection) *Engine { return &Engine{ - query: q, + query: q, + client: r.client, } } @@ -3188,13 +3294,15 @@ func (r *Engine) LocalCache() *EngineCache { q := r.query.Select("localCache") return &EngineCache{ - query: q, + query: q, + client: r.client, } } // A cache storage for the Dagger engine type EngineCache struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client id *EngineCacheID keepBytes *int @@ -3207,7 +3315,8 @@ type EngineCache struct { func (r *EngineCache) WithGraphQLQuery(q *querybuilder.Selection) *EngineCache { return &EngineCache{ - query: q, + query: q, + client: r.client, } } @@ -3227,7 +3336,8 @@ func (r *EngineCache) EntrySet(opts ...EngineCacheEntrySetOpts) *EngineCacheEntr } return &EngineCacheEntrySet{ - query: q, + query: q, + client: r.client, } } @@ -3362,7 +3472,8 @@ func (r *EngineCache) TargetSpace(ctx context.Context) (int, error) { // An individual cache entry in a cache entry set type EngineCacheEntry struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client activelyUsed *bool createdTimeUnixNano *int @@ -3374,7 +3485,8 @@ type EngineCacheEntry struct { func (r *EngineCacheEntry) WithGraphQLQuery(q *querybuilder.Selection) *EngineCacheEntry { return &EngineCacheEntry{ - query: q, + query: q, + client: r.client, } } @@ -3485,7 +3597,8 @@ func (r *EngineCacheEntry) MostRecentUseTimeUnixNano(ctx context.Context) (int, // A set of cache entries returned by a query to a cache type EngineCacheEntrySet struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client diskSpaceBytes *int entryCount *int @@ -3494,7 +3607,8 @@ type EngineCacheEntrySet struct { func (r *EngineCacheEntrySet) WithGraphQLQuery(q *querybuilder.Selection) *EngineCacheEntrySet { return &EngineCacheEntrySet{ - query: q, + query: q, + client: r.client, } } @@ -3599,7 +3713,8 @@ func (r *EngineCacheEntrySet) MarshalJSON() ([]byte, error) { // A definition of a custom enum defined in a Module. type EnumTypeDef struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client description *string id *EnumTypeDefID @@ -3609,7 +3724,8 @@ type EnumTypeDef struct { func (r *EnumTypeDef) WithGraphQLQuery(q *querybuilder.Selection) *EnumTypeDef { return &EnumTypeDef{ - query: q, + query: q, + client: r.client, } } @@ -3717,7 +3833,8 @@ func (r *EnumTypeDef) SourceMap() *SourceMap { q := r.query.Select("sourceMap") return &SourceMap{ - query: q, + query: q, + client: r.client, } } @@ -3769,7 +3886,8 @@ func (r *EnumTypeDef) Values(ctx context.Context) ([]EnumValueTypeDef, error) { // A definition of a value in a custom enum defined in a Module. type EnumValueTypeDef struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client description *string id *EnumValueTypeDefID @@ -3779,7 +3897,8 @@ type EnumValueTypeDef struct { func (r *EnumValueTypeDef) WithGraphQLQuery(q *querybuilder.Selection) *EnumValueTypeDef { return &EnumValueTypeDef{ - query: q, + query: q, + client: r.client, } } @@ -3854,7 +3973,8 @@ func (r *EnumValueTypeDef) SourceMap() *SourceMap { q := r.query.Select("sourceMap") return &SourceMap{ - query: q, + query: q, + client: r.client, } } @@ -3872,7 +3992,8 @@ func (r *EnumValueTypeDef) Value(ctx context.Context) (string, error) { } type Env struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client id *EnvID } @@ -3887,7 +4008,8 @@ func (r *Env) With(f WithEnvFunc) *Env { func (r *Env) WithGraphQLQuery(q *querybuilder.Selection) *Env { return &Env{ - query: q, + query: q, + client: r.client, } } @@ -3937,7 +4059,8 @@ func (r *Env) Input(name string) *Binding { q = q.Arg("name", name) return &Binding{ - query: q, + query: q, + client: r.client, } } @@ -3980,7 +4103,8 @@ func (r *Env) Output(name string) *Binding { q = q.Arg("name", name) return &Binding{ - query: q, + query: q, + client: r.client, } } @@ -4026,7 +4150,8 @@ func (r *Env) WithCacheVolumeInput(name string, value *CacheVolume, description q = q.Arg("description", description) return &Env{ - query: q, + query: q, + client: r.client, } } @@ -4037,7 +4162,8 @@ func (r *Env) WithCacheVolumeOutput(name string, description string) *Env { q = q.Arg("description", description) return &Env{ - query: q, + query: q, + client: r.client, } } @@ -4050,7 +4176,8 @@ func (r *Env) WithCloudInput(name string, value *Cloud, description string) *Env q = q.Arg("description", description) return &Env{ - query: q, + query: q, + client: r.client, } } @@ -4061,7 +4188,8 @@ func (r *Env) WithCloudOutput(name string, description string) *Env { q = q.Arg("description", description) return &Env{ - query: q, + query: q, + client: r.client, } } @@ -4074,7 +4202,8 @@ func (r *Env) WithContainerInput(name string, value *Container, description stri q = q.Arg("description", description) return &Env{ - query: q, + query: q, + client: r.client, } } @@ -4085,7 +4214,8 @@ func (r *Env) WithContainerOutput(name string, description string) *Env { q = q.Arg("description", description) return &Env{ - query: q, + query: q, + client: r.client, } } @@ -4098,7 +4228,8 @@ func (r *Env) WithDirectoryInput(name string, value *Directory, description stri q = q.Arg("description", description) return &Env{ - query: q, + query: q, + client: r.client, } } @@ -4109,7 +4240,8 @@ func (r *Env) WithDirectoryOutput(name string, description string) *Env { q = q.Arg("description", description) return &Env{ - query: q, + query: q, + client: r.client, } } @@ -4122,7 +4254,8 @@ func (r *Env) WithEnvInput(name string, value *Env, description string) *Env { q = q.Arg("description", description) return &Env{ - query: q, + query: q, + client: r.client, } } @@ -4133,7 +4266,8 @@ func (r *Env) WithEnvOutput(name string, description string) *Env { q = q.Arg("description", description) return &Env{ - query: q, + query: q, + client: r.client, } } @@ -4146,7 +4280,8 @@ func (r *Env) WithFileInput(name string, value *File, description string) *Env { q = q.Arg("description", description) return &Env{ - query: q, + query: q, + client: r.client, } } @@ -4157,7 +4292,8 @@ func (r *Env) WithFileOutput(name string, description string) *Env { q = q.Arg("description", description) return &Env{ - query: q, + query: q, + client: r.client, } } @@ -4170,7 +4306,8 @@ func (r *Env) WithGitRefInput(name string, value *GitRef, description string) *E q = q.Arg("description", description) return &Env{ - query: q, + query: q, + client: r.client, } } @@ -4181,7 +4318,8 @@ func (r *Env) WithGitRefOutput(name string, description string) *Env { q = q.Arg("description", description) return &Env{ - query: q, + query: q, + client: r.client, } } @@ -4194,7 +4332,8 @@ func (r *Env) WithGitRepositoryInput(name string, value *GitRepository, descript q = q.Arg("description", description) return &Env{ - query: q, + query: q, + client: r.client, } } @@ -4205,7 +4344,8 @@ func (r *Env) WithGitRepositoryOutput(name string, description string) *Env { q = q.Arg("description", description) return &Env{ - query: q, + query: q, + client: r.client, } } @@ -4218,7 +4358,8 @@ func (r *Env) WithLLMInput(name string, value *LLM, description string) *Env { q = q.Arg("description", description) return &Env{ - query: q, + query: q, + client: r.client, } } @@ -4229,7 +4370,8 @@ func (r *Env) WithLLMOutput(name string, description string) *Env { q = q.Arg("description", description) return &Env{ - query: q, + query: q, + client: r.client, } } @@ -4242,7 +4384,8 @@ func (r *Env) WithModuleConfigClientInput(name string, value *ModuleConfigClient q = q.Arg("description", description) return &Env{ - query: q, + query: q, + client: r.client, } } @@ -4253,7 +4396,8 @@ func (r *Env) WithModuleConfigClientOutput(name string, description string) *Env q = q.Arg("description", description) return &Env{ - query: q, + query: q, + client: r.client, } } @@ -4266,8 +4410,9 @@ func (r *Env) WithModuleInput(name string, value *Module, description string) *E q = q.Arg("description", description) return &Env{ - query: q, - } + query: q, + client: r.client, + } } // Declare a desired Module output to be assigned in the environment @@ -4277,7 +4422,8 @@ func (r *Env) WithModuleOutput(name string, description string) *Env { q = q.Arg("description", description) return &Env{ - query: q, + query: q, + client: r.client, } } @@ -4290,7 +4436,8 @@ func (r *Env) WithModuleSourceInput(name string, value *ModuleSource, descriptio q = q.Arg("description", description) return &Env{ - query: q, + query: q, + client: r.client, } } @@ -4301,7 +4448,8 @@ func (r *Env) WithModuleSourceOutput(name string, description string) *Env { q = q.Arg("description", description) return &Env{ - query: q, + query: q, + client: r.client, } } @@ -4314,7 +4462,8 @@ func (r *Env) WithSecretInput(name string, value *Secret, description string) *E q = q.Arg("description", description) return &Env{ - query: q, + query: q, + client: r.client, } } @@ -4325,7 +4474,8 @@ func (r *Env) WithSecretOutput(name string, description string) *Env { q = q.Arg("description", description) return &Env{ - query: q, + query: q, + client: r.client, } } @@ -4338,7 +4488,8 @@ func (r *Env) WithServiceInput(name string, value *Service, description string) q = q.Arg("description", description) return &Env{ - query: q, + query: q, + client: r.client, } } @@ -4349,7 +4500,8 @@ func (r *Env) WithServiceOutput(name string, description string) *Env { q = q.Arg("description", description) return &Env{ - query: q, + query: q, + client: r.client, } } @@ -4362,7 +4514,8 @@ func (r *Env) WithSocketInput(name string, value *Socket, description string) *E q = q.Arg("description", description) return &Env{ - query: q, + query: q, + client: r.client, } } @@ -4373,7 +4526,8 @@ func (r *Env) WithSocketOutput(name string, description string) *Env { q = q.Arg("description", description) return &Env{ - query: q, + query: q, + client: r.client, } } @@ -4385,7 +4539,8 @@ func (r *Env) WithStringInput(name string, value string, description string) *En q = q.Arg("description", description) return &Env{ - query: q, + query: q, + client: r.client, } } @@ -4396,13 +4551,15 @@ func (r *Env) WithStringOutput(name string, description string) *Env { q = q.Arg("description", description) return &Env{ - query: q, + query: q, + client: r.client, } } // An environment variable name and value. type EnvVariable struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client id *EnvVariableID name *string @@ -4411,7 +4568,8 @@ type EnvVariable struct { func (r *EnvVariable) WithGraphQLQuery(q *querybuilder.Selection) *EnvVariable { return &EnvVariable{ - query: q, + query: q, + client: r.client, } } @@ -4482,7 +4640,8 @@ func (r *EnvVariable) Value(ctx context.Context) (string, error) { } type Error struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client id *ErrorID message *string @@ -4498,7 +4657,8 @@ func (r *Error) With(f WithErrorFunc) *Error { func (r *Error) WithGraphQLQuery(q *querybuilder.Selection) *Error { return &Error{ - query: q, + query: q, + client: r.client, } } @@ -4595,12 +4755,14 @@ func (r *Error) WithValue(name string, value JSON) *Error { q = q.Arg("value", value) return &Error{ - query: q, + query: q, + client: r.client, } } type ErrorValue struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client id *ErrorValueID name *string @@ -4609,7 +4771,8 @@ type ErrorValue struct { func (r *ErrorValue) WithGraphQLQuery(q *querybuilder.Selection) *ErrorValue { return &ErrorValue{ - query: q, + query: q, + client: r.client, } } @@ -4683,7 +4846,8 @@ func (r *ErrorValue) Value(ctx context.Context) (JSON, error) { // // A field on an object has a static value, as opposed to a function on an object whose value is computed by invoking code (and can accept arguments). type FieldTypeDef struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client description *string id *FieldTypeDefID @@ -4692,7 +4856,8 @@ type FieldTypeDef struct { func (r *FieldTypeDef) WithGraphQLQuery(q *querybuilder.Selection) *FieldTypeDef { return &FieldTypeDef{ - query: q, + query: q, + client: r.client, } } @@ -4767,7 +4932,8 @@ func (r *FieldTypeDef) SourceMap() *SourceMap { q := r.query.Select("sourceMap") return &SourceMap{ - query: q, + query: q, + client: r.client, } } @@ -4776,13 +4942,15 @@ func (r *FieldTypeDef) TypeDef() *TypeDef { q := r.query.Select("typeDef") return &TypeDef{ - query: q, + query: q, + client: r.client, } } // A file. type File struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client contents *string digest *string @@ -4803,7 +4971,8 @@ func (r *File) With(f WithFileFunc) *File { func (r *File) WithGraphQLQuery(q *querybuilder.Selection) *File { return &File{ - query: q, + query: q, + client: r.client, } } @@ -4956,7 +5125,8 @@ func (r *File) WithName(name string) *File { q = q.Arg("name", name) return &File{ - query: q, + query: q, + client: r.client, } } @@ -4966,7 +5136,8 @@ func (r *File) WithTimestamps(timestamp int) *File { q = q.Arg("timestamp", timestamp) return &File{ - query: q, + query: q, + client: r.client, } } @@ -4974,7 +5145,8 @@ func (r *File) WithTimestamps(timestamp int) *File { // // A function always evaluates against a parent object and is given a set of named arguments. type Function struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client description *string id *FunctionID @@ -4991,7 +5163,8 @@ func (r *Function) With(f WithFunctionFunc) *Function { func (r *Function) WithGraphQLQuery(q *querybuilder.Selection) *Function { return &Function{ - query: q, + query: q, + client: r.client, } } @@ -5099,7 +5272,8 @@ func (r *Function) ReturnType() *TypeDef { q := r.query.Select("returnType") return &TypeDef{ - query: q, + query: q, + client: r.client, } } @@ -5108,7 +5282,8 @@ func (r *Function) SourceMap() *SourceMap { q := r.query.Select("sourceMap") return &SourceMap{ - query: q, + query: q, + client: r.client, } } @@ -5156,7 +5331,8 @@ func (r *Function) WithArg(name string, typeDef *TypeDef, opts ...FunctionWithAr q = q.Arg("typeDef", typeDef) return &Function{ - query: q, + query: q, + client: r.client, } } @@ -5166,7 +5342,8 @@ func (r *Function) WithDescription(description string) *Function { q = q.Arg("description", description) return &Function{ - query: q, + query: q, + client: r.client, } } @@ -5177,7 +5354,8 @@ func (r *Function) WithSourceMap(sourceMap *SourceMap) *Function { q = q.Arg("sourceMap", sourceMap) return &Function{ - query: q, + query: q, + client: r.client, } } @@ -5185,7 +5363,8 @@ func (r *Function) WithSourceMap(sourceMap *SourceMap) *Function { // // This is a specification for an argument at function definition time, not an argument passed at function call time. type FunctionArg struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client defaultPath *string defaultValue *JSON @@ -5196,7 +5375,8 @@ type FunctionArg struct { func (r *FunctionArg) WithGraphQLQuery(q *querybuilder.Selection) *FunctionArg { return &FunctionArg{ - query: q, + query: q, + client: r.client, } } @@ -5307,7 +5487,8 @@ func (r *FunctionArg) SourceMap() *SourceMap { q := r.query.Select("sourceMap") return &SourceMap{ - query: q, + query: q, + client: r.client, } } @@ -5316,13 +5497,15 @@ func (r *FunctionArg) TypeDef() *TypeDef { q := r.query.Select("typeDef") return &TypeDef{ - query: q, + query: q, + client: r.client, } } // An active function call. type FunctionCall struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client id *FunctionCallID name *string @@ -5334,7 +5517,8 @@ type FunctionCall struct { func (r *FunctionCall) WithGraphQLQuery(q *querybuilder.Selection) *FunctionCall { return &FunctionCall{ - query: q, + query: q, + client: r.client, } } @@ -5475,7 +5659,8 @@ func (r *FunctionCall) ReturnValue(ctx context.Context, value JSON) error { // A value passed as a named argument to a function call. type FunctionCallArgValue struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client id *FunctionCallArgValueID name *string @@ -5484,7 +5669,8 @@ type FunctionCallArgValue struct { func (r *FunctionCallArgValue) WithGraphQLQuery(q *querybuilder.Selection) *FunctionCallArgValue { return &FunctionCallArgValue{ - query: q, + query: q, + client: r.client, } } @@ -5556,7 +5742,8 @@ func (r *FunctionCallArgValue) Value(ctx context.Context) (JSON, error) { // The result of running an SDK's codegen. type GeneratedCode struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client id *GeneratedCodeID } @@ -5571,7 +5758,8 @@ func (r *GeneratedCode) With(f WithGeneratedCodeFunc) *GeneratedCode { func (r *GeneratedCode) WithGraphQLQuery(q *querybuilder.Selection) *GeneratedCode { return &GeneratedCode{ - query: q, + query: q, + client: r.client, } } @@ -5580,7 +5768,8 @@ func (r *GeneratedCode) Code() *Directory { q := r.query.Select("code") return &Directory{ - query: q, + query: q, + client: r.client, } } @@ -5650,7 +5839,8 @@ func (r *GeneratedCode) WithVCSGeneratedPaths(paths []string) *GeneratedCode { q = q.Arg("paths", paths) return &GeneratedCode{ - query: q, + query: q, + client: r.client, } } @@ -5660,13 +5850,15 @@ func (r *GeneratedCode) WithVCSIgnoredPaths(paths []string) *GeneratedCode { q = q.Arg("paths", paths) return &GeneratedCode{ - query: q, + query: q, + client: r.client, } } // A git ref (tag, branch, or commit). type GitRef struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client commit *string id *GitRefID @@ -5675,7 +5867,8 @@ type GitRef struct { func (r *GitRef) WithGraphQLQuery(q *querybuilder.Selection) *GitRef { return &GitRef{ - query: q, + query: q, + client: r.client, } } @@ -5770,13 +5963,15 @@ func (r *GitRef) Tree(opts ...GitRefTreeOpts) *Directory { } return &Directory{ - query: q, + query: q, + client: r.client, } } // A git repository. type GitRepository struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client id *GitRepositoryID } @@ -5791,7 +5986,8 @@ func (r *GitRepository) With(f WithGitRepositoryFunc) *GitRepository { func (r *GitRepository) WithGraphQLQuery(q *querybuilder.Selection) *GitRepository { return &GitRepository{ - query: q, + query: q, + client: r.client, } } @@ -5801,7 +5997,8 @@ func (r *GitRepository) Branch(name string) *GitRef { q = q.Arg("name", name) return &GitRef{ - query: q, + query: q, + client: r.client, } } @@ -5833,7 +6030,8 @@ func (r *GitRepository) Commit(id string) *GitRef { q = q.Arg("id", id) return &GitRef{ - query: q, + query: q, + client: r.client, } } @@ -5842,7 +6040,8 @@ func (r *GitRepository) Head() *GitRef { q := r.query.Select("head") return &GitRef{ - query: q, + query: q, + client: r.client, } } @@ -5892,7 +6091,8 @@ func (r *GitRepository) Ref(name string) *GitRef { q = q.Arg("name", name) return &GitRef{ - query: q, + query: q, + client: r.client, } } @@ -5902,7 +6102,8 @@ func (r *GitRepository) Tag(name string) *GitRef { q = q.Arg("name", name) return &GitRef{ - query: q, + query: q, + client: r.client, } } @@ -5937,7 +6138,8 @@ func (r *GitRepository) WithAuthHeader(header *Secret) *GitRepository { q = q.Arg("header", header) return &GitRepository{ - query: q, + query: q, + client: r.client, } } @@ -5950,20 +6152,23 @@ func (r *GitRepository) WithAuthToken(token *Secret) *GitRepository { q = q.Arg("token", token) return &GitRepository{ - query: q, + query: q, + client: r.client, } } // Information about the host environment. type Host struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client id *HostID } func (r *Host) WithGraphQLQuery(q *querybuilder.Selection) *Host { return &Host{ - query: q, + query: q, + client: r.client, } } @@ -5997,7 +6202,8 @@ func (r *Host) Directory(path string, opts ...HostDirectoryOpts) *Directory { q = q.Arg("path", path) return &Directory{ - query: q, + query: q, + client: r.client, } } @@ -6019,7 +6225,8 @@ func (r *Host) File(path string, opts ...HostFileOpts) *File { q = q.Arg("path", path) return &File{ - query: q, + query: q, + client: r.client, } } @@ -6083,7 +6290,8 @@ func (r *Host) Service(ports []PortForward, opts ...HostServiceOpts) *Service { q = q.Arg("ports", ports) return &Service{ - query: q, + query: q, + client: r.client, } } @@ -6098,7 +6306,8 @@ func (r *Host) SetSecretFile(name string, path string) *Secret { q = q.Arg("path", path) return &Secret{ - query: q, + query: q, + client: r.client, } } @@ -6135,7 +6344,8 @@ func (r *Host) Tunnel(service *Service, opts ...HostTunnelOpts) *Service { q = q.Arg("service", service) return &Service{ - query: q, + query: q, + client: r.client, } } @@ -6145,7 +6355,8 @@ func (r *Host) UnixSocket(path string) *Socket { q = q.Arg("path", path) return &Socket{ - query: q, + query: q, + client: r.client, } } @@ -6154,7 +6365,8 @@ func (r *Host) UnixSocket(path string) *Socket { // in the core API. It is not used by user modules and shouldn't ever be as user // module accept input objects via their id rather than graphql input types. type InputTypeDef struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client id *InputTypeDefID name *string @@ -6162,7 +6374,8 @@ type InputTypeDef struct { func (r *InputTypeDef) WithGraphQLQuery(q *querybuilder.Selection) *InputTypeDef { return &InputTypeDef{ - query: q, + query: q, + client: r.client, } } @@ -6254,7 +6467,8 @@ func (r *InputTypeDef) Name(ctx context.Context) (string, error) { // A definition of a custom interface defined in a Module. type InterfaceTypeDef struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client description *string id *InterfaceTypeDefID @@ -6264,7 +6478,8 @@ type InterfaceTypeDef struct { func (r *InterfaceTypeDef) WithGraphQLQuery(q *querybuilder.Selection) *InterfaceTypeDef { return &InterfaceTypeDef{ - query: q, + query: q, + client: r.client, } } @@ -6372,7 +6587,8 @@ func (r *InterfaceTypeDef) SourceMap() *SourceMap { q := r.query.Select("sourceMap") return &SourceMap{ - query: q, + query: q, + client: r.client, } } @@ -6390,7 +6606,8 @@ func (r *InterfaceTypeDef) SourceModuleName(ctx context.Context) (string, error) } type LLM struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client historyJSON *JSON id *LLMID @@ -6411,7 +6628,8 @@ func (r *LLM) With(f WithLLMFunc) *LLM { func (r *LLM) WithGraphQLQuery(q *querybuilder.Selection) *LLM { return &LLM{ - query: q, + query: q, + client: r.client, } } @@ -6421,7 +6639,8 @@ func (r *LLM) Attempt(number int) *LLM { q = q.Arg("number", number) return &LLM{ - query: q, + query: q, + client: r.client, } } @@ -6431,7 +6650,8 @@ func (r *LLM) BindResult(name string) *Binding { q = q.Arg("name", name) return &Binding{ - query: q, + query: q, + client: r.client, } } @@ -6440,7 +6660,8 @@ func (r *LLM) Env() *Env { q := r.query.Select("env") return &Env{ - query: q, + query: q, + client: r.client, } } @@ -6525,7 +6746,8 @@ func (r *LLM) Loop() *LLM { q := r.query.Select("loop") return &LLM{ - query: q, + query: q, + client: r.client, } } @@ -6573,7 +6795,8 @@ func (r *LLM) TokenUsage() *LLMTokenUsage { q := r.query.Select("tokenUsage") return &LLMTokenUsage{ - query: q, + query: q, + client: r.client, } } @@ -6597,7 +6820,8 @@ func (r *LLM) WithEnv(env *Env) *LLM { q = q.Arg("env", env) return &LLM{ - query: q, + query: q, + client: r.client, } } @@ -6607,7 +6831,8 @@ func (r *LLM) WithModel(model string) *LLM { q = q.Arg("model", model) return &LLM{ - query: q, + query: q, + client: r.client, } } @@ -6617,7 +6842,8 @@ func (r *LLM) WithPrompt(prompt string) *LLM { q = q.Arg("prompt", prompt) return &LLM{ - query: q, + query: q, + client: r.client, } } @@ -6628,7 +6854,8 @@ func (r *LLM) WithPromptFile(file *File) *LLM { q = q.Arg("file", file) return &LLM{ - query: q, + query: q, + client: r.client, } } @@ -6638,7 +6865,8 @@ func (r *LLM) WithSystemPrompt(prompt string) *LLM { q = q.Arg("prompt", prompt) return &LLM{ - query: q, + query: q, + client: r.client, } } @@ -6647,12 +6875,14 @@ func (r *LLM) WithoutDefaultSystemPrompt() *LLM { q := r.query.Select("withoutDefaultSystemPrompt") return &LLM{ - query: q, + query: q, + client: r.client, } } type LLMTokenUsage struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client cachedTokenReads *int cachedTokenWrites *int @@ -6664,7 +6894,8 @@ type LLMTokenUsage struct { func (r *LLMTokenUsage) WithGraphQLQuery(q *querybuilder.Selection) *LLMTokenUsage { return &LLMTokenUsage{ - query: q, + query: q, + client: r.client, } } @@ -6770,7 +7001,8 @@ func (r *LLMTokenUsage) TotalTokens(ctx context.Context) (int, error) { // A simple key value object that represents a label. type Label struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client id *LabelID name *string @@ -6779,7 +7011,8 @@ type Label struct { func (r *Label) WithGraphQLQuery(q *querybuilder.Selection) *Label { return &Label{ - query: q, + query: q, + client: r.client, } } @@ -6851,14 +7084,16 @@ func (r *Label) Value(ctx context.Context) (string, error) { // A definition of a list type in a Module. type ListTypeDef struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client id *ListTypeDefID } func (r *ListTypeDef) WithGraphQLQuery(q *querybuilder.Selection) *ListTypeDef { return &ListTypeDef{ - query: q, + query: q, + client: r.client, } } @@ -6867,7 +7102,8 @@ func (r *ListTypeDef) ElementTypeDef() *TypeDef { q := r.query.Select("elementTypeDef") return &TypeDef{ - query: q, + query: q, + client: r.client, } } @@ -6913,7 +7149,8 @@ func (r *ListTypeDef) MarshalJSON() ([]byte, error) { // A Dagger module. type Module struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client description *string id *ModuleID @@ -6932,7 +7169,8 @@ func (r *Module) With(f WithModuleFunc) *Module { func (r *Module) WithGraphQLQuery(q *querybuilder.Selection) *Module { return &Module{ - query: q, + query: q, + client: r.client, } } @@ -7020,7 +7258,8 @@ func (r *Module) GeneratedContextDirectory() *Directory { q := r.query.Select("generatedContextDirectory") return &Directory{ - query: q, + query: q, + client: r.client, } } @@ -7148,7 +7387,8 @@ func (r *Module) Runtime() *Container { q := r.query.Select("runtime") return &Container{ - query: q, + query: q, + client: r.client, } } @@ -7157,7 +7397,8 @@ func (r *Module) SDK() *SDKConfig { q := r.query.Select("sdk") return &SDKConfig{ - query: q, + query: q, + client: r.client, } } @@ -7190,7 +7431,8 @@ func (r *Module) Source() *ModuleSource { q := r.query.Select("source") return &ModuleSource{ - query: q, + query: q, + client: r.client, } } @@ -7213,7 +7455,8 @@ func (r *Module) WithDescription(description string) *Module { q = q.Arg("description", description) return &Module{ - query: q, + query: q, + client: r.client, } } @@ -7224,7 +7467,8 @@ func (r *Module) WithEnum(enum *TypeDef) *Module { q = q.Arg("enum", enum) return &Module{ - query: q, + query: q, + client: r.client, } } @@ -7235,7 +7479,8 @@ func (r *Module) WithInterface(iface *TypeDef) *Module { q = q.Arg("iface", iface) return &Module{ - query: q, + query: q, + client: r.client, } } @@ -7246,13 +7491,15 @@ func (r *Module) WithObject(object *TypeDef) *Module { q = q.Arg("object", object) return &Module{ - query: q, + query: q, + client: r.client, } } // The client generated for the module. type ModuleConfigClient struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client directory *string generator *string @@ -7261,7 +7508,8 @@ type ModuleConfigClient struct { func (r *ModuleConfigClient) WithGraphQLQuery(q *querybuilder.Selection) *ModuleConfigClient { return &ModuleConfigClient{ - query: q, + query: q, + client: r.client, } } @@ -7333,7 +7581,8 @@ func (r *ModuleConfigClient) MarshalJSON() ([]byte, error) { // The source needed to load and run a module, along with any metadata about the source such as versions/urls/etc. type ModuleSource struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client asString *string cloneRef *string @@ -7367,7 +7616,8 @@ func (r *ModuleSource) With(f WithModuleSourceFunc) *ModuleSource { func (r *ModuleSource) WithGraphQLQuery(q *querybuilder.Selection) *ModuleSource { return &ModuleSource{ - query: q, + query: q, + client: r.client, } } @@ -7376,7 +7626,8 @@ func (r *ModuleSource) AsModule() *Module { q := r.query.Select("asModule") return &Module{ - query: q, + query: q, + client: r.client, } } @@ -7470,7 +7721,8 @@ func (r *ModuleSource) ContextDirectory() *Directory { q := r.query.Select("contextDirectory") return &Directory{ - query: q, + query: q, + client: r.client, } } @@ -7526,7 +7778,8 @@ func (r *ModuleSource) Directory(path string) *Directory { q = q.Arg("path", path) return &Directory{ - query: q, + query: q, + client: r.client, } } @@ -7548,7 +7801,8 @@ func (r *ModuleSource) GeneratedContextDirectory() *Directory { q := r.query.Select("generatedContextDirectory") return &Directory{ - query: q, + query: q, + client: r.client, } } @@ -7714,7 +7968,8 @@ func (r *ModuleSource) SDK() *SDKConfig { q := r.query.Select("sdk") return &SDKConfig{ - query: q, + query: q, + client: r.client, } } @@ -7777,7 +8032,8 @@ func (r *ModuleSource) WithClient(generator string, outputDir string) *ModuleSou q = q.Arg("outputDir", outputDir) return &ModuleSource{ - query: q, + query: q, + client: r.client, } } @@ -7787,7 +8043,8 @@ func (r *ModuleSource) WithDependencies(dependencies []*ModuleSource) *ModuleSou q = q.Arg("dependencies", dependencies) return &ModuleSource{ - query: q, + query: q, + client: r.client, } } @@ -7797,7 +8054,8 @@ func (r *ModuleSource) WithEngineVersion(version string) *ModuleSource { q = q.Arg("version", version) return &ModuleSource{ - query: q, + query: q, + client: r.client, } } @@ -7807,7 +8065,8 @@ func (r *ModuleSource) WithIncludes(patterns []string) *ModuleSource { q = q.Arg("patterns", patterns) return &ModuleSource{ - query: q, + query: q, + client: r.client, } } @@ -7817,7 +8076,8 @@ func (r *ModuleSource) WithName(name string) *ModuleSource { q = q.Arg("name", name) return &ModuleSource{ - query: q, + query: q, + client: r.client, } } @@ -7827,7 +8087,8 @@ func (r *ModuleSource) WithSDK(source string) *ModuleSource { q = q.Arg("source", source) return &ModuleSource{ - query: q, + query: q, + client: r.client, } } @@ -7837,7 +8098,8 @@ func (r *ModuleSource) WithSourceSubpath(path string) *ModuleSource { q = q.Arg("path", path) return &ModuleSource{ - query: q, + query: q, + client: r.client, } } @@ -7847,7 +8109,8 @@ func (r *ModuleSource) WithUpdateDependencies(dependencies []string) *ModuleSour q = q.Arg("dependencies", dependencies) return &ModuleSource{ - query: q, + query: q, + client: r.client, } } @@ -7857,7 +8120,8 @@ func (r *ModuleSource) WithoutClient(path string) *ModuleSource { q = q.Arg("path", path) return &ModuleSource{ - query: q, + query: q, + client: r.client, } } @@ -7867,13 +8131,15 @@ func (r *ModuleSource) WithoutDependencies(dependencies []string) *ModuleSource q = q.Arg("dependencies", dependencies) return &ModuleSource{ - query: q, + query: q, + client: r.client, } } // A definition of a custom object defined in a Module. type ObjectTypeDef struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client description *string id *ObjectTypeDefID @@ -7883,7 +8149,8 @@ type ObjectTypeDef struct { func (r *ObjectTypeDef) WithGraphQLQuery(q *querybuilder.Selection) *ObjectTypeDef { return &ObjectTypeDef{ - query: q, + query: q, + client: r.client, } } @@ -7892,7 +8159,8 @@ func (r *ObjectTypeDef) Constructor() *Function { q := r.query.Select("constructor") return &Function{ - query: q, + query: q, + client: r.client, } } @@ -8033,7 +8301,8 @@ func (r *ObjectTypeDef) SourceMap() *SourceMap { q := r.query.Select("sourceMap") return &SourceMap{ - query: q, + query: q, + client: r.client, } } @@ -8052,7 +8321,8 @@ func (r *ObjectTypeDef) SourceModuleName(ctx context.Context) (string, error) { // A port exposed by a container. type Port struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client description *string experimentalSkipHealthcheck *bool @@ -8063,7 +8333,8 @@ type Port struct { func (r *Port) WithGraphQLQuery(q *querybuilder.Selection) *Port { return &Port{ - query: q, + query: q, + client: r.client, } } @@ -8172,7 +8443,8 @@ func (r *Client) CacheVolume(key string) *CacheVolume { q = q.Arg("key", key) return &CacheVolume{ - query: q, + query: q, + client: r.client, } } @@ -8181,7 +8453,8 @@ func (r *Client) Cloud() *Cloud { q := r.query.Select("cloud") return &Cloud{ - query: q, + query: q, + client: r.client, } } @@ -8204,7 +8477,8 @@ func (r *Client) Container(opts ...ContainerOpts) *Container { } return &Container{ - query: q, + query: q, + client: r.client, } } @@ -8215,7 +8489,8 @@ func (r *Client) CurrentFunctionCall() *FunctionCall { q := r.query.Select("currentFunctionCall") return &FunctionCall{ - query: q, + query: q, + client: r.client, } } @@ -8224,7 +8499,8 @@ func (r *Client) CurrentModule() *CurrentModule { q := r.query.Select("currentModule") return &CurrentModule{ - query: q, + query: q, + client: r.client, } } @@ -8276,7 +8552,8 @@ func (r *Client) Directory() *Directory { q := r.query.Select("directory") return &Directory{ - query: q, + query: q, + client: r.client, } } @@ -8285,7 +8562,8 @@ func (r *Client) Engine() *Engine { q := r.query.Select("engine") return &Engine{ - query: q, + query: q, + client: r.client, } } @@ -8314,7 +8592,8 @@ func (r *Client) Env(opts ...EnvOpts) *Env { } return &Env{ - query: q, + query: q, + client: r.client, } } @@ -8324,7 +8603,8 @@ func (r *Client) Error(message string) *Error { q = q.Arg("message", message) return &Error{ - query: q, + query: q, + client: r.client, } } @@ -8349,7 +8629,8 @@ func (r *Client) File(name string, contents string, opts ...FileOpts) *File { q = q.Arg("contents", contents) return &File{ - query: q, + query: q, + client: r.client, } } @@ -8361,7 +8642,8 @@ func (r *Client) Function(name string, returnType *TypeDef) *Function { q = q.Arg("returnType", returnType) return &Function{ - query: q, + query: q, + client: r.client, } } @@ -8372,7 +8654,8 @@ func (r *Client) GeneratedCode(code *Directory) *GeneratedCode { q = q.Arg("code", code) return &GeneratedCode{ - query: q, + query: q, + client: r.client, } } @@ -8432,7 +8715,8 @@ func (r *Client) Git(url string, opts ...GitOpts) *GitRepository { q = q.Arg("url", url) return &GitRepository{ - query: q, + query: q, + client: r.client, } } @@ -8441,7 +8725,8 @@ func (r *Client) Host() *Host { q := r.query.Select("host") return &Host{ - query: q, + query: q, + client: r.client, } } @@ -8481,7 +8766,8 @@ func (r *Client) HTTP(url string, opts ...HTTPOpts) *File { q = q.Arg("url", url) return &File{ - query: q, + query: q, + client: r.client, } } @@ -8510,7 +8796,8 @@ func (r *Client) LLM(opts ...LLMOpts) *LLM { } return &LLM{ - query: q, + query: q, + client: r.client, } } @@ -8520,7 +8807,8 @@ func (r *Client) LoadBindingFromID(id BindingID) *Binding { q = q.Arg("id", id) return &Binding{ - query: q, + query: q, + client: r.client, } } @@ -8530,7 +8818,8 @@ func (r *Client) LoadCacheVolumeFromID(id CacheVolumeID) *CacheVolume { q = q.Arg("id", id) return &CacheVolume{ - query: q, + query: q, + client: r.client, } } @@ -8540,7 +8829,8 @@ func (r *Client) LoadCloudFromID(id CloudID) *Cloud { q = q.Arg("id", id) return &Cloud{ - query: q, + query: q, + client: r.client, } } @@ -8550,7 +8840,8 @@ func (r *Client) LoadContainerFromID(id ContainerID) *Container { q = q.Arg("id", id) return &Container{ - query: q, + query: q, + client: r.client, } } @@ -8560,7 +8851,8 @@ func (r *Client) LoadCurrentModuleFromID(id CurrentModuleID) *CurrentModule { q = q.Arg("id", id) return &CurrentModule{ - query: q, + query: q, + client: r.client, } } @@ -8570,7 +8862,8 @@ func (r *Client) LoadDirectoryFromID(id DirectoryID) *Directory { q = q.Arg("id", id) return &Directory{ - query: q, + query: q, + client: r.client, } } @@ -8580,7 +8873,8 @@ func (r *Client) LoadEngineCacheEntryFromID(id EngineCacheEntryID) *EngineCacheE q = q.Arg("id", id) return &EngineCacheEntry{ - query: q, + query: q, + client: r.client, } } @@ -8590,7 +8884,8 @@ func (r *Client) LoadEngineCacheEntrySetFromID(id EngineCacheEntrySetID) *Engine q = q.Arg("id", id) return &EngineCacheEntrySet{ - query: q, + query: q, + client: r.client, } } @@ -8600,8 +8895,9 @@ func (r *Client) LoadEngineCacheFromID(id EngineCacheID) *EngineCache { q = q.Arg("id", id) return &EngineCache{ - query: q, - } + query: q, + client: r.client, + } } // Load a Engine from its ID. @@ -8610,7 +8906,8 @@ func (r *Client) LoadEngineFromID(id EngineID) *Engine { q = q.Arg("id", id) return &Engine{ - query: q, + query: q, + client: r.client, } } @@ -8620,7 +8917,8 @@ func (r *Client) LoadEnumTypeDefFromID(id EnumTypeDefID) *EnumTypeDef { q = q.Arg("id", id) return &EnumTypeDef{ - query: q, + query: q, + client: r.client, } } @@ -8630,7 +8928,8 @@ func (r *Client) LoadEnumValueTypeDefFromID(id EnumValueTypeDefID) *EnumValueTyp q = q.Arg("id", id) return &EnumValueTypeDef{ - query: q, + query: q, + client: r.client, } } @@ -8640,7 +8939,8 @@ func (r *Client) LoadEnvFromID(id EnvID) *Env { q = q.Arg("id", id) return &Env{ - query: q, + query: q, + client: r.client, } } @@ -8650,7 +8950,8 @@ func (r *Client) LoadEnvVariableFromID(id EnvVariableID) *EnvVariable { q = q.Arg("id", id) return &EnvVariable{ - query: q, + query: q, + client: r.client, } } @@ -8660,7 +8961,8 @@ func (r *Client) LoadErrorFromID(id ErrorID) *Error { q = q.Arg("id", id) return &Error{ - query: q, + query: q, + client: r.client, } } @@ -8670,7 +8972,8 @@ func (r *Client) LoadErrorValueFromID(id ErrorValueID) *ErrorValue { q = q.Arg("id", id) return &ErrorValue{ - query: q, + query: q, + client: r.client, } } @@ -8680,7 +8983,8 @@ func (r *Client) LoadFieldTypeDefFromID(id FieldTypeDefID) *FieldTypeDef { q = q.Arg("id", id) return &FieldTypeDef{ - query: q, + query: q, + client: r.client, } } @@ -8690,7 +8994,8 @@ func (r *Client) LoadFileFromID(id FileID) *File { q = q.Arg("id", id) return &File{ - query: q, + query: q, + client: r.client, } } @@ -8700,7 +9005,8 @@ func (r *Client) LoadFunctionArgFromID(id FunctionArgID) *FunctionArg { q = q.Arg("id", id) return &FunctionArg{ - query: q, + query: q, + client: r.client, } } @@ -8710,7 +9016,8 @@ func (r *Client) LoadFunctionCallArgValueFromID(id FunctionCallArgValueID) *Func q = q.Arg("id", id) return &FunctionCallArgValue{ - query: q, + query: q, + client: r.client, } } @@ -8720,7 +9027,8 @@ func (r *Client) LoadFunctionCallFromID(id FunctionCallID) *FunctionCall { q = q.Arg("id", id) return &FunctionCall{ - query: q, + query: q, + client: r.client, } } @@ -8730,7 +9038,8 @@ func (r *Client) LoadFunctionFromID(id FunctionID) *Function { q = q.Arg("id", id) return &Function{ - query: q, + query: q, + client: r.client, } } @@ -8740,7 +9049,8 @@ func (r *Client) LoadGeneratedCodeFromID(id GeneratedCodeID) *GeneratedCode { q = q.Arg("id", id) return &GeneratedCode{ - query: q, + query: q, + client: r.client, } } @@ -8750,7 +9060,8 @@ func (r *Client) LoadGitRefFromID(id GitRefID) *GitRef { q = q.Arg("id", id) return &GitRef{ - query: q, + query: q, + client: r.client, } } @@ -8760,7 +9071,8 @@ func (r *Client) LoadGitRepositoryFromID(id GitRepositoryID) *GitRepository { q = q.Arg("id", id) return &GitRepository{ - query: q, + query: q, + client: r.client, } } @@ -8770,7 +9082,8 @@ func (r *Client) LoadHostFromID(id HostID) *Host { q = q.Arg("id", id) return &Host{ - query: q, + query: q, + client: r.client, } } @@ -8780,7 +9093,8 @@ func (r *Client) LoadInputTypeDefFromID(id InputTypeDefID) *InputTypeDef { q = q.Arg("id", id) return &InputTypeDef{ - query: q, + query: q, + client: r.client, } } @@ -8790,7 +9104,8 @@ func (r *Client) LoadInterfaceTypeDefFromID(id InterfaceTypeDefID) *InterfaceTyp q = q.Arg("id", id) return &InterfaceTypeDef{ - query: q, + query: q, + client: r.client, } } @@ -8800,7 +9115,8 @@ func (r *Client) LoadLLMFromID(id LLMID) *LLM { q = q.Arg("id", id) return &LLM{ - query: q, + query: q, + client: r.client, } } @@ -8810,7 +9126,8 @@ func (r *Client) LoadLLMTokenUsageFromID(id LLMTokenUsageID) *LLMTokenUsage { q = q.Arg("id", id) return &LLMTokenUsage{ - query: q, + query: q, + client: r.client, } } @@ -8820,7 +9137,8 @@ func (r *Client) LoadLabelFromID(id LabelID) *Label { q = q.Arg("id", id) return &Label{ - query: q, + query: q, + client: r.client, } } @@ -8830,7 +9148,8 @@ func (r *Client) LoadListTypeDefFromID(id ListTypeDefID) *ListTypeDef { q = q.Arg("id", id) return &ListTypeDef{ - query: q, + query: q, + client: r.client, } } @@ -8840,7 +9159,8 @@ func (r *Client) LoadModuleConfigClientFromID(id ModuleConfigClientID) *ModuleCo q = q.Arg("id", id) return &ModuleConfigClient{ - query: q, + query: q, + client: r.client, } } @@ -8850,7 +9170,8 @@ func (r *Client) LoadModuleFromID(id ModuleID) *Module { q = q.Arg("id", id) return &Module{ - query: q, + query: q, + client: r.client, } } @@ -8860,7 +9181,8 @@ func (r *Client) LoadModuleSourceFromID(id ModuleSourceID) *ModuleSource { q = q.Arg("id", id) return &ModuleSource{ - query: q, + query: q, + client: r.client, } } @@ -8870,7 +9192,8 @@ func (r *Client) LoadObjectTypeDefFromID(id ObjectTypeDefID) *ObjectTypeDef { q = q.Arg("id", id) return &ObjectTypeDef{ - query: q, + query: q, + client: r.client, } } @@ -8880,7 +9203,8 @@ func (r *Client) LoadPortFromID(id PortID) *Port { q = q.Arg("id", id) return &Port{ - query: q, + query: q, + client: r.client, } } @@ -8890,7 +9214,8 @@ func (r *Client) LoadSDKConfigFromID(id SDKConfigID) *SDKConfig { q = q.Arg("id", id) return &SDKConfig{ - query: q, + query: q, + client: r.client, } } @@ -8900,7 +9225,8 @@ func (r *Client) LoadScalarTypeDefFromID(id ScalarTypeDefID) *ScalarTypeDef { q = q.Arg("id", id) return &ScalarTypeDef{ - query: q, + query: q, + client: r.client, } } @@ -8910,7 +9236,8 @@ func (r *Client) LoadSecretFromID(id SecretID) *Secret { q = q.Arg("id", id) return &Secret{ - query: q, + query: q, + client: r.client, } } @@ -8920,7 +9247,8 @@ func (r *Client) LoadServiceFromID(id ServiceID) *Service { q = q.Arg("id", id) return &Service{ - query: q, + query: q, + client: r.client, } } @@ -8930,7 +9258,8 @@ func (r *Client) LoadSocketFromID(id SocketID) *Socket { q = q.Arg("id", id) return &Socket{ - query: q, + query: q, + client: r.client, } } @@ -8940,7 +9269,19 @@ func (r *Client) LoadSourceMapFromID(id SourceMapID) *SourceMap { q = q.Arg("id", id) return &SourceMap{ - query: q, + query: q, + client: r.client, + } +} + +// Load a Span from its ID. +func (r *Client) LoadSpanFromID(id SpanID) *Span { + q := r.query.Select("loadSpanFromID") + q = q.Arg("id", id) + + return &Span{ + query: q, + client: r.client, } } @@ -8950,7 +9291,8 @@ func (r *Client) LoadTerminalFromID(id TerminalID) *Terminal { q = q.Arg("id", id) return &Terminal{ - query: q, + query: q, + client: r.client, } } @@ -8960,7 +9302,8 @@ func (r *Client) LoadTypeDefFromID(id TypeDefID) *TypeDef { q = q.Arg("id", id) return &TypeDef{ - query: q, + query: q, + client: r.client, } } @@ -8969,7 +9312,8 @@ func (r *Client) Module() *Module { q := r.query.Select("module") return &Module{ - query: q, + query: q, + client: r.client, } } @@ -9009,7 +9353,18 @@ func (r *Client) ModuleSource(refString string, opts ...ModuleSourceOpts) *Modul q = q.Arg("refString", refString) return &ModuleSource{ - query: q, + query: q, + client: r.client, + } +} + +// Returns a span that reveals its child spans and hides itself. +func (r *Client) Reveal() *Span { + q := r.query.Select("reveal") + + return &Span{ + query: q, + client: r.client, } } @@ -9035,7 +9390,8 @@ func (r *Client) Secret(uri string, opts ...SecretOpts) *Secret { q = q.Arg("uri", uri) return &Secret{ - query: q, + query: q, + client: r.client, } } @@ -9048,7 +9404,8 @@ func (r *Client) SetSecret(name string, plaintext string) *Secret { q = q.Arg("plaintext", plaintext) return &Secret{ - query: q, + query: q, + client: r.client, } } @@ -9060,7 +9417,30 @@ func (r *Client) SourceMap(filename string, line int, column int) *SourceMap { q = q.Arg("column", column) return &SourceMap{ - query: q, + query: q, + client: r.client, + } +} + +// SpanOpts contains options for Client.Span +type SpanOpts struct { + Key string +} + +// Create a new OpenTelemetry span. +func (r *Client) Span(name string, opts ...SpanOpts) *Span { + q := r.query.Select("span") + for i := len(opts) - 1; i >= 0; i-- { + // `key` optional argument + if !querybuilder.IsZeroValue(opts[i].Key) { + q = q.Arg("key", opts[i].Key) + } + } + q = q.Arg("name", name) + + return &Span{ + query: q, + client: r.client, } } @@ -9069,7 +9449,8 @@ func (r *Client) TypeDef() *TypeDef { q := r.query.Select("typeDef") return &TypeDef{ - query: q, + query: q, + client: r.client, } } @@ -9085,7 +9466,8 @@ func (r *Client) Version(ctx context.Context) (string, error) { // The SDK config of the module. type SDKConfig struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client id *SDKConfigID source *string @@ -9093,7 +9475,8 @@ type SDKConfig struct { func (r *SDKConfig) WithGraphQLQuery(q *querybuilder.Selection) *SDKConfig { return &SDKConfig{ - query: q, + query: q, + client: r.client, } } @@ -9152,7 +9535,8 @@ func (r *SDKConfig) Source(ctx context.Context) (string, error) { // A definition of a custom scalar defined in a Module. type ScalarTypeDef struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client description *string id *ScalarTypeDefID @@ -9162,7 +9546,8 @@ type ScalarTypeDef struct { func (r *ScalarTypeDef) WithGraphQLQuery(q *querybuilder.Selection) *ScalarTypeDef { return &ScalarTypeDef{ - query: q, + query: q, + client: r.client, } } @@ -9247,7 +9632,8 @@ func (r *ScalarTypeDef) SourceModuleName(ctx context.Context) (string, error) { // A reference to a secret value, which can be handled more safely than the value itself. type Secret struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client id *SecretID name *string @@ -9257,7 +9643,8 @@ type Secret struct { func (r *Secret) WithGraphQLQuery(q *querybuilder.Selection) *Secret { return &Secret{ - query: q, + query: q, + client: r.client, } } @@ -9342,7 +9729,8 @@ func (r *Secret) URI(ctx context.Context) (string, error) { // A content-addressed service providing TCP connectivity. type Service struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client endpoint *string hostname *string @@ -9362,7 +9750,8 @@ func (r *Service) With(f WithServiceFunc) *Service { func (r *Service) WithGraphQLQuery(q *querybuilder.Selection) *Service { return &Service{ - query: q, + query: q, + client: r.client, } } @@ -9563,20 +9952,23 @@ func (r *Service) WithHostname(hostname string) *Service { q = q.Arg("hostname", hostname) return &Service{ - query: q, + query: q, + client: r.client, } } // A Unix or TCP/IP socket that can be mounted into a container. type Socket struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client id *SocketID } func (r *Socket) WithGraphQLQuery(q *querybuilder.Selection) *Socket { return &Socket{ - query: q, + query: q, + client: r.client, } } @@ -9622,7 +10014,8 @@ func (r *Socket) MarshalJSON() ([]byte, error) { // Source location information. type SourceMap struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client column *int filename *string @@ -9633,7 +10026,8 @@ type SourceMap struct { func (r *SourceMap) WithGraphQLQuery(q *querybuilder.Selection) *SourceMap { return &SourceMap{ - query: q, + query: q, + client: r.client, } } @@ -9729,9 +10123,216 @@ func (r *SourceMap) Module(ctx context.Context) (string, error) { return response, q.Execute(ctx) } +// An OpenTelemetry span. +type Span struct { + query *querybuilder.Selection + client graphql.Client + + end *Void + id *SpanID + internalId *string + name *string + start *SpanID +} +type WithSpanFunc func(r *Span) *Span + +// With calls the provided function with current Span. +// +// This is useful for reusability and readability by not breaking the calling chain. +func (r *Span) With(f WithSpanFunc) *Span { + return f(r) +} + +func (r *Span) WithGraphQLQuery(q *querybuilder.Selection) *Span { + return &Span{ + query: q, + client: r.client, + } +} +func (r *Span) Context(ctx context.Context) (context.Context, *Span) { + started, err := r.Start(ctx) + if err != nil { + panic(err) + } + spanIDHex, err := started.InternalID(ctx) + if err != nil { + panic(err) + } + spanID, err := trace.SpanIDFromHex(spanIDHex) + if err != nil { + panic(err) + } + spanCtx := trace.SpanContextFromContext(ctx) + return trace.ContextWithSpanContext(ctx, trace.NewSpanContext(trace.SpanContextConfig{ + TraceID: spanCtx.TraceID(), + SpanID: spanID, + Remote: true, + TraceFlags: spanCtx.TraceFlags(), + TraceState: spanCtx.TraceState(), + })), started +} +func (r *Span) Run(ctx context.Context, cb func(context.Context) error) error { + ctx, span := r.Context(ctx) + err := cb(ctx) + var endErr error + if err != nil { + errClient := &Client{ + query: querybuilder.Query().Client(r.client), + client: r.client, + } + endErr = span.End(ctx, SpanEndOpts{ + Error: errClient.Error(err.Error()), + }) + } else { + endErr = span.End(ctx) + } + return errors.Join(err, endErr) +} + +// SpanEndOpts contains options for Span.End +type SpanEndOpts struct { + Error *Error +} + +// End the OpenTelemetry span, with an optional error. +func (r *Span) End(ctx context.Context, opts ...SpanEndOpts) error { + if r.end != nil { + return nil + } + q := r.query.Select("end") + for i := len(opts) - 1; i >= 0; i-- { + // `error` optional argument + if !querybuilder.IsZeroValue(opts[i].Error) { + q = q.Arg("error", opts[i].Error) + } + } + + return q.Execute(ctx) +} + +// A unique identifier for this Span. +func (r *Span) ID(ctx context.Context) (SpanID, error) { + if r.id != nil { + return *r.id, nil + } + q := r.query.Select("id") + + var response SpanID + + q = q.Bind(&response) + return response, q.Execute(ctx) +} + +// XXX_GraphQLType is an internal function. It returns the native GraphQL type name +func (r *Span) XXX_GraphQLType() string { + return "Span" +} + +// XXX_GraphQLIDType is an internal function. It returns the native GraphQL type name for the ID of this object +func (r *Span) XXX_GraphQLIDType() string { + return "SpanID" +} + +// XXX_GraphQLID is an internal function. It returns the underlying type ID +func (r *Span) XXX_GraphQLID(ctx context.Context) (string, error) { + id, err := r.ID(ctx) + if err != nil { + return "", err + } + return string(id), nil +} + +func (r *Span) MarshalJSON() ([]byte, error) { + id, err := r.ID(marshalCtx) + if err != nil { + return nil, err + } + return json.Marshal(id) +} + +// Returns the internal ID of the span. +func (r *Span) InternalID(ctx context.Context) (string, error) { + if r.internalId != nil { + return *r.internalId, nil + } + q := r.query.Select("internalId") + + var response string + + q = q.Bind(&response) + return response, q.Execute(ctx) +} + +// The name of the span. +func (r *Span) Name(ctx context.Context) (string, error) { + if r.name != nil { + return *r.name, nil + } + q := r.query.Select("name") + + var response string + + q = q.Bind(&response) + return response, q.Execute(ctx) +} + +// Start a new instance of the span. +func (r *Span) Start(ctx context.Context) (*Span, error) { + q := r.query.Select("start") + + var id SpanID + if err := q.Bind(&id).Execute(ctx); err != nil { + return nil, err + } + return &Span{ + query: q.Root().Select("loadSpanFromID").Arg("id", id), + }, nil +} + +func (r *Span) WithActor(actor string) *Span { + q := r.query.Select("withActor") + q = q.Arg("actor", actor) + + return &Span{ + query: q, + client: r.client, + } +} + +// Returns a new span with the internal attribute set to true. +func (r *Span) WithInternal() *Span { + q := r.query.Select("withInternal") + + return &Span{ + query: q, + client: r.client, + } +} + +// Returns a new span with the passthrough attribute set to true. +func (r *Span) WithPassthrough() *Span { + q := r.query.Select("withPassthrough") + + return &Span{ + query: q, + client: r.client, + } +} + +// Returns a new span with the reveal attribute set to true. +func (r *Span) WithReveal() *Span { + q := r.query.Select("withReveal") + + return &Span{ + query: q, + client: r.client, + } +} + // An interactive terminal that clients can connect to. type Terminal struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client id *TerminalID sync *TerminalID @@ -9739,7 +10340,8 @@ type Terminal struct { func (r *Terminal) WithGraphQLQuery(q *querybuilder.Selection) *Terminal { return &Terminal{ - query: q, + query: q, + client: r.client, } } @@ -9800,7 +10402,8 @@ func (r *Terminal) Sync(ctx context.Context) (*Terminal, error) { // A definition of a parameter or return type in a Module. type TypeDef struct { - query *querybuilder.Selection + query *querybuilder.Selection + client graphql.Client id *TypeDefID kind *TypeDefKind @@ -9817,7 +10420,8 @@ func (r *TypeDef) With(f WithTypeDefFunc) *TypeDef { func (r *TypeDef) WithGraphQLQuery(q *querybuilder.Selection) *TypeDef { return &TypeDef{ - query: q, + query: q, + client: r.client, } } @@ -9826,7 +10430,8 @@ func (r *TypeDef) AsEnum() *EnumTypeDef { q := r.query.Select("asEnum") return &EnumTypeDef{ - query: q, + query: q, + client: r.client, } } @@ -9835,7 +10440,8 @@ func (r *TypeDef) AsInput() *InputTypeDef { q := r.query.Select("asInput") return &InputTypeDef{ - query: q, + query: q, + client: r.client, } } @@ -9844,7 +10450,8 @@ func (r *TypeDef) AsInterface() *InterfaceTypeDef { q := r.query.Select("asInterface") return &InterfaceTypeDef{ - query: q, + query: q, + client: r.client, } } @@ -9853,7 +10460,8 @@ func (r *TypeDef) AsList() *ListTypeDef { q := r.query.Select("asList") return &ListTypeDef{ - query: q, + query: q, + client: r.client, } } @@ -9862,7 +10470,8 @@ func (r *TypeDef) AsObject() *ObjectTypeDef { q := r.query.Select("asObject") return &ObjectTypeDef{ - query: q, + query: q, + client: r.client, } } @@ -9871,7 +10480,8 @@ func (r *TypeDef) AsScalar() *ScalarTypeDef { q := r.query.Select("asScalar") return &ScalarTypeDef{ - query: q, + query: q, + client: r.client, } } @@ -9948,7 +10558,8 @@ func (r *TypeDef) WithConstructor(function *Function) *TypeDef { q = q.Arg("function", function) return &TypeDef{ - query: q, + query: q, + client: r.client, } } @@ -9978,7 +10589,8 @@ func (r *TypeDef) WithEnum(name string, opts ...TypeDefWithEnumOpts) *TypeDef { q = q.Arg("name", name) return &TypeDef{ - query: q, + query: q, + client: r.client, } } @@ -10012,7 +10624,8 @@ func (r *TypeDef) WithEnumMember(name string, opts ...TypeDefWithEnumMemberOpts) q = q.Arg("name", name) return &TypeDef{ - query: q, + query: q, + client: r.client, } } @@ -10042,7 +10655,8 @@ func (r *TypeDef) WithEnumValue(value string, opts ...TypeDefWithEnumValueOpts) q = q.Arg("value", value) return &TypeDef{ - query: q, + query: q, + client: r.client, } } @@ -10072,7 +10686,8 @@ func (r *TypeDef) WithField(name string, typeDef *TypeDef, opts ...TypeDefWithFi q = q.Arg("typeDef", typeDef) return &TypeDef{ - query: q, + query: q, + client: r.client, } } @@ -10083,7 +10698,8 @@ func (r *TypeDef) WithFunction(function *Function) *TypeDef { q = q.Arg("function", function) return &TypeDef{ - query: q, + query: q, + client: r.client, } } @@ -10110,7 +10726,8 @@ func (r *TypeDef) WithInterface(name string, opts ...TypeDefWithInterfaceOpts) * q = q.Arg("name", name) return &TypeDef{ - query: q, + query: q, + client: r.client, } } @@ -10120,7 +10737,8 @@ func (r *TypeDef) WithKind(kind TypeDefKind) *TypeDef { q = q.Arg("kind", kind) return &TypeDef{ - query: q, + query: q, + client: r.client, } } @@ -10131,7 +10749,8 @@ func (r *TypeDef) WithListOf(elementType *TypeDef) *TypeDef { q = q.Arg("elementType", elementType) return &TypeDef{ - query: q, + query: q, + client: r.client, } } @@ -10160,7 +10779,8 @@ func (r *TypeDef) WithObject(name string, opts ...TypeDefWithObjectOpts) *TypeDe q = q.Arg("name", name) return &TypeDef{ - query: q, + query: q, + client: r.client, } } @@ -10170,7 +10790,8 @@ func (r *TypeDef) WithOptional(optional bool) *TypeDef { q = q.Arg("optional", optional) return &TypeDef{ - query: q, + query: q, + client: r.client, } } @@ -10191,7 +10812,8 @@ func (r *TypeDef) WithScalar(name string, opts ...TypeDefWithScalarOpts) *TypeDe q = q.Arg("name", name) return &TypeDef{ - query: q, + query: q, + client: r.client, } } diff --git a/sdk/php/generated/Client.php b/sdk/php/generated/Client.php index 7d6c9de466f..3cc2e9c32b1 100644 --- a/sdk/php/generated/Client.php +++ b/sdk/php/generated/Client.php @@ -683,6 +683,16 @@ public function loadSourceMapFromID(SourceMapId|SourceMap $id): SourceMap return new \Dagger\SourceMap($this->client, $this->queryBuilderChain->chain($innerQueryBuilder)); } + /** + * Load a Span from its ID. + */ + public function loadSpanFromID(SpanId|Span $id): Span + { + $innerQueryBuilder = new \Dagger\Client\QueryBuilder('loadSpanFromID'); + $innerQueryBuilder->setArgument('id', $id); + return new \Dagger\Span($this->client, $this->queryBuilderChain->chain($innerQueryBuilder)); + } + /** * Load a Terminal from its ID. */ @@ -739,6 +749,15 @@ public function moduleSource( return new \Dagger\ModuleSource($this->client, $this->queryBuilderChain->chain($innerQueryBuilder)); } + /** + * Returns a span that reveals its child spans and hides itself. + */ + public function reveal(): Span + { + $innerQueryBuilder = new \Dagger\Client\QueryBuilder('reveal'); + return new \Dagger\Span($this->client, $this->queryBuilderChain->chain($innerQueryBuilder)); + } + /** * Creates a new secret. */ @@ -777,6 +796,19 @@ public function sourceMap(string $filename, int $line, int $column): SourceMap return new \Dagger\SourceMap($this->client, $this->queryBuilderChain->chain($innerQueryBuilder)); } + /** + * Create a new OpenTelemetry span. + */ + public function span(string $name, ?string $key = ''): Span + { + $innerQueryBuilder = new \Dagger\Client\QueryBuilder('span'); + $innerQueryBuilder->setArgument('name', $name); + if (null !== $key) { + $innerQueryBuilder->setArgument('key', $key); + } + return new \Dagger\Span($this->client, $this->queryBuilderChain->chain($innerQueryBuilder)); + } + /** * Create a new TypeDef. */ diff --git a/sdk/php/generated/Span.php b/sdk/php/generated/Span.php new file mode 100644 index 00000000000..6d6e9f21c24 --- /dev/null +++ b/sdk/php/generated/Span.php @@ -0,0 +1,97 @@ +setArgument('error', $error); + } + $this->queryLeaf($leafQueryBuilder, 'end'); + } + + /** + * A unique identifier for this Span. + */ + public function id(): SpanId + { + $leafQueryBuilder = new \Dagger\Client\QueryBuilder('id'); + return new \Dagger\SpanId((string)$this->queryLeaf($leafQueryBuilder, 'id')); + } + + /** + * Returns the internal ID of the span. + */ + public function internalId(): string + { + $leafQueryBuilder = new \Dagger\Client\QueryBuilder('internalId'); + return (string)$this->queryLeaf($leafQueryBuilder, 'internalId'); + } + + /** + * The name of the span. + */ + public function name(): string + { + $leafQueryBuilder = new \Dagger\Client\QueryBuilder('name'); + return (string)$this->queryLeaf($leafQueryBuilder, 'name'); + } + + /** + * Start a new instance of the span. + */ + public function start(): SpanId + { + $leafQueryBuilder = new \Dagger\Client\QueryBuilder('start'); + return new \Dagger\SpanId((string)$this->queryLeaf($leafQueryBuilder, 'start')); + } + + public function withActor(string $actor): Span + { + $innerQueryBuilder = new \Dagger\Client\QueryBuilder('withActor'); + $innerQueryBuilder->setArgument('actor', $actor); + return new \Dagger\Span($this->client, $this->queryBuilderChain->chain($innerQueryBuilder)); + } + + /** + * Returns a new span with the internal attribute set to true. + */ + public function withInternal(): Span + { + $innerQueryBuilder = new \Dagger\Client\QueryBuilder('withInternal'); + return new \Dagger\Span($this->client, $this->queryBuilderChain->chain($innerQueryBuilder)); + } + + /** + * Returns a new span with the passthrough attribute set to true. + */ + public function withPassthrough(): Span + { + $innerQueryBuilder = new \Dagger\Client\QueryBuilder('withPassthrough'); + return new \Dagger\Span($this->client, $this->queryBuilderChain->chain($innerQueryBuilder)); + } + + /** + * Returns a new span with the reveal attribute set to true. + */ + public function withReveal(): Span + { + $innerQueryBuilder = new \Dagger\Client\QueryBuilder('withReveal'); + return new \Dagger\Span($this->client, $this->queryBuilderChain->chain($innerQueryBuilder)); + } +} diff --git a/sdk/php/generated/SpanId.php b/sdk/php/generated/SpanId.php new file mode 100644 index 00000000000..4440c3fc383 --- /dev/null +++ b/sdk/php/generated/SpanId.php @@ -0,0 +1,16 @@ + "SourceMap": _ctx = self._select("loadSourceMapFromID", _args) return SourceMap(_ctx) + def load_span_from_id(self, id: SpanID) -> "Span": + """Load a Span from its ID.""" + _args = [ + Arg("id", id), + ] + _ctx = self._select("loadSpanFromID", _args) + return Span(_ctx) + def load_terminal_from_id(self, id: TerminalID) -> "Terminal": """Load a Terminal from its ID.""" _args = [ @@ -9003,6 +9016,12 @@ def module_source( _ctx = self._select("moduleSource", _args) return ModuleSource(_ctx) + def reveal(self) -> "Span": + """Returns a span that reveals its child spans and hides itself.""" + _args: list[Arg] = [] + _ctx = self._select("reveal", _args) + return Span(_ctx) + def secret( self, uri: str, @@ -9078,6 +9097,22 @@ def source_map( _ctx = self._select("sourceMap", _args) return SourceMap(_ctx) + def span(self, name: str, *, key: str | None = "") -> "Span": + """Create a new OpenTelemetry span. + + Parameters + ---------- + name: + Name of the span. + key: + """ + _args = [ + Arg("name", name), + Arg("key", key, ""), + ] + _ctx = self._select("span", _args) + return Span(_ctx) + def type_def(self) -> "TypeDef": """Create a new TypeDef.""" _args: list[Arg] = [] @@ -9679,6 +9714,196 @@ async def module(self) -> str: return await _ctx.execute(str) +@typecheck +class Span(Type): + """An OpenTelemetry span.""" + + async def end(self, *, error: Error | None = None) -> Void | None: + """End the OpenTelemetry span, with an optional error. + + Returns + ------- + Void | None + The absence of a value. A Null Void is used as a placeholder for + resolvers that do not return anything. + + Raises + ------ + ExecuteTimeoutError + If the time to execute the query exceeds the configured timeout. + QueryError + If the API returns an error. + """ + _args = [ + Arg("error", error, None), + ] + _ctx = self._select("end", _args) + await _ctx.execute() + + async def id(self) -> SpanID: + """A unique identifier for this Span. + + Note + ---- + This is lazily evaluated, no operation is actually run. + + Returns + ------- + SpanID + The `SpanID` scalar type represents an identifier for an object of + type Span. + + Raises + ------ + ExecuteTimeoutError + If the time to execute the query exceeds the configured timeout. + QueryError + If the API returns an error. + """ + _args: list[Arg] = [] + _ctx = self._select("id", _args) + return await _ctx.execute(SpanID) + + async def internal_id(self) -> str: + """Returns the internal ID of the span. + + Returns + ------- + str + The `String` scalar type represents textual data, represented as + UTF-8 character sequences. The String type is most often used by + GraphQL to represent free-form human-readable text. + + Raises + ------ + ExecuteTimeoutError + If the time to execute the query exceeds the configured timeout. + QueryError + If the API returns an error. + """ + _args: list[Arg] = [] + _ctx = self._select("internalId", _args) + return await _ctx.execute(str) + + async def name(self) -> str: + """The name of the span. + + Returns + ------- + str + The `String` scalar type represents textual data, represented as + UTF-8 character sequences. The String type is most often used by + GraphQL to represent free-form human-readable text. + + Raises + ------ + ExecuteTimeoutError + If the time to execute the query exceeds the configured timeout. + QueryError + If the API returns an error. + """ + _args: list[Arg] = [] + _ctx = self._select("name", _args) + return await _ctx.execute(str) + + async def start(self) -> Self: + """Start a new instance of the span. + + Raises + ------ + ExecuteTimeoutError + If the time to execute the query exceeds the configured timeout. + QueryError + If the API returns an error. + """ + _args: list[Arg] = [] + return await self._ctx.execute_sync(self, "start", _args) + + def with_actor(self, actor: str) -> Self: + _args = [ + Arg("actor", actor), + ] + _ctx = self._select("withActor", _args) + return Span(_ctx) + + def with_internal(self) -> Self: + """Returns a new span with the internal attribute set to true.""" + _args: list[Arg] = [] + _ctx = self._select("withInternal", _args) + return Span(_ctx) + + def with_passthrough(self) -> Self: + """Returns a new span with the passthrough attribute set to true.""" + _args: list[Arg] = [] + _ctx = self._select("withPassthrough", _args) + return Span(_ctx) + + def with_reveal(self) -> Self: + """Returns a new span with the reveal attribute set to true.""" + _args: list[Arg] = [] + _ctx = self._select("withReveal", _args) + return Span(_ctx) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.token = None + self.started = None + + async def __aenter__(self) -> "Span": + # Fetch the actual span ID created by the engine + started = await self.start() + span_id_hex = await started.internal_id() + span_id = int(span_id_hex, 16) + + # Get the current span context + current_span = opentelemetry.trace.get_current_span() + current_span_context = current_span.get_span_context() + + # Extract trace ID and other fields from the current span context + trace_id = current_span_context.trace_id + trace_flags = current_span_context.trace_flags + trace_state = current_span_context.trace_state + + # Construct the new SpanContext + new_span_context = opentelemetry.trace.SpanContext( + trace_id=trace_id, + span_id=span_id, + is_remote=True, + trace_flags=trace_flags, + trace_state=trace_state or TraceState(), + ) + + # Create a new context with the new SpanContext + new_context = opentelemetry.trace.set_span_in_context( + opentelemetry.trace.NonRecordingSpan(new_span_context) + ) + + # Attach the new context and save the token for detachment + self.token = opentelemetry.context.attach(new_context) + self.started = started + return started + + async def __aexit__( + self, exception_type, exception_value, exception_traceback + ) -> Void | None: + error: Error | None = None + void: Void | None = None + if exception_type: + error = dag.error(f"{exception_type.__name__}: {exception_value}") + if self.started: + void = await self.started.end(error=error) + if self.token: + opentelemetry.context.detach(self.token) + return void + + def with_(self, cb: Callable[["Span"], "Span"]) -> "Span": + """Call the provided callable with current Span. + + This is useful for reusability and readability by not breaking the calling chain. + """ + return cb(self) + + @typecheck class Terminal(Type): """An interactive terminal that clients can connect to.""" @@ -10174,6 +10399,8 @@ def with_(self, cb: Callable[["TypeDef"], "TypeDef"]) -> "TypeDef": "SocketID", "SourceMap", "SourceMapID", + "Span", + "SpanID", "Terminal", "TerminalID", "TypeDef", diff --git a/sdk/rust/crates/dagger-sdk/src/gen.rs b/sdk/rust/crates/dagger-sdk/src/gen.rs index 2afa993949b..8c72f9103d1 100644 --- a/sdk/rust/crates/dagger-sdk/src/gen.rs +++ b/sdk/rust/crates/dagger-sdk/src/gen.rs @@ -1517,6 +1517,39 @@ impl SourceMapId { } } #[derive(Serialize, Deserialize, PartialEq, Debug, Clone)] +pub struct SpanId(pub String); +impl From<&str> for SpanId { + fn from(value: &str) -> Self { + Self(value.to_string()) + } +} +impl From for SpanId { + fn from(value: String) -> Self { + Self(value) + } +} +impl IntoID for Span { + fn into_id( + self, + ) -> std::pin::Pin> + Send>> + { + Box::pin(async move { self.id().await }) + } +} +impl IntoID for SpanId { + fn into_id( + self, + ) -> std::pin::Pin> + Send>> + { + Box::pin(async move { Ok::(self) }) + } +} +impl SpanId { + fn quote(&self) -> String { + format!("\"{}\"", self.0.clone()) + } +} +#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)] pub struct TerminalId(pub String); impl From<&str> for TerminalId { fn from(value: &str) -> Self { @@ -8416,6 +8449,11 @@ pub struct QuerySecretOpts<'a> { #[builder(setter(into, strip_option), default)] pub cache_key: Option<&'a str>, } +#[derive(Builder, Debug, PartialEq)] +pub struct QuerySpanOpts<'a> { + #[builder(setter(into, strip_option), default)] + pub key: Option<&'a str>, +} impl Query { /// Constructs a cache volume for a given cache key. /// @@ -9500,6 +9538,22 @@ impl Query { graphql_client: self.graphql_client.clone(), } } + /// Load a Span from its ID. + pub fn load_span_from_id(&self, id: impl IntoID) -> Span { + let mut query = self.selection.select("loadSpanFromID"); + query = query.arg_lazy( + "id", + Box::new(move || { + let id = id.clone(); + Box::pin(async move { id.into_id().await.unwrap().quote() }) + }), + ); + Span { + proc: self.proc.clone(), + selection: query, + graphql_client: self.graphql_client.clone(), + } + } /// Load a Terminal from its ID. pub fn load_terminal_from_id(&self, id: impl IntoID) -> Terminal { let mut query = self.selection.select("loadTerminalFromID"); @@ -9587,6 +9641,15 @@ impl Query { graphql_client: self.graphql_client.clone(), } } + /// Returns a span that reveals its child spans and hides itself. + pub fn reveal(&self) -> Span { + let query = self.selection.select("reveal"); + Span { + proc: self.proc.clone(), + selection: query, + graphql_client: self.graphql_client.clone(), + } + } /// Creates a new secret. /// /// # Arguments @@ -9655,6 +9718,39 @@ impl Query { graphql_client: self.graphql_client.clone(), } } + /// Create a new OpenTelemetry span. + /// + /// # Arguments + /// + /// * `name` - Name of the span. + /// * `opt` - optional argument, see inner type for documentation, use _opts to use + pub fn span(&self, name: impl Into) -> Span { + let mut query = self.selection.select("span"); + query = query.arg("name", name.into()); + Span { + proc: self.proc.clone(), + selection: query, + graphql_client: self.graphql_client.clone(), + } + } + /// Create a new OpenTelemetry span. + /// + /// # Arguments + /// + /// * `name` - Name of the span. + /// * `opt` - optional argument, see inner type for documentation, use _opts to use + pub fn span_opts<'a>(&self, name: impl Into, opts: QuerySpanOpts<'a>) -> Span { + let mut query = self.selection.select("span"); + query = query.arg("name", name.into()); + if let Some(key) = opts.key { + query = query.arg("key", key); + } + Span { + proc: self.proc.clone(), + selection: query, + graphql_client: self.graphql_client.clone(), + } + } /// Create a new TypeDef. pub fn type_def(&self) -> TypeDef { let query = self.selection.select("typeDef"); @@ -9939,6 +10035,96 @@ impl SourceMap { } } #[derive(Clone)] +pub struct Span { + pub proc: Option>, + pub selection: Selection, + pub graphql_client: DynGraphQLClient, +} +#[derive(Builder, Debug, PartialEq)] +pub struct SpanEndOpts { + #[builder(setter(into, strip_option), default)] + pub error: Option, +} +impl Span { + /// End the OpenTelemetry span, with an optional error. + /// + /// # Arguments + /// + /// * `opt` - optional argument, see inner type for documentation, use _opts to use + pub async fn end(&self) -> Result { + let query = self.selection.select("end"); + query.execute(self.graphql_client.clone()).await + } + /// End the OpenTelemetry span, with an optional error. + /// + /// # Arguments + /// + /// * `opt` - optional argument, see inner type for documentation, use _opts to use + pub async fn end_opts(&self, opts: SpanEndOpts) -> Result { + let mut query = self.selection.select("end"); + if let Some(error) = opts.error { + query = query.arg("error", error); + } + query.execute(self.graphql_client.clone()).await + } + /// A unique identifier for this Span. + pub async fn id(&self) -> Result { + let query = self.selection.select("id"); + query.execute(self.graphql_client.clone()).await + } + /// Returns the internal ID of the span. + pub async fn internal_id(&self) -> Result { + let query = self.selection.select("internalId"); + query.execute(self.graphql_client.clone()).await + } + /// The name of the span. + pub async fn name(&self) -> Result { + let query = self.selection.select("name"); + query.execute(self.graphql_client.clone()).await + } + /// Start a new instance of the span. + pub async fn start(&self) -> Result { + let query = self.selection.select("start"); + query.execute(self.graphql_client.clone()).await + } + pub fn with_actor(&self, actor: impl Into) -> Span { + let mut query = self.selection.select("withActor"); + query = query.arg("actor", actor.into()); + Span { + proc: self.proc.clone(), + selection: query, + graphql_client: self.graphql_client.clone(), + } + } + /// Returns a new span with the internal attribute set to true. + pub fn with_internal(&self) -> Span { + let query = self.selection.select("withInternal"); + Span { + proc: self.proc.clone(), + selection: query, + graphql_client: self.graphql_client.clone(), + } + } + /// Returns a new span with the passthrough attribute set to true. + pub fn with_passthrough(&self) -> Span { + let query = self.selection.select("withPassthrough"); + Span { + proc: self.proc.clone(), + selection: query, + graphql_client: self.graphql_client.clone(), + } + } + /// Returns a new span with the reveal attribute set to true. + pub fn with_reveal(&self) -> Span { + let query = self.selection.select("withReveal"); + Span { + proc: self.proc.clone(), + selection: query, + graphql_client: self.graphql_client.clone(), + } + } +} +#[derive(Clone)] pub struct Terminal { pub proc: Option>, pub selection: Selection, diff --git a/sdk/typescript/src/api/client.gen.ts b/sdk/typescript/src/api/client.gen.ts index d9e3b743242..40c2a6f0581 100644 --- a/sdk/typescript/src/api/client.gen.ts +++ b/sdk/typescript/src/api/client.gen.ts @@ -2,6 +2,8 @@ * This file was auto-generated by `client-gen`. * Do not make direct changes to the file. */ +import * as opentelemetry from "@opentelemetry/api" + import { Context } from "../common/context.js" /** @@ -1318,6 +1320,10 @@ export type ClientSecretOpts = { cacheKey?: string } +export type ClientSpanOpts = { + key?: string +} + /** * Expected return type of an execution */ @@ -1400,6 +1406,15 @@ export type SocketID = string & { __SocketID: never } */ export type SourceMapID = string & { __SourceMapID: never } +export type SpanEndOpts = { + error?: Error +} + +/** + * The `SpanID` scalar type represents an identifier for an object of type Span. + */ +export type SpanID = string & { __SpanID: never } + /** * The `TerminalID` scalar type represents an identifier for an object of type Terminal. */ @@ -8366,6 +8381,14 @@ export class Client extends BaseClient { return new SourceMap(ctx) } + /** + * Load a Span from its ID. + */ + loadSpanFromID = (id: SpanID): Span => { + const ctx = this._ctx.select("loadSpanFromID", { id }) + return new Span(ctx) + } + /** * Load a Terminal from its ID. */ @@ -8414,6 +8437,14 @@ export class Client extends BaseClient { return new ModuleSource(ctx) } + /** + * Returns a span that reveals its child spans and hides itself. + */ + reveal = (): Span => { + const ctx = this._ctx.select("reveal") + return new Span(ctx) + } + /** * Creates a new secret. * @param uri The URI of the secret store @@ -8451,6 +8482,15 @@ export class Client extends BaseClient { return new SourceMap(ctx) } + /** + * Create a new OpenTelemetry span. + * @param name Name of the span. + */ + span = (name: string, opts?: ClientSpanOpts): Span => { + const ctx = this._ctx.select("span", { name, ...opts }) + return new Span(ctx) + } + /** * Create a new TypeDef. */ @@ -8992,6 +9032,191 @@ export class SourceMap extends BaseClient { } } +/** + * An OpenTelemetry span. + */ +export class Span extends BaseClient { + private readonly _id?: SpanID = undefined + private readonly _end?: Void = undefined + private readonly _internalId?: string = undefined + private readonly _name?: string = undefined + private readonly _start?: SpanID = undefined + + /** + * Constructor is used for internal usage only, do not create object from it. + */ + constructor( + ctx?: Context, + _id?: SpanID, + _end?: Void, + _internalId?: string, + _name?: string, + _start?: SpanID, + ) { + super(ctx) + + this._id = _id + this._end = _end + this._internalId = _internalId + this._name = _name + this._start = _start + } + + /** + * A unique identifier for this Span. + */ + id = async (): Promise => { + if (this._id) { + return this._id + } + + const ctx = this._ctx.select("id") + + const response: Awaited = await ctx.execute() + + return response + } + + /** + * End the OpenTelemetry span, with an optional error. + */ + end = async (opts?: SpanEndOpts): Promise => { + if (this._end) { + return + } + + const ctx = this._ctx.select("end", { ...opts }) + + await ctx.execute() + } + + /** + * Returns the internal ID of the span. + */ + internalId = async (): Promise => { + if (this._internalId) { + return this._internalId + } + + const ctx = this._ctx.select("internalId") + + const response: Awaited = await ctx.execute() + + return response + } + + /** + * The name of the span. + */ + name = async (): Promise => { + if (this._name) { + return this._name + } + + const ctx = this._ctx.select("name") + + const response: Awaited = await ctx.execute() + + return response + } + + /** + * Start a new instance of the span. + */ + start = async (): Promise => { + const ctx = this._ctx.select("start") + + const response: Awaited = await ctx.execute() + + return new Client(ctx.copy()).loadSpanFromID(response) + } + withActor = (actor: string): Span => { + const ctx = this._ctx.select("withActor", { actor }) + return new Span(ctx) + } + + /** + * Returns a new span with the internal attribute set to true. + */ + withInternal = (): Span => { + const ctx = this._ctx.select("withInternal") + return new Span(ctx) + } + + /** + * Returns a new span with the passthrough attribute set to true. + */ + withPassthrough = (): Span => { + const ctx = this._ctx.select("withPassthrough") + return new Span(ctx) + } + + /** + * Returns a new span with the reveal attribute set to true. + */ + withReveal = (): Span => { + const ctx = this._ctx.select("withReveal") + return new Span(ctx) + } + + public async run(fn: (span: Span) => Promise) { + const started = await this.start() + const spanIdHex = await started.internalId() + + // Get the current span context + const currentSpan = + opentelemetry.trace.getSpan(opentelemetry.context.active()) || undefined + const currentSpanContext = currentSpan?.spanContext() + + if (!currentSpanContext) { + return await fn(this) + } + + // Extract trace ID and other fields + const traceId = currentSpanContext.traceId + const traceFlags = currentSpanContext.traceFlags + const traceState = currentSpanContext.traceState + + // Construct the new SpanContext + const newSpanContext: opentelemetry.SpanContext = { + traceId, + spanId: spanIdHex, + traceFlags, + isRemote: true, + traceState, + } + + // Bind the new context + const newContext = opentelemetry.trace.setSpan( + opentelemetry.context.active(), + opentelemetry.trace.wrapSpanContext(newSpanContext), + ) + + let spanError: Error | undefined = undefined + try { + return await opentelemetry.context.with(newContext, fn, this, started) + } catch (e: unknown) { + if (e instanceof globalThis.Error) { + spanError = dag.error(e.message) + } else { + spanError = dag.error(`Unknown error: ${e}`) + } + throw e + } finally { + await started.end({ error: spanError }) + } + } + + /** + * Call the provided function with current Span. + * + * This is useful for reusability and readability by not breaking the calling chain. + */ + with = (arg: (param: Span) => Span) => { + return arg(this) + } +} + /** * An interactive terminal that clients can connect to. */ From 0ac64ffd375016185ec1594d835ac2bec72c7bc0 Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Tue, 24 Jun 2025 22:01:13 -0400 Subject: [PATCH 20/36] lint: ignore all of viztest Signed-off-by: Alex Suraci --- .dagger/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.dagger/main.go b/.dagger/main.go index 14af575f001..f4043f6147e 100644 --- a/.dagger/main.go +++ b/.dagger/main.go @@ -120,7 +120,7 @@ func (dev *DaggerDev) Lint( if strings.HasPrefix(pkg, "core/integration/") { continue } - if strings.HasPrefix(pkg, "dagql/idtui/viztest/broken") { + if strings.HasPrefix(pkg, "dagql/idtui/viztest/") { continue } if strings.HasPrefix(pkg, "modules/evaluator/") { From 80c2069bb44d148ee1e5189a96691cef0a1e9ee2 Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Thu, 26 Jun 2025 15:28:24 -0400 Subject: [PATCH 21/36] Revert "sdk/typescript: add opentelemetry dependency" This reverts commit 8b57e44ffe26c33b4c527ec69852533a710c4e6d. Signed-off-by: Alex Suraci --- sdk/typescript/runtime/template/package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sdk/typescript/runtime/template/package.json b/sdk/typescript/runtime/template/package.json index 4a443964dfe..cf9966abab6 100644 --- a/sdk/typescript/runtime/template/package.json +++ b/sdk/typescript/runtime/template/package.json @@ -1,7 +1,6 @@ { "type": "module", "dependencies": { - "typescript": "^5.5.4", - "@opentelemetry/api": "^1.9.0" + "typescript": "^5.5.4" } } From 42b602bc8a6aab788427d0e499655607b470c523 Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Thu, 26 Jun 2025 16:20:46 -0400 Subject: [PATCH 22/36] restore python otel imports Signed-off-by: Alex Suraci --- sdk/python/codegen/src/codegen/generator.py | 3 +++ sdk/python/src/dagger/client/gen.py | 3 +++ 2 files changed, 6 insertions(+) diff --git a/sdk/python/codegen/src/codegen/generator.py b/sdk/python/codegen/src/codegen/generator.py index b894339362f..cb4771f3736 100644 --- a/sdk/python/codegen/src/codegen/generator.py +++ b/sdk/python/codegen/src/codegen/generator.py @@ -191,6 +191,9 @@ def generate(schema: GraphQLSchema) -> Iterator[str]: import warnings # noqa: F401 from collections.abc import Callable from dataclasses import dataclass + import opentelemetry.trace + import opentelemetry.context + from opentelemetry.trace.span import TraceState from typing_extensions import Self diff --git a/sdk/python/src/dagger/client/gen.py b/sdk/python/src/dagger/client/gen.py index 09ed30dd57c..347f666db7a 100644 --- a/sdk/python/src/dagger/client/gen.py +++ b/sdk/python/src/dagger/client/gen.py @@ -4,6 +4,9 @@ from collections.abc import Callable from dataclasses import dataclass +import opentelemetry.context +import opentelemetry.trace +from opentelemetry.trace.span import TraceState from typing_extensions import Self from dagger.client._core import Arg From 6c3d729ebec9334bcc0c913566866b7fd6f602de Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Thu, 26 Jun 2025 16:34:16 -0400 Subject: [PATCH 23/36] update TestTelemetry gold Signed-off-by: Alex Suraci --- .../TestTelemetry/TestGolden/nested-spans | 78 ++++++++++--------- .../TestTelemetry/TestGolden/nested-spans#01 | 75 +++++++++--------- .../TestGolden/python/nested-spans | 50 ++++++++++++ .../TestGolden/python/nested-spans#01 | 44 +++++++++++ .../TestGolden/typescript/nested-spans | 50 ++++++++++++ .../TestGolden/typescript/nested-spans#01 | 44 +++++++++++ 6 files changed, 269 insertions(+), 72 deletions(-) create mode 100644 dagql/idtui/testdata/TestTelemetry/TestGolden/python/nested-spans create mode 100644 dagql/idtui/testdata/TestTelemetry/TestGolden/python/nested-spans#01 create mode 100644 dagql/idtui/testdata/TestTelemetry/TestGolden/typescript/nested-spans create mode 100644 dagql/idtui/testdata/TestTelemetry/TestGolden/typescript/nested-spans#01 diff --git a/dagql/idtui/testdata/TestTelemetry/TestGolden/nested-spans b/dagql/idtui/testdata/TestTelemetry/TestGolden/nested-spans index af5b95e270e..659fe606fa3 100644 --- a/dagql/idtui/testdata/TestTelemetry/TestGolden/nested-spans +++ b/dagql/idtui/testdata/TestTelemetry/TestGolden/nested-spans @@ -5,47 +5,53 @@ hello from Go! it is currently 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X Expected stderr: -✔ connect X.Xs -│ ✔ starting engine X.Xs -│ ✔ connecting to engine X.Xs -│ ✔ starting session X.Xs - -✔ load module X.Xs -│ ✔ finding module configuration X.Xs -│ ✔ initializing module X.Xs -│ ✔ inspecting module metadata X.Xs -│ ✔ loading type definitions X.Xs - -✔ parsing command line arguments X.Xs - -✔ viztest: Viztest! X.Xs -✔ .nestedSpans: String! X.Xs -│ ✔ custom span X.Xs -│ │ ✔ container: Container! X.Xs -│ │ $ .from(address: "alpine"): Container! X.Xs CACHED -│ │ ✔ .withExec(args: ["echo", "outer: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X"]): Container! X.Xs +▼ connect X.Xs +├─● starting engine X.Xs +├─● connecting to engine X.Xs +╰─● starting session X.Xs + +▼ load module: ./viztest X.Xs +├─● finding module configuration X.Xs +├─● initializing module X.Xs +├─● inspecting module metadata X.Xs +╰─● loading type definitions X.Xs + +● parsing command line arguments X.Xs + +● viztest: Viztest! X.Xs +▼ .nestedSpans: String! X.Xs +┃ hello from Go! it is currently 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X +├─▼ custom span X.Xs +│ ├─● container: Container! X.Xs +│ ├─$ .from(address: "alpine"): Container! X.Xs CACHED +│ ├─▼ .withExec(args: ["echo", "outer: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X"]): Container! X.Xs +│ │ ┃ outer: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X +│ ├─▼ .stdout: String! X.Xs │ │ ┃ outer: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X -│ │ ✔ .stdout: String! X.Xs │ │ -│ │ ✔ sub span X.Xs -│ │ │ ✔ Container.withExec(args: ["echo", "sub 1: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X"]): Container! X.Xs +│ ├─▼ sub span X.Xs +│ │ ├─▼ Container.withExec(args: ["echo", "sub 1: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X"]): Container! X.Xs │ │ │ ┃ sub 1: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X -│ │ │ ✔ .stdout: String! X.Xs -│ │ -│ │ ✔ sub span X.Xs -│ │ │ ✔ Container.withExec(args: ["echo", "sub 2: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X"]): Container! X.Xs +│ │ ╰─▼ .stdout: String! X.Xs +│ │ ┃ sub 1: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X +│ │ +│ ├─▼ sub span X.Xs +│ │ ├─▼ Container.withExec(args: ["echo", "sub 2: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X"]): Container! X.Xs │ │ │ ┃ sub 2: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X -│ │ │ ✔ .stdout: String! X.Xs -│ │ -│ │ ✔ another sub span X.Xs -│ │ │ ✔ sub span X.Xs -│ │ │ │ ✔ Container.withExec(args: ["echo", "im even deeper: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X"]): Container! X.Xs -│ │ │ │ ┃ im even deeper: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X -│ │ │ │ ✔ .stdout: String! X.Xs -│ -│ ✔ Container.withExec(args: ["echo", "hello from Go! it is currently 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X"]): Container! X.Xs +│ │ ╰─▼ .stdout: String! X.Xs +│ │ ┃ sub 2: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X +│ │ +│ ╰─▼ another sub span X.Xs +│ ╰─▼ sub span X.Xs +│ ├─▼ Container.withExec(args: ["echo", "im even deeper: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X"]): Container! X.Xs +│ │ ┃ im even deeper: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X +│ ╰─▼ .stdout: String! X.Xs +│ ┃ im even deeper: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X +│ +├─▼ Container.withExec(args: ["echo", "hello from Go! it is currently 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X"]): Container! X.Xs │ ┃ hello from Go! it is currently 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X -│ ✔ .stdout: String! X.Xs +╰─▼ .stdout: String! X.Xs + ┃ hello from Go! it is currently 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X Setup tracing at https://dagger.cloud/traces/setup. To hide set DAGGER_NO_NAG=1 diff --git a/dagql/idtui/testdata/TestTelemetry/TestGolden/nested-spans#01 b/dagql/idtui/testdata/TestTelemetry/TestGolden/nested-spans#01 index a444581e694..d3fa0480604 100644 --- a/dagql/idtui/testdata/TestTelemetry/TestGolden/nested-spans#01 +++ b/dagql/idtui/testdata/TestTelemetry/TestGolden/nested-spans#01 @@ -1,42 +1,45 @@ Expected stderr: -✔ connect X.Xs -│ ✔ starting engine X.Xs -│ ✔ connecting to engine X.Xs -│ ✔ starting session X.Xs +▼ connect X.Xs +├─● starting engine X.Xs +├─● connecting to engine X.Xs +╰─● starting session X.Xs + +▼ load module: ./viztest X.Xs +├─● finding module configuration X.Xs +├─● initializing module X.Xs +├─● inspecting module metadata X.Xs +╰─● loading type definitions X.Xs + +● parsing command line arguments X.Xs -✔ load module X.Xs -│ ✔ finding module configuration X.Xs -│ ✔ initializing module X.Xs -│ ✔ inspecting module metadata X.Xs -│ ✔ loading type definitions X.Xs - -✔ parsing command line arguments X.Xs - -✔ viztest: Viztest! X.Xs -✘ .nestedSpans(fail: true): String! X.Xs +● viztest: Viztest! X.Xs +▼ .nestedSpans(fail: true): String! X.Xs ERROR ! oh no -│ ✘ custom span X.Xs -│ ! oh no -│ │ ✔ container: Container! X.Xs -│ │ $ .from(address: "alpine"): Container! X.Xs CACHED -│ │ ✔ .withExec(args: ["echo", "outer: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X"]): Container! X.Xs -│ │ ┃ outer: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X -│ │ ✔ .stdout: String! X.Xs -│ │ -│ │ ✔ sub span X.Xs -│ │ │ ✔ Container.withExec(args: ["echo", "sub 1: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X"]): Container! X.Xs -│ │ │ ┃ sub 1: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X -│ │ │ ✔ .stdout: String! X.Xs -│ │ -│ │ ✔ sub span X.Xs -│ │ │ ✔ Container.withExec(args: ["echo", "sub 2: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X"]): Container! X.Xs -│ │ │ ┃ sub 2: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X -│ │ │ ✔ .stdout: String! X.Xs -│ │ -│ │ ✘ another sub span X.Xs -│ │ ! oh no -│ │ │ ✘ sub span X.Xs -│ │ │ ! oh no +╰─▼ custom span X.Xs ERROR + ! oh no + ├─● container: Container! X.Xs + ├─$ .from(address: "alpine"): Container! X.Xs CACHED + ├─▼ .withExec(args: ["echo", "outer: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X"]): Container! X.Xs + │ ┃ outer: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X + ├─▼ .stdout: String! X.Xs + │ ┃ outer: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X + │ + ├─▼ sub span X.Xs + │ ├─▼ Container.withExec(args: ["echo", "sub 1: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X"]): Container! X.Xs + │ │ ┃ sub 1: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X + │ ╰─▼ .stdout: String! X.Xs + │ ┃ sub 1: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X + │ + ├─▼ sub span X.Xs + │ ├─▼ Container.withExec(args: ["echo", "sub 2: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X"]): Container! X.Xs + │ │ ┃ sub 2: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X + │ ╰─▼ .stdout: String! X.Xs + │ ┃ sub 2: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X + │ + ╰─▼ another sub span X.Xs ERROR + ! oh no + ╰─✘ sub span X.Xs ERROR + ! oh no Setup tracing at https://dagger.cloud/traces/setup. To hide set DAGGER_NO_NAG=1 diff --git a/dagql/idtui/testdata/TestTelemetry/TestGolden/python/nested-spans b/dagql/idtui/testdata/TestTelemetry/TestGolden/python/nested-spans new file mode 100644 index 00000000000..0689c81efe8 --- /dev/null +++ b/dagql/idtui/testdata/TestTelemetry/TestGolden/python/nested-spans @@ -0,0 +1,50 @@ +Expected stdout: + +done + +Expected stderr: + +▼ connect X.Xs +├─● starting engine X.Xs +├─● connecting to engine X.Xs +╰─● starting session X.Xs + +▼ load module: ./viztest/python X.Xs +├─● finding module configuration X.Xs +├─● initializing module X.Xs +├─● inspecting module metadata X.Xs +╰─● loading type definitions X.Xs + +● parsing command line arguments X.Xs + +● python: Python! X.Xs +▼ .nestedSpans: String! X.Xs +┃ done +╰─▼ custom span X.Xs + ├─$ Container.from(address: "alpine:latest"): Container! X.Xs CACHED + ├─▼ .withExec(args: ["echo", "outer: 20XX-XX-XX XX:XX:XX.XXXX"]): Container! X.Xs + │ ┃ outer: 20XX-XX-XX XX:XX:XX.XXXX + ├─▼ .stdout: String! X.Xs + │ ┃ outer: 20XX-XX-XX XX:XX:XX.XXXX + │ + ├─▼ sub span X.Xs + │ ├─▼ Container.withExec(args: ["echo", "sub 1: 20XX-XX-XX XX:XX:XX.XXXX"]): Container! X.Xs + │ │ ┃ sub 1: 20XX-XX-XX XX:XX:XX.XXXX + │ ╰─▼ .stdout: String! X.Xs + │ ┃ sub 1: 20XX-XX-XX XX:XX:XX.XXXX + │ + ├─▼ sub span X.Xs + │ ├─▼ Container.withExec(args: ["echo", "sub 2: 20XX-XX-XX XX:XX:XX.XXXX"]): Container! X.Xs + │ │ ┃ sub 2: 20XX-XX-XX XX:XX:XX.XXXX + │ ╰─▼ .stdout: String! X.Xs + │ ┃ sub 2: 20XX-XX-XX XX:XX:XX.XXXX + │ + ╰─▼ another sub span X.Xs + ╰─▼ sub span X.Xs + ├─▼ Container.withExec(args: ["echo", "im even deeper: 20XX-XX-XX XX:XX:XX.XXXX"]): Container! X.Xs + │ ┃ im even deeper: 20XX-XX-XX XX:XX:XX.XXXX + ╰─▼ .stdout: String! X.Xs + ┃ im even deeper: 20XX-XX-XX XX:XX:XX.XXXX + + +Setup tracing at https://dagger.cloud/traces/setup. To hide set DAGGER_NO_NAG=1 diff --git a/dagql/idtui/testdata/TestTelemetry/TestGolden/python/nested-spans#01 b/dagql/idtui/testdata/TestTelemetry/TestGolden/python/nested-spans#01 new file mode 100644 index 00000000000..2d116584bd4 --- /dev/null +++ b/dagql/idtui/testdata/TestTelemetry/TestGolden/python/nested-spans#01 @@ -0,0 +1,44 @@ +Expected stderr: + +▼ connect X.Xs +├─● starting engine X.Xs +├─● connecting to engine X.Xs +╰─● starting session X.Xs + +▼ load module: ./viztest/python X.Xs +├─● finding module configuration X.Xs +├─● initializing module X.Xs +├─● inspecting module metadata X.Xs +╰─● loading type definitions X.Xs + +● parsing command line arguments X.Xs + +● python: Python! X.Xs +▼ .nestedSpans(fail: true): String! X.Xs ERROR +! oh no +╰─▼ custom span X.Xs ERROR + ! ValueError: oh no + ├─$ Container.from(address: "alpine:latest"): Container! X.Xs CACHED + ├─▼ .withExec(args: ["echo", "outer: 20XX-XX-XX XX:XX:XX.XXXX"]): Container! X.Xs + │ ┃ outer: 20XX-XX-XX XX:XX:XX.XXXX + ├─▼ .stdout: String! X.Xs + │ ┃ outer: 20XX-XX-XX XX:XX:XX.XXXX + │ + ├─▼ sub span X.Xs + │ ├─▼ Container.withExec(args: ["echo", "sub 1: 20XX-XX-XX XX:XX:XX.XXXX"]): Container! X.Xs + │ │ ┃ sub 1: 20XX-XX-XX XX:XX:XX.XXXX + │ ╰─▼ .stdout: String! X.Xs + │ ┃ sub 1: 20XX-XX-XX XX:XX:XX.XXXX + │ + ├─▼ sub span X.Xs + │ ├─▼ Container.withExec(args: ["echo", "sub 2: 20XX-XX-XX XX:XX:XX.XXXX"]): Container! X.Xs + │ │ ┃ sub 2: 20XX-XX-XX XX:XX:XX.XXXX + │ ╰─▼ .stdout: String! X.Xs + │ ┃ sub 2: 20XX-XX-XX XX:XX:XX.XXXX + │ + ╰─▼ another sub span X.Xs ERROR + ! ValueError: oh no + ╰─✘ sub span X.Xs ERROR + ! ValueError: oh no + +Setup tracing at https://dagger.cloud/traces/setup. To hide set DAGGER_NO_NAG=1 diff --git a/dagql/idtui/testdata/TestTelemetry/TestGolden/typescript/nested-spans b/dagql/idtui/testdata/TestTelemetry/TestGolden/typescript/nested-spans new file mode 100644 index 00000000000..60bbe177381 --- /dev/null +++ b/dagql/idtui/testdata/TestTelemetry/TestGolden/typescript/nested-spans @@ -0,0 +1,50 @@ +Expected stdout: + +done + +Expected stderr: + +▼ connect X.Xs +├─● starting engine X.Xs +├─● connecting to engine X.Xs +╰─● starting session X.Xs + +▼ load module: ./viztest/typescript X.Xs +├─● finding module configuration X.Xs +├─● initializing module X.Xs +├─● inspecting module metadata X.Xs +╰─● loading type definitions X.Xs + +● parsing command line arguments X.Xs + +● typescript: Typescript! X.Xs +▼ .nestedSpans: String! X.Xs +┃ done +╰─▼ custom span X.Xs + ├─$ Container.from(address: "alpine:latest"): Container! X.Xs CACHED + ├─▼ .withExec(args: ["echo", "outer: XXXX-XX-XXTXX:XX:XX.XXXZ"]): Container! X.Xs + │ ┃ outer: XXXX-XX-XXTXX:XX:XX.XXXZ + ├─▼ .stdout: String! X.Xs + │ ┃ outer: XXXX-XX-XXTXX:XX:XX.XXXZ + │ + ├─▼ sub span X.Xs + │ ├─▼ Container.withExec(args: ["echo", "sub 1: XXXX-XX-XXTXX:XX:XX.XXXZ"]): Container! X.Xs + │ │ ┃ sub 1: XXXX-XX-XXTXX:XX:XX.XXXZ + │ ╰─▼ .stdout: String! X.Xs + │ ┃ sub 1: XXXX-XX-XXTXX:XX:XX.XXXZ + │ + ├─▼ sub span X.Xs + │ ├─▼ Container.withExec(args: ["echo", "sub 2: XXXX-XX-XXTXX:XX:XX.XXXZ"]): Container! X.Xs + │ │ ┃ sub 2: XXXX-XX-XXTXX:XX:XX.XXXZ + │ ╰─▼ .stdout: String! X.Xs + │ ┃ sub 2: XXXX-XX-XXTXX:XX:XX.XXXZ + │ + ╰─▼ another sub span X.Xs + ╰─▼ sub span X.Xs + ├─▼ Container.withExec(args: ["echo", "im even deeper: XXXX-XX-XXTXX:XX:XX.XXXZ"]): Container! X.Xs + │ ┃ im even deeper: XXXX-XX-XXTXX:XX:XX.XXXZ + ╰─▼ .stdout: String! X.Xs + ┃ im even deeper: XXXX-XX-XXTXX:XX:XX.XXXZ + + +Setup tracing at https://dagger.cloud/traces/setup. To hide set DAGGER_NO_NAG=1 diff --git a/dagql/idtui/testdata/TestTelemetry/TestGolden/typescript/nested-spans#01 b/dagql/idtui/testdata/TestTelemetry/TestGolden/typescript/nested-spans#01 new file mode 100644 index 00000000000..5eac1bd546d --- /dev/null +++ b/dagql/idtui/testdata/TestTelemetry/TestGolden/typescript/nested-spans#01 @@ -0,0 +1,44 @@ +Expected stderr: + +▼ connect X.Xs +├─● starting engine X.Xs +├─● connecting to engine X.Xs +╰─● starting session X.Xs + +▼ load module: ./viztest/typescript X.Xs +├─● finding module configuration X.Xs +├─● initializing module X.Xs +├─● inspecting module metadata X.Xs +╰─● loading type definitions X.Xs + +● parsing command line arguments X.Xs + +● typescript: Typescript! X.Xs +▼ .nestedSpans(fail: true): String! X.Xs ERROR +! oh no +╰─▼ custom span X.Xs ERROR + ! oh no + ├─$ Container.from(address: "alpine:latest"): Container! X.Xs CACHED + ├─▼ .withExec(args: ["echo", "outer: XXXX-XX-XXTXX:XX:XX.XXXZ"]): Container! X.Xs + │ ┃ outer: XXXX-XX-XXTXX:XX:XX.XXXZ + ├─▼ .stdout: String! X.Xs + │ ┃ outer: XXXX-XX-XXTXX:XX:XX.XXXZ + │ + ├─▼ sub span X.Xs + │ ├─▼ Container.withExec(args: ["echo", "sub 1: XXXX-XX-XXTXX:XX:XX.XXXZ"]): Container! X.Xs + │ │ ┃ sub 1: XXXX-XX-XXTXX:XX:XX.XXXZ + │ ╰─▼ .stdout: String! X.Xs + │ ┃ sub 1: XXXX-XX-XXTXX:XX:XX.XXXZ + │ + ├─▼ sub span X.Xs + │ ├─▼ Container.withExec(args: ["echo", "sub 2: XXXX-XX-XXTXX:XX:XX.XXXZ"]): Container! X.Xs + │ │ ┃ sub 2: XXXX-XX-XXTXX:XX:XX.XXXZ + │ ╰─▼ .stdout: String! X.Xs + │ ┃ sub 2: XXXX-XX-XXTXX:XX:XX.XXXZ + │ + ╰─▼ another sub span X.Xs ERROR + ! oh no + ╰─✘ sub span X.Xs ERROR + ! oh no + +Setup tracing at https://dagger.cloud/traces/setup. To hide set DAGGER_NO_NAG=1 From 688aafe350ee05206e5c95406a7343785ee099bf Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Thu, 26 Jun 2025 16:34:21 -0400 Subject: [PATCH 24/36] fix janky debug logs Signed-off-by: Alex Suraci --- engine/clientdb/log.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/engine/clientdb/log.go b/engine/clientdb/log.go index eae9f23a8f1..46034dc7f61 100644 --- a/engine/clientdb/log.go +++ b/engine/clientdb/log.go @@ -39,13 +39,13 @@ func LogsToPB(dbLog []Log) []*otlplogsv1.ResourceLogs { res = telemetry.ResourceFromPB(sd.ResourceSchemaUrl, &resPb) } if res.SchemaURL() == "" { - slog.Error("log has no resource", "log", sd) + slog.Error("log has no resource", "log", string(sd.Body), "trace", sd.TraceID, "span", sd.SpanID) continue } var scope instrumentation.Scope var scopePb otlpcommonv1.InstrumentationScope if err := protojson.Unmarshal(sd.InstrumentationScope, &scopePb); err != nil { - slog.Error("failed to unmarshal instrumentation scope", "error", err, "log", sd) + slog.Error("failed to unmarshal instrumentation scope", "error", err, "log", string(sd.Body)) continue } else { scope = telemetry.InstrumentationScopeFromPB(&scopePb) @@ -66,7 +66,7 @@ func LogsToPB(dbLog []Log) []*otlplogsv1.ResourceLogs { } var bodyPb otlpcommonv1.AnyValue if err := proto.Unmarshal(sd.Body, &bodyPb); err != nil { - slog.Warn("failed to unmarshal log body", "error", err, "log", sd) + slog.Warn("failed to unmarshal log body", "error", err, "log", string(sd.Body)) continue } var attrs []*otlpcommonv1.KeyValue From 8c45e78dbdfaaa27af426e0e049315b2abfada97 Mon Sep 17 00:00:00 2001 From: Tom Chauveau Date: Thu, 26 Jun 2025 22:48:36 +0200 Subject: [PATCH 25/36] feat: update typescript span.run with utility function to simplify dependency management Signed-off-by: Tom Chauveau --- .../typescript/templates/src/header.ts.gtpl | 6 +-- .../typescript/templates/src/object.ts.gtpl | 30 +------------ sdk/typescript/src/api/client.gen.ts | 34 +------------- sdk/typescript/src/telemetry/index.ts | 3 +- sdk/typescript/src/telemetry/run_dag_span.ts | 45 +++++++++++++++++++ 5 files changed, 53 insertions(+), 65 deletions(-) create mode 100644 sdk/typescript/src/telemetry/run_dag_span.ts diff --git a/cmd/codegen/generator/typescript/templates/src/header.ts.gtpl b/cmd/codegen/generator/typescript/templates/src/header.ts.gtpl index 743ea7fc629..cfaaf76cfd2 100644 --- a/cmd/codegen/generator/typescript/templates/src/header.ts.gtpl +++ b/cmd/codegen/generator/typescript/templates/src/header.ts.gtpl @@ -7,13 +7,13 @@ inherited by futures objects and common types. * This file was auto-generated by `client-gen`. * Do not make direct changes to the file. */ -import * as opentelemetry from "@opentelemetry/api" {{- if IsBundle }} -import { Context } from "./core.js" +import { Context, runWithSpan } from "./core.js" {{- else if (not IsClientOnly)}} import { Context } from "../common/context.js" +import { runWithSpan } from "../telemetry/index.js" {{- else }} -import { Context, connect as _connect, connection as _connection, ConnectOpts, CallbackFct } from "@dagger.io/dagger" +import { Context, connect as _connect, connection as _connection, ConnectOpts, CallbackFct, runWithSpan } from "@dagger.io/dagger" {{- end }} {{ if IsClientOnly }} diff --git a/cmd/codegen/generator/typescript/templates/src/object.ts.gtpl b/cmd/codegen/generator/typescript/templates/src/object.ts.gtpl index 608c2f1d3da..5633815d1aa 100644 --- a/cmd/codegen/generator/typescript/templates/src/object.ts.gtpl +++ b/cmd/codegen/generator/typescript/templates/src/object.ts.gtpl @@ -73,37 +73,9 @@ export class {{ .Name | QueryToClient | FormatName }} extends BaseClient { {{- w const started = await this.start() const spanIdHex = await started.internalId() - // Get the current span context - const currentSpan = opentelemetry.trace.getSpan(opentelemetry.context.active()) || undefined; - const currentSpanContext = currentSpan?.spanContext(); - - if (!currentSpanContext) { - return await fn(this) - } - - // Extract trace ID and other fields - const traceId = currentSpanContext.traceId; - const traceFlags = currentSpanContext.traceFlags; - const traceState = currentSpanContext.traceState; - - // Construct the new SpanContext - const newSpanContext: opentelemetry.SpanContext = { - traceId, - spanId: spanIdHex, - traceFlags, - isRemote: true, - traceState, - }; - - // Bind the new context - const newContext = opentelemetry.trace.setSpan( - opentelemetry.context.active(), - opentelemetry.trace.wrapSpanContext(newSpanContext), - ); - let spanError: Error | undefined = undefined try { - return await opentelemetry.context.with(newContext, fn, this, started) + return await runWithSpan(fn, this, started, spanIdHex) } catch (e: unknown) { if (e instanceof globalThis.Error) { spanError = dag.error(e.message) diff --git a/sdk/typescript/src/api/client.gen.ts b/sdk/typescript/src/api/client.gen.ts index 40c2a6f0581..f4ecfc62f60 100644 --- a/sdk/typescript/src/api/client.gen.ts +++ b/sdk/typescript/src/api/client.gen.ts @@ -2,9 +2,8 @@ * This file was auto-generated by `client-gen`. * Do not make direct changes to the file. */ -import * as opentelemetry from "@opentelemetry/api" - import { Context } from "../common/context.js" +import { runWithSpan } from "../telemetry/index.js" /** * Declare a number as float in the Dagger API. @@ -9163,38 +9162,9 @@ export class Span extends BaseClient { const started = await this.start() const spanIdHex = await started.internalId() - // Get the current span context - const currentSpan = - opentelemetry.trace.getSpan(opentelemetry.context.active()) || undefined - const currentSpanContext = currentSpan?.spanContext() - - if (!currentSpanContext) { - return await fn(this) - } - - // Extract trace ID and other fields - const traceId = currentSpanContext.traceId - const traceFlags = currentSpanContext.traceFlags - const traceState = currentSpanContext.traceState - - // Construct the new SpanContext - const newSpanContext: opentelemetry.SpanContext = { - traceId, - spanId: spanIdHex, - traceFlags, - isRemote: true, - traceState, - } - - // Bind the new context - const newContext = opentelemetry.trace.setSpan( - opentelemetry.context.active(), - opentelemetry.trace.wrapSpanContext(newSpanContext), - ) - let spanError: Error | undefined = undefined try { - return await opentelemetry.context.with(newContext, fn, this, started) + return await runWithSpan(fn, this, started, spanIdHex) } catch (e: unknown) { if (e instanceof globalThis.Error) { spanError = dag.error(e.message) diff --git a/sdk/typescript/src/telemetry/index.ts b/sdk/typescript/src/telemetry/index.ts index f5f59a4a67f..59539fc3abc 100644 --- a/sdk/typescript/src/telemetry/index.ts +++ b/sdk/typescript/src/telemetry/index.ts @@ -1,3 +1,4 @@ +import { runWithSpan } from "./run_dag_span.js" import { getTracer } from "./telemetry.js" -export { getTracer } +export { getTracer, runWithSpan } diff --git a/sdk/typescript/src/telemetry/run_dag_span.ts b/sdk/typescript/src/telemetry/run_dag_span.ts new file mode 100644 index 00000000000..02a607e4354 --- /dev/null +++ b/sdk/typescript/src/telemetry/run_dag_span.ts @@ -0,0 +1,45 @@ +import * as opentelemetry from "@opentelemetry/api" + +/** + * runWithSpan is a proxy function to wrap a function within a specific span. + * + * Note: This function should only be used by the generated client. + * We execute the logic here to avoid dealing with dependency conflicts by directly + * importing the opentelemetry package inside the generated client, instead we proxy it there. + */ +export async function runWithSpan( + fn: (span: S) => Promise, + parentSpan: S, + startSpan: S, + spanIdHex: string, +): Promise { + const currentSpan = + opentelemetry.trace.getSpan(opentelemetry.context.active()) || undefined + const currentSpanContext = currentSpan?.spanContext() + + if (!currentSpanContext) { + return await fn(parentSpan) + } + + // Extract trace ID and other fields + const traceId = currentSpanContext.traceId + const traceFlags = currentSpanContext.traceFlags + const traceState = currentSpanContext.traceState + + // Construct the new SpanContext + const newSpanContext: opentelemetry.SpanContext = { + traceId, + spanId: spanIdHex, + traceFlags, + isRemote: true, + traceState, + } + + // Bind the new context + const newContext = opentelemetry.trace.setSpan( + opentelemetry.context.active(), + opentelemetry.trace.wrapSpanContext(newSpanContext), + ) + + return await opentelemetry.context.with(newContext, fn, parentSpan, startSpan) +} From 2925d37a4e3af7172f27dab97a28f185ca7f2e4e Mon Sep 17 00:00:00 2001 From: Tom Chauveau Date: Thu, 26 Jun 2025 23:04:34 +0200 Subject: [PATCH 26/36] chore: fix imports in client/module index.ts Signed-off-by: Tom Chauveau --- sdk/typescript/runtime/bundled_static_export/client/index.ts | 1 + sdk/typescript/runtime/bundled_static_export/module/index.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/sdk/typescript/runtime/bundled_static_export/client/index.ts b/sdk/typescript/runtime/bundled_static_export/client/index.ts index 4047abf17e6..f793e2bb570 100644 --- a/sdk/typescript/runtime/bundled_static_export/client/index.ts +++ b/sdk/typescript/runtime/bundled_static_export/client/index.ts @@ -8,6 +8,7 @@ export { field, enumType, entrypoint, + runWithSpan, } from "./core.js" export type { ConnectOpts, CallbackFct } from "./core.js" diff --git a/sdk/typescript/runtime/bundled_static_export/module/index.ts b/sdk/typescript/runtime/bundled_static_export/module/index.ts index a5e5d3e5e0d..ced4116e4fc 100644 --- a/sdk/typescript/runtime/bundled_static_export/module/index.ts +++ b/sdk/typescript/runtime/bundled_static_export/module/index.ts @@ -8,6 +8,7 @@ export { field, enumType, entrypoint, + runWithSpan, } from "./core.js" export type { ConnectOpts, CallbackFct } from "./core.js" From 3d68dc784f42695589c4c05f1c398f5e1b60cc8a Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Thu, 26 Jun 2025 17:39:25 -0400 Subject: [PATCH 27/36] regen docs Signed-off-by: Alex Suraci --- docs/static/reference/php/Dagger.html | 10 + docs/static/reference/php/Dagger/Client.html | 169 ++++- docs/static/reference/php/Dagger/Span.html | 647 +++++++++++++++++++ docs/static/reference/php/Dagger/SpanId.html | 314 +++++++++ docs/static/reference/php/classes.html | 10 + docs/static/reference/php/doc-index.html | 42 +- docs/static/reference/php/doctum-search.json | 92 +++ docs/static/reference/php/doctum.js | 2 +- docs/static/reference/php/traits.html | 2 +- 9 files changed, 1269 insertions(+), 19 deletions(-) create mode 100644 docs/static/reference/php/Dagger/Span.html create mode 100644 docs/static/reference/php/Dagger/SpanId.html diff --git a/docs/static/reference/php/Dagger.html b/docs/static/reference/php/Dagger.html index 75a154c0d03..7f02511c300 100644 --- a/docs/static/reference/php/Dagger.html +++ b/docs/static/reference/php/Dagger.html @@ -558,6 +558,16 @@

    Classes

    The SourceMapID scalar type represents an identifier for an object of type SourceMap.

    +
    +
    +
    + Span
    +

    An OpenTelemetry span.

    +
    +
    +
    + SpanId
    +

    The SpanID scalar type represents an identifier for an object of type Span.

    diff --git a/docs/static/reference/php/Dagger/Client.html b/docs/static/reference/php/Dagger/Client.html index d6cee69f2c3..93902806f67 100644 --- a/docs/static/reference/php/Dagger/Client.html +++ b/docs/static/reference/php/Dagger/Client.html @@ -772,6 +772,16 @@

    Methods

    Load a SourceMap from its ID.

    +
    +
    +
    + Span +
    +
    + loadSpanFromID(Span $id) + +

    Load a Span from its ID.

    +
    @@ -812,6 +822,16 @@

    Methods

    Create a new module source instance from a source ref string

    +
    +
    +
    + Span +
    +
    + reveal() + +

    Returns a span that reveals its child spans and hides itself.

    +
    @@ -842,6 +862,16 @@

    Methods

    Creates source map metadata.

    +
    +
    +
    + Span +
    +
    + span(string $name, string|null $key = '') + +

    Create a new OpenTelemetry span.

    +
    @@ -3565,8 +3595,50 @@

    Return Value

    -

    +

    at line 689
    + Span + loadSpanFromID(Span $id) + +

    +
    + + + +
    +

    Load a Span from its ID.

    +
    +
    +

    Parameters

    + + + + + + + +
    Span$id
    + + +

    Return Value

    + + + + + + +
    Span
    + + + + +
    +
    + +
    +
    +

    +
    at line 699
    Terminal loadTerminalFromID(Terminal $id) @@ -3608,7 +3680,7 @@

    Return Value

    -
    at line 699
    +
    at line 709
    TypeDef loadTypeDefFromID(TypeDef $id) @@ -3650,7 +3722,7 @@

    Return Value

    -
    at line 709
    +
    at line 719
    Module module() @@ -3682,7 +3754,7 @@

    Return Value

    -
    at line 718
    +
    at line 728
    ModuleSource moduleSource(string $refString, string|null $refPin = '', bool|null $disableFindUp = false, bool|null $allowNotExists = false, ModuleSourceKind|null $requireKind = null) @@ -3738,13 +3810,45 @@

    Return Value

    +
    +
    + + +
    +

    +
    at line 755
    + Span + reveal() + +

    +
    + + + +
    +

    Returns a span that reveals its child spans and hides itself.

    +
    +
    + +

    Return Value

    + + + + + + +
    Span
    + + + +

    -
    at line 745
    +
    at line 764
    Secret secret(string $uri, string|null $cacheKey = null) @@ -3791,7 +3895,7 @@

    Return Value

    -
    at line 760
    +
    at line 779
    Secret setSecret(string $name, string $plaintext) @@ -3838,7 +3942,7 @@

    Return Value

    -
    at line 771
    +
    at line 790
    SourceMap sourceMap(string $filename, int $line, int $column) @@ -3884,13 +3988,60 @@

    Return Value

    +
    + + + +
    +

    +
    at line 802
    + Span + span(string $name, string|null $key = '') + +

    +
    + + + +
    +

    Create a new OpenTelemetry span.

    +
    +
    +

    Parameters

    + + + + + + + + + + + + +
    string$name
    string|null$key
    + + +

    Return Value

    + + + + + + +
    Span
    + + + +

    -
    at line 783
    +
    at line 815
    TypeDef typeDef() @@ -3922,7 +4073,7 @@

    Return Value

    -
    at line 792
    +
    at line 824
    string version() diff --git a/docs/static/reference/php/Dagger/Span.html b/docs/static/reference/php/Dagger/Span.html new file mode 100644 index 00000000000..75424413dd6 --- /dev/null +++ b/docs/static/reference/php/Dagger/Span.html @@ -0,0 +1,647 @@ + + + + + + Dagger\Span | API + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    + + + +

    class + Span extends AbstractObject implements IdAble +

    + + + + + +
    +

    An OpenTelemetry span.

    + + + +

    Properties

    + + + + + + + + +
    + + + $lastQueryfrom  +AbstractObject
    + + +

    Methods

    + +
    +
    +
    + +
    +
    + __construct(AbstractClient $client, QueryBuilderChain $queryBuilderChain) + +

    No description

    +
    + +
    +
    +
    + null|array|string|int|float|bool +
    +
    + queryLeaf(QueryBuilder $leafQueryBuilder, string $leafKey) + +

    No description

    +
    + +
    +
    +
    + void +
    +
    + end(Error|null $error = null) + +

    End the OpenTelemetry span, with an optional error.

    +
    +
    +
    + +
    + id() + +

    A unique identifier for this Span.

    +
    +
    +
    +
    + string +
    +
    + internalId() + +

    Returns the internal ID of the span.

    +
    +
    +
    +
    + string +
    +
    + name() + +

    The name of the span.

    +
    +
    +
    +
    + SpanId +
    +
    + start() + +

    Start a new instance of the span.

    +
    +
    +
    +
    + Span +
    +
    + withActor(string $actor) + +

    No description

    +
    +
    +
    +
    +
    + Span +
    +
    + withInternal() + +

    Returns a new span with the internal attribute set to true.

    +
    +
    +
    +
    + Span +
    +
    + withPassthrough() + +

    Returns a new span with the passthrough attribute set to true.

    +
    +
    +
    +
    + Span +
    +
    + withReveal() + +

    Returns a new span with the reveal attribute set to true.

    +
    +
    +
    + + +

    Details

    + +
    +
    +

    +
    in +AbstractObject at line 13
    + + __construct(AbstractClient $client, QueryBuilderChain $queryBuilderChain) + +

    +
    + + + +
    +

    No description

    + +
    +
    +

    Parameters

    + + + + + + + + + + + + +
    AbstractClient$client
    QueryBuilderChain$queryBuilderChain
    + + + + + +
    +
    + +
    +
    +

    +
    in +AbstractObject at line 19
    + protected null|array|string|int|float|bool + queryLeaf(QueryBuilder $leafQueryBuilder, string $leafKey) + +

    +
    + + + +
    +

    No description

    + +
    +
    +

    Parameters

    + + + + + + + + + + + + +
    QueryBuilder$leafQueryBuilder
    string$leafKey
    + + +

    Return Value

    + + + + + + +
    null|array|string|int|float|bool
    + + + + +
    +
    + +
    +
    +

    +
    at line 19
    + void + end(Error|null $error = null) + +

    +
    + + + +
    +

    End the OpenTelemetry span, with an optional error.

    +
    +
    +

    Parameters

    + + + + + + + +
    Error|null$error
    + + +

    Return Value

    + + + + + + +
    void
    + + + + +
    +
    + +
    +
    +

    +
    at line 31
    + AbstractId + id() + +

    +
    + + + +
    +

    A unique identifier for this Span.

    +
    +
    + +

    Return Value

    + + + + + + +
    AbstractId
    + + + + +
    +
    + +
    +
    +

    +
    at line 40
    + string + internalId() + +

    +
    + + + +
    +

    Returns the internal ID of the span.

    +
    +
    + +

    Return Value

    + + + + + + +
    string
    + + + + +
    +
    + +
    +
    +

    +
    at line 49
    + string + name() + +

    +
    + + + +
    +

    The name of the span.

    +
    +
    + +

    Return Value

    + + + + + + +
    string
    + + + + +
    +
    + +
    +
    +

    +
    at line 58
    + SpanId + start() + +

    +
    + + + +
    +

    Start a new instance of the span.

    +
    +
    + +

    Return Value

    + + + + + + +
    SpanId
    + + + + +
    +
    + +
    +
    +

    +
    at line 64
    + Span + withActor(string $actor) + +

    +
    + + + +
    +

    No description

    + +
    +
    +

    Parameters

    + + + + + + + +
    string$actor
    + + +

    Return Value

    + + + + + + +
    Span
    + + + + +
    +
    + +
    +
    +

    +
    at line 74
    + Span + withInternal() + +

    +
    + + + +
    +

    Returns a new span with the internal attribute set to true.

    +
    +
    + +

    Return Value

    + + + + + + +
    Span
    + + + + +
    +
    + +
    +
    +

    +
    at line 83
    + Span + withPassthrough() + +

    +
    + + + +
    +

    Returns a new span with the passthrough attribute set to true.

    +
    +
    + +

    Return Value

    + + + + + + +
    Span
    + + + + +
    +
    + +
    +
    +

    +
    at line 92
    + Span + withReveal() + +

    +
    + + + +
    +

    Returns a new span with the reveal attribute set to true.

    +
    +
    + +

    Return Value

    + + + + + + +
    Span
    + + + + +
    +
    + +
    +
    + + +
    +
    + + + diff --git a/docs/static/reference/php/Dagger/SpanId.html b/docs/static/reference/php/Dagger/SpanId.html new file mode 100644 index 00000000000..f6afbbb69b2 --- /dev/null +++ b/docs/static/reference/php/Dagger/SpanId.html @@ -0,0 +1,314 @@ + + + + + + Dagger\SpanId | API + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    + + + +

    class + SpanId extends AbstractId +

    + + + + + +
    +

    The SpanID scalar type represents an identifier for an object of type Span.

    + + + + +

    Methods

    + +
    +
    +
    + +
    +
    + __construct(string $value) + +

    No description

    +
    + +
    +
    +
    + string +
    +
    + getValue() + +

    No description

    +
    + +
    +
    +
    + string +
    +
    + __toString() + +

    No description

    +
    + +
    +
    +
    + static AbstractScalar +
    +
    + from(string $value) + +

    No description

    +
    + +
    +
    + + +

    Details

    + +
    +
    +

    +
    in +AbstractScalar at line 11
    + + __construct(string $value) + +

    +
    + + + +
    +

    No description

    + +
    +
    +

    Parameters

    + + + + + + + +
    string$value
    + + + + + +
    +
    + +
    +
    +

    +
    in +AbstractScalar at line 15
    + string + getValue() + +

    +
    + + + +
    +

    No description

    + +
    +
    + +

    Return Value

    + + + + + + +
    string
    + + + + +
    +
    + +
    +
    +

    +
    in +AbstractScalar at line 20
    + string + __toString() + +

    +
    + + + +
    +

    No description

    + +
    +
    + +

    Return Value

    + + + + + + +
    string
    + + + + +
    +
    + +
    +
    +

    +
    in +AbstractScalar at line 25
    + static AbstractScalar + from(string $value) + +

    +
    + + + +
    +

    No description

    + +
    +
    +

    Parameters

    + + + + + + + +
    string$value
    + + +

    Return Value

    + + + + + + +
    AbstractScalar
    + + + + +
    +
    + +
    +
    + + +
    +
    + + + diff --git a/docs/static/reference/php/classes.html b/docs/static/reference/php/classes.html index 717927e92bd..f9f4873edad 100644 --- a/docs/static/reference/php/classes.html +++ b/docs/static/reference/php/classes.html @@ -623,6 +623,16 @@

    Classes

    The SourceMapID scalar type represents an identifier for an object of type SourceMap.

    +
    +
    +
    + Span
    +

    An OpenTelemetry span.

    +
    +
    +
    + SpanId
    +

    The SpanID scalar type represents an identifier for an object of type Span.

    diff --git a/docs/static/reference/php/doc-index.html b/docs/static/reference/php/doc-index.html index 6458c6c799f..0b98a2b4256 100644 --- a/docs/static/reference/php/doc-index.html +++ b/docs/static/reference/php/doc-index.html @@ -389,7 +389,9 @@

    A

    Port::experimentalSkipHealthcheck() — Method in class Port

    Skip the health check when run as a service.

    Service::endpoint() — Method in class Service
    -

    Retrieves an endpoint that clients can use to reach this container.

    F

    +

    Retrieves an endpoint that clients can use to reach this container.

    +Span::end() — Method in class Span
    +

    End the OpenTelemetry span, with an optional error.

    F

    Client::file() — Method in class Client

    Creates a file with the specified contents.

    @@ -589,7 +591,11 @@

    A

    Socket::id
    () — Method in class Socket

    A unique identifier for this Socket.

    SourceMap::id() — Method in class SourceMap
    -

    A unique identifier for this SourceMap.

    +

    A unique identifier for this SourceMap.

    +Span::id() — Method in class Span
    +

    A unique identifier for this Span.

    +Span::internalId() — Method in class Span
    +

    Returns the internal ID of the span.

    Terminal::id() — Method in class Terminal

    A unique identifier for this Terminal.

    TypeDef::id() — Method in class TypeDef
    @@ -692,7 +698,9 @@

    A

    Client::loadSocketFromID() — Method in class Client

    Load a Socket from its ID.

    Client::loadSourceMapFromID() — Method in class Client
    -

    Load a SourceMap from its ID.

    +

    Load a SourceMap from its ID.

    +Client::loadSpanFromID() — Method in class Client
    +

    Load a Span from its ID.

    Client::loadTerminalFromID() — Method in class Client

    Load a Terminal from its ID.

    Client::loadTypeDefFromID() — Method in class Client
    @@ -796,7 +804,9 @@

    A

    ScalarTypeDef::name() — Method in class ScalarTypeDef

    The name of the scalar.

    Secret::name() — Method in class Secret
    -

    The name of this secret.

    O

    +

    The name of this secret.

    +Span::name() — Method in class Span
    +

    The name of the span.

    O

    Env::output() — Method in class Env

    retrieve an output value by name

    @@ -847,7 +857,9 @@

    A

    QueryBuilderClass in namespace Dagger\Client

    R

    ReturnsListOfTypeClass in namespace Dagger\Attribute
    -
    +
    +Client::reveal() — Method in class Client
    +

    Returns a span that reveals its child spans and hides itself.

    AbstractClient::runQuery() — Method in class AbstractClient
    Container::rootfs() — Method in class Container
    @@ -874,7 +886,9 @@

    A

    Client::setSecret() — Method in class Client

    Sets a secret given a user defined name to its plaintext and returns the secret.

    Client::sourceMap() — Method in class Client
    -

    Creates source map metadata.

    +

    Creates source map metadata.

    +Client::span() — Method in class Client
    +

    Create a new OpenTelemetry span.

    QueryBuilder::setArgument() — Method in class QueryBuilder
    Container::stderr() — Method in class Container
    @@ -952,7 +966,11 @@

    A

    A Unix or TCP/IP socket that can be mounted into a container.

    SocketIdClass in namespace Dagger

    The SocketID scalar type represents an identifier for an object of type Socket.

    SourceMapClass in namespace Dagger

    Source location information.

    SourceMapIdClass in namespace Dagger
    -

    The SourceMapID scalar type represents an identifier for an object of type SourceMap.

    +

    The SourceMapID scalar type represents an identifier for an object of type SourceMap.

    SpanClass in namespace Dagger
    +

    An OpenTelemetry span.

    +Span::start() — Method in class Span
    +

    Start a new instance of the span.

    SpanIdClass in namespace Dagger
    +

    The SpanID scalar type represents an identifier for an object of type Span.

    Terminal::sync() — Method in class Terminal

    Forces evaluation of the pipeline in the engine.

    T

    @@ -1256,7 +1274,15 @@

    A

    ModuleSource::withoutDependencies
    () — Method in class ModuleSource

    Remove the provided dependencies from the module source's dependency list.

    Service::withHostname() — Method in class Service
    -

    Configures a hostname which can be used by clients within the session to reach this container.

    +

    Configures a hostname which can be used by clients within the session to reach this container.

    +Span::withActor() — Method in class Span
    +
    +Span::withInternal() — Method in class Span
    +

    Returns a new span with the internal attribute set to true.

    +Span::withPassthrough() — Method in class Span
    +

    Returns a new span with the passthrough attribute set to true.

    +Span::withReveal() — Method in class Span
    +

    Returns a new span with the reveal attribute set to true.

    TypeDef::withConstructor() — Method in class TypeDef

    Adds a function for constructing a new instance of an Object TypeDef, failing if the type is not an object.

    TypeDef::withEnum() — Method in class TypeDef
    diff --git a/docs/static/reference/php/doctum-search.json b/docs/static/reference/php/doctum-search.json index 5c906c1a4f5..36be2c03a9b 100644 --- a/docs/static/reference/php/doctum-search.json +++ b/docs/static/reference/php/doctum-search.json @@ -1096,6 +1096,26 @@ "p": "Dagger.html" } }, + { + "t": "C", + "n": "Dagger\\Span", + "p": "Dagger/Span.html", + "d": "

    An OpenTelemetry span.

    ", + "f": { + "n": "Dagger", + "p": "Dagger.html" + } + }, + { + "t": "C", + "n": "Dagger\\SpanId", + "p": "Dagger/SpanId.html", + "d": "

    The SpanID scalar type represents an identifier for an object of type Span.

    ", + "f": { + "n": "Dagger", + "p": "Dagger.html" + } + }, { "t": "C", "n": "Dagger\\Terminal", @@ -1691,6 +1711,12 @@ "p": "Dagger/Client.html#method_loadSourceMapFromID", "d": "

    Load a SourceMap from its ID.

    " }, + { + "t": "M", + "n": "Dagger\\Client::loadSpanFromID", + "p": "Dagger/Client.html#method_loadSpanFromID", + "d": "

    Load a Span from its ID.

    " + }, { "t": "M", "n": "Dagger\\Client::loadTerminalFromID", @@ -1715,6 +1741,12 @@ "p": "Dagger/Client.html#method_moduleSource", "d": "

    Create a new module source instance from a source ref string

    " }, + { + "t": "M", + "n": "Dagger\\Client::reveal", + "p": "Dagger/Client.html#method_reveal", + "d": "

    Returns a span that reveals its child spans and hides itself.

    " + }, { "t": "M", "n": "Dagger\\Client::secret", @@ -1733,6 +1765,12 @@ "p": "Dagger/Client.html#method_sourceMap", "d": "

    Creates source map metadata.

    " }, + { + "t": "M", + "n": "Dagger\\Client::span", + "p": "Dagger/Client.html#method_span", + "d": "

    Create a new OpenTelemetry span.

    " + }, { "t": "M", "n": "Dagger\\Client::typeDef", @@ -4181,6 +4219,60 @@ "p": "Dagger/SourceMap.html#method_module", "d": "

    The module dependency this was declared in.

    " }, + { + "t": "M", + "n": "Dagger\\Span::end", + "p": "Dagger/Span.html#method_end", + "d": "

    End the OpenTelemetry span, with an optional error.

    " + }, + { + "t": "M", + "n": "Dagger\\Span::id", + "p": "Dagger/Span.html#method_id", + "d": "

    A unique identifier for this Span.

    " + }, + { + "t": "M", + "n": "Dagger\\Span::internalId", + "p": "Dagger/Span.html#method_internalId", + "d": "

    Returns the internal ID of the span.

    " + }, + { + "t": "M", + "n": "Dagger\\Span::name", + "p": "Dagger/Span.html#method_name", + "d": "

    The name of the span.

    " + }, + { + "t": "M", + "n": "Dagger\\Span::start", + "p": "Dagger/Span.html#method_start", + "d": "

    Start a new instance of the span.

    " + }, + { + "t": "M", + "n": "Dagger\\Span::withActor", + "p": "Dagger/Span.html#method_withActor", + "d": null + }, + { + "t": "M", + "n": "Dagger\\Span::withInternal", + "p": "Dagger/Span.html#method_withInternal", + "d": "

    Returns a new span with the internal attribute set to true.

    " + }, + { + "t": "M", + "n": "Dagger\\Span::withPassthrough", + "p": "Dagger/Span.html#method_withPassthrough", + "d": "

    Returns a new span with the passthrough attribute set to true.

    " + }, + { + "t": "M", + "n": "Dagger\\Span::withReveal", + "p": "Dagger/Span.html#method_withReveal", + "d": "

    Returns a new span with the reveal attribute set to true.

    " + }, { "t": "M", "n": "Dagger\\Terminal::id", diff --git a/docs/static/reference/php/doctum.js b/docs/static/reference/php/doctum.js index be933848965..54b5efa7bbb 100644 --- a/docs/static/reference/php/doctum.js +++ b/docs/static/reference/php/doctum.js @@ -1,5 +1,5 @@ var Doctum = { - treeJson: {"tree":{"l":0,"n":"","p":"","c":[{"l":1,"n":"Dagger","p":"Dagger","c":[{"l":2,"n":"Attribute","p":"Dagger/Attribute","c":[{"l":3,"n":"Argument","p":"Dagger/Attribute/Argument"},{"l":3,"n":"DaggerFunction","p":"Dagger/Attribute/DaggerFunction"},{"l":3,"n":"DaggerObject","p":"Dagger/Attribute/DaggerObject"},{"l":3,"n":"DefaultPath","p":"Dagger/Attribute/DefaultPath"},{"l":3,"n":"Doc","p":"Dagger/Attribute/Doc"},{"l":3,"n":"Ignore","p":"Dagger/Attribute/Ignore"},{"l":3,"n":"ListOfType","p":"Dagger/Attribute/ListOfType"},{"l":3,"n":"ReturnsListOfType","p":"Dagger/Attribute/ReturnsListOfType"}]},{"l":2,"n":"Client","p":"Dagger/Client","c":[{"l":3,"n":"AbstractClient","p":"Dagger/Client/AbstractClient"},{"l":3,"n":"AbstractId","p":"Dagger/Client/AbstractId"},{"l":3,"n":"AbstractInputObject","p":"Dagger/Client/AbstractInputObject"},{"l":3,"n":"AbstractObject","p":"Dagger/Client/AbstractObject"},{"l":3,"n":"AbstractScalar","p":"Dagger/Client/AbstractScalar"},{"l":3,"n":"IdAble","p":"Dagger/Client/IdAble"},{"l":3,"n":"QueryBuilder","p":"Dagger/Client/QueryBuilder"}]},{"l":2,"n":"Binding","p":"Dagger/Binding"},{"l":2,"n":"BindingId","p":"Dagger/BindingId"},{"l":2,"n":"BuildArg","p":"Dagger/BuildArg"},{"l":2,"n":"CacheVolume","p":"Dagger/CacheVolume"},{"l":2,"n":"CacheVolumeId","p":"Dagger/CacheVolumeId"},{"l":2,"n":"Client","p":"Dagger/Client"},{"l":2,"n":"Cloud","p":"Dagger/Cloud"},{"l":2,"n":"CloudId","p":"Dagger/CloudId"},{"l":2,"n":"Connection","p":"Dagger/Connection"},{"l":2,"n":"Container","p":"Dagger/Container"},{"l":2,"n":"ContainerId","p":"Dagger/ContainerId"},{"l":2,"n":"CurrentModule","p":"Dagger/CurrentModule"},{"l":2,"n":"CurrentModuleId","p":"Dagger/CurrentModuleId"},{"l":2,"n":"Dagger","p":"Dagger/Dagger"},{"l":2,"n":"Directory","p":"Dagger/Directory"},{"l":2,"n":"DirectoryId","p":"Dagger/DirectoryId"},{"l":2,"n":"Engine","p":"Dagger/Engine"},{"l":2,"n":"EngineCache","p":"Dagger/EngineCache"},{"l":2,"n":"EngineCacheEntry","p":"Dagger/EngineCacheEntry"},{"l":2,"n":"EngineCacheEntryId","p":"Dagger/EngineCacheEntryId"},{"l":2,"n":"EngineCacheEntrySet","p":"Dagger/EngineCacheEntrySet"},{"l":2,"n":"EngineCacheEntrySetId","p":"Dagger/EngineCacheEntrySetId"},{"l":2,"n":"EngineCacheId","p":"Dagger/EngineCacheId"},{"l":2,"n":"EngineId","p":"Dagger/EngineId"},{"l":2,"n":"EnumTypeDef","p":"Dagger/EnumTypeDef"},{"l":2,"n":"EnumTypeDefId","p":"Dagger/EnumTypeDefId"},{"l":2,"n":"EnumValueTypeDef","p":"Dagger/EnumValueTypeDef"},{"l":2,"n":"EnumValueTypeDefId","p":"Dagger/EnumValueTypeDefId"},{"l":2,"n":"Env","p":"Dagger/Env"},{"l":2,"n":"EnvId","p":"Dagger/EnvId"},{"l":2,"n":"EnvVariable","p":"Dagger/EnvVariable"},{"l":2,"n":"EnvVariableId","p":"Dagger/EnvVariableId"},{"l":2,"n":"Error","p":"Dagger/Error"},{"l":2,"n":"ErrorId","p":"Dagger/ErrorId"},{"l":2,"n":"ErrorValue","p":"Dagger/ErrorValue"},{"l":2,"n":"ErrorValueId","p":"Dagger/ErrorValueId"},{"l":2,"n":"FieldTypeDef","p":"Dagger/FieldTypeDef"},{"l":2,"n":"FieldTypeDefId","p":"Dagger/FieldTypeDefId"},{"l":2,"n":"File","p":"Dagger/File"},{"l":2,"n":"FileId","p":"Dagger/FileId"},{"l":2,"n":"FunctionArg","p":"Dagger/FunctionArg"},{"l":2,"n":"FunctionArgId","p":"Dagger/FunctionArgId"},{"l":2,"n":"FunctionCall","p":"Dagger/FunctionCall"},{"l":2,"n":"FunctionCallArgValue","p":"Dagger/FunctionCallArgValue"},{"l":2,"n":"FunctionCallArgValueId","p":"Dagger/FunctionCallArgValueId"},{"l":2,"n":"FunctionCallId","p":"Dagger/FunctionCallId"},{"l":2,"n":"FunctionId","p":"Dagger/FunctionId"},{"l":2,"n":"Function_","p":"Dagger/Function_"},{"l":2,"n":"GeneratedCode","p":"Dagger/GeneratedCode"},{"l":2,"n":"GeneratedCodeId","p":"Dagger/GeneratedCodeId"},{"l":2,"n":"GitRef","p":"Dagger/GitRef"},{"l":2,"n":"GitRefId","p":"Dagger/GitRefId"},{"l":2,"n":"GitRepository","p":"Dagger/GitRepository"},{"l":2,"n":"GitRepositoryId","p":"Dagger/GitRepositoryId"},{"l":2,"n":"Host","p":"Dagger/Host"},{"l":2,"n":"HostId","p":"Dagger/HostId"},{"l":2,"n":"InputTypeDef","p":"Dagger/InputTypeDef"},{"l":2,"n":"InputTypeDefId","p":"Dagger/InputTypeDefId"},{"l":2,"n":"InterfaceTypeDef","p":"Dagger/InterfaceTypeDef"},{"l":2,"n":"InterfaceTypeDefId","p":"Dagger/InterfaceTypeDefId"},{"l":2,"n":"Json","p":"Dagger/Json"},{"l":2,"n":"LLM","p":"Dagger/LLM"},{"l":2,"n":"LLMId","p":"Dagger/LLMId"},{"l":2,"n":"LLMTokenUsage","p":"Dagger/LLMTokenUsage"},{"l":2,"n":"LLMTokenUsageId","p":"Dagger/LLMTokenUsageId"},{"l":2,"n":"Label","p":"Dagger/Label"},{"l":2,"n":"LabelId","p":"Dagger/LabelId"},{"l":2,"n":"ListTypeDef","p":"Dagger/ListTypeDef"},{"l":2,"n":"ListTypeDefId","p":"Dagger/ListTypeDefId"},{"l":2,"n":"Module","p":"Dagger/Module"},{"l":2,"n":"ModuleConfigClient","p":"Dagger/ModuleConfigClient"},{"l":2,"n":"ModuleConfigClientId","p":"Dagger/ModuleConfigClientId"},{"l":2,"n":"ModuleId","p":"Dagger/ModuleId"},{"l":2,"n":"ModuleSource","p":"Dagger/ModuleSource"},{"l":2,"n":"ModuleSourceId","p":"Dagger/ModuleSourceId"},{"l":2,"n":"ObjectTypeDef","p":"Dagger/ObjectTypeDef"},{"l":2,"n":"ObjectTypeDefId","p":"Dagger/ObjectTypeDefId"},{"l":2,"n":"PipelineLabel","p":"Dagger/PipelineLabel"},{"l":2,"n":"Platform","p":"Dagger/Platform"},{"l":2,"n":"Port","p":"Dagger/Port"},{"l":2,"n":"PortForward","p":"Dagger/PortForward"},{"l":2,"n":"PortId","p":"Dagger/PortId"},{"l":2,"n":"SDKConfig","p":"Dagger/SDKConfig"},{"l":2,"n":"SDKConfigId","p":"Dagger/SDKConfigId"},{"l":2,"n":"ScalarTypeDef","p":"Dagger/ScalarTypeDef"},{"l":2,"n":"ScalarTypeDefId","p":"Dagger/ScalarTypeDefId"},{"l":2,"n":"Secret","p":"Dagger/Secret"},{"l":2,"n":"SecretId","p":"Dagger/SecretId"},{"l":2,"n":"Service","p":"Dagger/Service"},{"l":2,"n":"ServiceId","p":"Dagger/ServiceId"},{"l":2,"n":"Socket","p":"Dagger/Socket"},{"l":2,"n":"SocketId","p":"Dagger/SocketId"},{"l":2,"n":"SourceMap","p":"Dagger/SourceMap"},{"l":2,"n":"SourceMapId","p":"Dagger/SourceMapId"},{"l":2,"n":"Terminal","p":"Dagger/Terminal"},{"l":2,"n":"TerminalId","p":"Dagger/TerminalId"},{"l":2,"n":"TypeDef","p":"Dagger/TypeDef"},{"l":2,"n":"TypeDefId","p":"Dagger/TypeDefId"}]}]},"treeOpenLevel":2}, + treeJson: {"tree":{"l":0,"n":"","p":"","c":[{"l":1,"n":"Dagger","p":"Dagger","c":[{"l":2,"n":"Attribute","p":"Dagger/Attribute","c":[{"l":3,"n":"Argument","p":"Dagger/Attribute/Argument"},{"l":3,"n":"DaggerFunction","p":"Dagger/Attribute/DaggerFunction"},{"l":3,"n":"DaggerObject","p":"Dagger/Attribute/DaggerObject"},{"l":3,"n":"DefaultPath","p":"Dagger/Attribute/DefaultPath"},{"l":3,"n":"Doc","p":"Dagger/Attribute/Doc"},{"l":3,"n":"Ignore","p":"Dagger/Attribute/Ignore"},{"l":3,"n":"ListOfType","p":"Dagger/Attribute/ListOfType"},{"l":3,"n":"ReturnsListOfType","p":"Dagger/Attribute/ReturnsListOfType"}]},{"l":2,"n":"Client","p":"Dagger/Client","c":[{"l":3,"n":"AbstractClient","p":"Dagger/Client/AbstractClient"},{"l":3,"n":"AbstractId","p":"Dagger/Client/AbstractId"},{"l":3,"n":"AbstractInputObject","p":"Dagger/Client/AbstractInputObject"},{"l":3,"n":"AbstractObject","p":"Dagger/Client/AbstractObject"},{"l":3,"n":"AbstractScalar","p":"Dagger/Client/AbstractScalar"},{"l":3,"n":"IdAble","p":"Dagger/Client/IdAble"},{"l":3,"n":"QueryBuilder","p":"Dagger/Client/QueryBuilder"}]},{"l":2,"n":"Binding","p":"Dagger/Binding"},{"l":2,"n":"BindingId","p":"Dagger/BindingId"},{"l":2,"n":"BuildArg","p":"Dagger/BuildArg"},{"l":2,"n":"CacheVolume","p":"Dagger/CacheVolume"},{"l":2,"n":"CacheVolumeId","p":"Dagger/CacheVolumeId"},{"l":2,"n":"Client","p":"Dagger/Client"},{"l":2,"n":"Cloud","p":"Dagger/Cloud"},{"l":2,"n":"CloudId","p":"Dagger/CloudId"},{"l":2,"n":"Connection","p":"Dagger/Connection"},{"l":2,"n":"Container","p":"Dagger/Container"},{"l":2,"n":"ContainerId","p":"Dagger/ContainerId"},{"l":2,"n":"CurrentModule","p":"Dagger/CurrentModule"},{"l":2,"n":"CurrentModuleId","p":"Dagger/CurrentModuleId"},{"l":2,"n":"Dagger","p":"Dagger/Dagger"},{"l":2,"n":"Directory","p":"Dagger/Directory"},{"l":2,"n":"DirectoryId","p":"Dagger/DirectoryId"},{"l":2,"n":"Engine","p":"Dagger/Engine"},{"l":2,"n":"EngineCache","p":"Dagger/EngineCache"},{"l":2,"n":"EngineCacheEntry","p":"Dagger/EngineCacheEntry"},{"l":2,"n":"EngineCacheEntryId","p":"Dagger/EngineCacheEntryId"},{"l":2,"n":"EngineCacheEntrySet","p":"Dagger/EngineCacheEntrySet"},{"l":2,"n":"EngineCacheEntrySetId","p":"Dagger/EngineCacheEntrySetId"},{"l":2,"n":"EngineCacheId","p":"Dagger/EngineCacheId"},{"l":2,"n":"EngineId","p":"Dagger/EngineId"},{"l":2,"n":"EnumTypeDef","p":"Dagger/EnumTypeDef"},{"l":2,"n":"EnumTypeDefId","p":"Dagger/EnumTypeDefId"},{"l":2,"n":"EnumValueTypeDef","p":"Dagger/EnumValueTypeDef"},{"l":2,"n":"EnumValueTypeDefId","p":"Dagger/EnumValueTypeDefId"},{"l":2,"n":"Env","p":"Dagger/Env"},{"l":2,"n":"EnvId","p":"Dagger/EnvId"},{"l":2,"n":"EnvVariable","p":"Dagger/EnvVariable"},{"l":2,"n":"EnvVariableId","p":"Dagger/EnvVariableId"},{"l":2,"n":"Error","p":"Dagger/Error"},{"l":2,"n":"ErrorId","p":"Dagger/ErrorId"},{"l":2,"n":"ErrorValue","p":"Dagger/ErrorValue"},{"l":2,"n":"ErrorValueId","p":"Dagger/ErrorValueId"},{"l":2,"n":"FieldTypeDef","p":"Dagger/FieldTypeDef"},{"l":2,"n":"FieldTypeDefId","p":"Dagger/FieldTypeDefId"},{"l":2,"n":"File","p":"Dagger/File"},{"l":2,"n":"FileId","p":"Dagger/FileId"},{"l":2,"n":"FunctionArg","p":"Dagger/FunctionArg"},{"l":2,"n":"FunctionArgId","p":"Dagger/FunctionArgId"},{"l":2,"n":"FunctionCall","p":"Dagger/FunctionCall"},{"l":2,"n":"FunctionCallArgValue","p":"Dagger/FunctionCallArgValue"},{"l":2,"n":"FunctionCallArgValueId","p":"Dagger/FunctionCallArgValueId"},{"l":2,"n":"FunctionCallId","p":"Dagger/FunctionCallId"},{"l":2,"n":"FunctionId","p":"Dagger/FunctionId"},{"l":2,"n":"Function_","p":"Dagger/Function_"},{"l":2,"n":"GeneratedCode","p":"Dagger/GeneratedCode"},{"l":2,"n":"GeneratedCodeId","p":"Dagger/GeneratedCodeId"},{"l":2,"n":"GitRef","p":"Dagger/GitRef"},{"l":2,"n":"GitRefId","p":"Dagger/GitRefId"},{"l":2,"n":"GitRepository","p":"Dagger/GitRepository"},{"l":2,"n":"GitRepositoryId","p":"Dagger/GitRepositoryId"},{"l":2,"n":"Host","p":"Dagger/Host"},{"l":2,"n":"HostId","p":"Dagger/HostId"},{"l":2,"n":"InputTypeDef","p":"Dagger/InputTypeDef"},{"l":2,"n":"InputTypeDefId","p":"Dagger/InputTypeDefId"},{"l":2,"n":"InterfaceTypeDef","p":"Dagger/InterfaceTypeDef"},{"l":2,"n":"InterfaceTypeDefId","p":"Dagger/InterfaceTypeDefId"},{"l":2,"n":"Json","p":"Dagger/Json"},{"l":2,"n":"LLM","p":"Dagger/LLM"},{"l":2,"n":"LLMId","p":"Dagger/LLMId"},{"l":2,"n":"LLMTokenUsage","p":"Dagger/LLMTokenUsage"},{"l":2,"n":"LLMTokenUsageId","p":"Dagger/LLMTokenUsageId"},{"l":2,"n":"Label","p":"Dagger/Label"},{"l":2,"n":"LabelId","p":"Dagger/LabelId"},{"l":2,"n":"ListTypeDef","p":"Dagger/ListTypeDef"},{"l":2,"n":"ListTypeDefId","p":"Dagger/ListTypeDefId"},{"l":2,"n":"Module","p":"Dagger/Module"},{"l":2,"n":"ModuleConfigClient","p":"Dagger/ModuleConfigClient"},{"l":2,"n":"ModuleConfigClientId","p":"Dagger/ModuleConfigClientId"},{"l":2,"n":"ModuleId","p":"Dagger/ModuleId"},{"l":2,"n":"ModuleSource","p":"Dagger/ModuleSource"},{"l":2,"n":"ModuleSourceId","p":"Dagger/ModuleSourceId"},{"l":2,"n":"ObjectTypeDef","p":"Dagger/ObjectTypeDef"},{"l":2,"n":"ObjectTypeDefId","p":"Dagger/ObjectTypeDefId"},{"l":2,"n":"PipelineLabel","p":"Dagger/PipelineLabel"},{"l":2,"n":"Platform","p":"Dagger/Platform"},{"l":2,"n":"Port","p":"Dagger/Port"},{"l":2,"n":"PortForward","p":"Dagger/PortForward"},{"l":2,"n":"PortId","p":"Dagger/PortId"},{"l":2,"n":"SDKConfig","p":"Dagger/SDKConfig"},{"l":2,"n":"SDKConfigId","p":"Dagger/SDKConfigId"},{"l":2,"n":"ScalarTypeDef","p":"Dagger/ScalarTypeDef"},{"l":2,"n":"ScalarTypeDefId","p":"Dagger/ScalarTypeDefId"},{"l":2,"n":"Secret","p":"Dagger/Secret"},{"l":2,"n":"SecretId","p":"Dagger/SecretId"},{"l":2,"n":"Service","p":"Dagger/Service"},{"l":2,"n":"ServiceId","p":"Dagger/ServiceId"},{"l":2,"n":"Socket","p":"Dagger/Socket"},{"l":2,"n":"SocketId","p":"Dagger/SocketId"},{"l":2,"n":"SourceMap","p":"Dagger/SourceMap"},{"l":2,"n":"SourceMapId","p":"Dagger/SourceMapId"},{"l":2,"n":"Span","p":"Dagger/Span"},{"l":2,"n":"SpanId","p":"Dagger/SpanId"},{"l":2,"n":"Terminal","p":"Dagger/Terminal"},{"l":2,"n":"TerminalId","p":"Dagger/TerminalId"},{"l":2,"n":"TypeDef","p":"Dagger/TypeDef"},{"l":2,"n":"TypeDefId","p":"Dagger/TypeDefId"}]}]},"treeOpenLevel":2}, /** @var boolean */ treeLoaded: false, /** @var boolean */ diff --git a/docs/static/reference/php/traits.html b/docs/static/reference/php/traits.html index dd2f3b2b0d4..99ddd12a871 100644 --- a/docs/static/reference/php/traits.html +++ b/docs/static/reference/php/traits.html @@ -77,7 +77,7 @@

    Traits

    -
    +
    From cc2c753ab6af54ba481ee86dc8cfbfb7627f1077 Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Thu, 26 Jun 2025 22:05:23 -0400 Subject: [PATCH 28/36] skip viztest module when linting sometimes this has unreleased APIs Signed-off-by: Alex Suraci --- .dagger/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.dagger/main.go b/.dagger/main.go index f4043f6147e..4ace512ac6b 100644 --- a/.dagger/main.go +++ b/.dagger/main.go @@ -66,7 +66,7 @@ func New( if strings.HasPrefix(module, "core/integration/") { continue } - if strings.HasPrefix(module, "dagql/idtui/viztest/broken") { + if strings.HasPrefix(module, "dagql/idtui/viztest/") { continue } if strings.HasPrefix(module, "modules/evaluator/") { From 3aa5908195b07876b2b734a296b3001a1c66814d Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Thu, 26 Jun 2025 22:39:47 -0400 Subject: [PATCH 29/36] Span -> Status Signed-off-by: Alex Suraci --- .../go/templates/src/_types/object.go.tmpl | 16 +- .../typescript/templates/src/object.ts.gtpl | 4 +- core/query.go | 8 +- core/schema/query.go | 78 ++++----- core/{span.go => status.go} | 29 ++-- core/telemetry.go | 2 +- sdk/elixir/lib/dagger/gen/client.ex | 26 +-- sdk/elixir/lib/dagger/gen/span.ex | 150 ------------------ sdk/elixir/lib/dagger/gen/span_id.ex | 10 -- sdk/elixir/lib/dagger/gen/status.ex | 150 ++++++++++++++++++ sdk/elixir/lib/dagger/gen/status_id.ex | 10 ++ sdk/go/dag/dag.gen.go | 16 +- sdk/go/dagger.gen.go | 124 +++++++-------- sdk/php/generated/Client.php | 22 +-- sdk/php/generated/{Span.php => Status.php} | 44 ++--- .../generated/{SpanId.php => StatusId.php} | 4 +- sdk/python/codegen/src/codegen/generator.py | 2 +- sdk/python/src/dagger/client/gen.py | 78 ++++----- sdk/rust/crates/dagger-sdk/src/gen.rs | 100 ++++++------ sdk/typescript/src/api/client.gen.ts | 94 +++++------ 20 files changed, 483 insertions(+), 484 deletions(-) rename core/{span.go => status.go} (66%) delete mode 100644 sdk/elixir/lib/dagger/gen/span.ex delete mode 100644 sdk/elixir/lib/dagger/gen/span_id.ex create mode 100644 sdk/elixir/lib/dagger/gen/status.ex create mode 100644 sdk/elixir/lib/dagger/gen/status_id.ex rename sdk/php/generated/{Span.php => Status.php} (52%) rename sdk/php/generated/{SpanId.php => StatusId.php} (50%) diff --git a/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl b/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl index 9a56e7c85c3..11425bc5d7c 100644 --- a/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl +++ b/cmd/codegen/generator/go/templates/src/_types/object.go.tmpl @@ -33,8 +33,8 @@ func (r *{{ .Name | FormatName }}) WithGraphQLQuery(q *querybuilder.Selection) * } } -{{- if eq .Name "Span" }} -func (r *Span) Context(ctx context.Context) (context.Context, *Span) { +{{- if eq .Name "Status" }} +func (r *Status) Context(ctx context.Context) (context.Context, *Status) { started, err := r.Start(ctx) if err != nil { panic(err) @@ -58,8 +58,8 @@ func (r *Span) Context(ctx context.Context) (context.Context, *Span) { } {{- $supportsVoid := CheckVersionCompatibility "v0.12.0" }} -func (r *Span) Run(ctx context.Context, cb func(context.Context) error) error { - ctx, span := r.Context(ctx) +func (r *Status) Run(ctx context.Context, cb func(context.Context) error) error { + ctx, status := r.Context(ctx) err := cb(ctx) var endErr error if err != nil { @@ -68,19 +68,19 @@ func (r *Span) Run(ctx context.Context, cb func(context.Context) error) error { client: r.client, } {{- if $supportsVoid }} - endErr = span.End(ctx, SpanEndOpts{ + endErr = status.End(ctx, StatusEndOpts{ Error: errClient.Error(err.Error()), }) {{- else }} - _, endErr = span.End(ctx, SpanEndOpts{ + _, endErr = status.End(ctx, StatusEndOpts{ Error: errClient.Error(err.Error()), }) {{- end }} } else { {{- if $supportsVoid }} - endErr = span.End(ctx) + endErr = status.End(ctx) {{- else }} - _, endErr = span.End(ctx) + _, endErr = status.End(ctx) {{- end }} } return errors.Join(err, endErr) diff --git a/cmd/codegen/generator/typescript/templates/src/object.ts.gtpl b/cmd/codegen/generator/typescript/templates/src/object.ts.gtpl index 5633815d1aa..bbcc6b2a4a5 100644 --- a/cmd/codegen/generator/typescript/templates/src/object.ts.gtpl +++ b/cmd/codegen/generator/typescript/templates/src/object.ts.gtpl @@ -67,9 +67,9 @@ export class {{ .Name | QueryToClient | FormatName }} extends BaseClient { {{- w {{- end }} {{- end }} -{{- if eq .Name "Span" }} +{{- if eq .Name "Status" }} - public async run(fn: (span: Span) => Promise) { + public async run(fn: (span: Status) => Promise) { const started = await this.start() const spanIdHex = await started.internalId() diff --git a/core/query.go b/core/query.go index 1ae5a9e9cc1..607b1498855 100644 --- a/core/query.go +++ b/core/query.go @@ -27,7 +27,7 @@ import ( type Query struct { Server - spans map[string]*Span + spans map[string]*Status spansL *sync.Mutex } @@ -138,7 +138,7 @@ func CurrentQuery(ctx context.Context) (*Query, error) { func NewRoot(srv Server) *Query { return &Query{ Server: srv, - spans: map[string]*Span{}, + spans: map[string]*Status{}, spansL: new(sync.Mutex), } } @@ -162,7 +162,7 @@ func (q *Query) WithPipeline(name, desc string) *Query { return q.Clone() } -func (q *Query) StartSpan(ctx context.Context, s *Span) *Span { +func (q *Query) StartSpan(ctx context.Context, s *Status) *Status { started := s.Clone() _, started.Span = Tracer(ctx).Start(ctx, s.Name, s.Opts()...) q.spansL.Lock() @@ -171,7 +171,7 @@ func (q *Query) StartSpan(ctx context.Context, s *Span) *Span { return started } -func (q *Query) LookupSpan(spanID string) (*Span, bool) { +func (q *Query) LookupStatus(spanID string) (*Status, bool) { q.spansL.Lock() span, found := q.spans[spanID] q.spansL.Unlock() diff --git a/core/schema/query.go b/core/schema/query.go index bf238913c0e..1de0f07d97b 100644 --- a/core/schema/query.go +++ b/core/schema/query.go @@ -59,7 +59,7 @@ func (s *querySchema) Install() { dagql.Fields[*core.Query]{ dagql.Func("reveal", s.reveal). - Doc(`Returns a span that reveals its child spans and hides itself.`), + Doc(`Returns a status that reveals its child statuses and hides itself.`), dagql.Func("pipeline", s.pipeline). View(BeforeVersion("v0.13.0")). @@ -74,33 +74,33 @@ func (s *querySchema) Install() { dagql.Func("version", s.version). Doc(`Get the current Dagger Engine version.`), - dagql.Func("span", s.span). - Doc(`Create a new OpenTelemetry span.`). + dagql.Func("status", s.status). + Doc(`Create a new status indicator.`). Args( - dagql.Arg("name").Doc("Name of the span."), + dagql.Arg("name").Doc("A display name for the status."), ), }.Install(s.srv) - dagql.Fields[*core.Span]{ - dagql.Func("withActor", s.spanWithActor), + dagql.Fields[*core.Status]{ + dagql.Func("withActor", s.statusWithActor), - dagql.Func("withInternal", s.spanWithInternal). - Doc(`Returns a new span with the internal attribute set to true.`), + dagql.Func("withInternal", s.statusWithInternal). + Doc(`Returns a new status with the internal attribute set to true.`), - dagql.Func("withPassthrough", s.spanWithPassthrough). - Doc(`Returns a new span with the passthrough attribute set to true.`), + dagql.Func("withPassthrough", s.statusWithPassthrough). + Doc(`Returns a new status with the passthrough attribute set to true.`), - dagql.Func("withReveal", s.spanWithReveal). - Doc(`Returns a new span with the reveal attribute set to true.`), + dagql.Func("withReveal", s.statusWithReveal). + Doc(`Returns a new status with the reveal attribute set to true.`), - dagql.Func("internalId", s.spanInternalID). - Doc(`Returns the internal ID of the span.`), + dagql.Func("internalId", s.statusInternalID). + Doc(`Returns the internal ID of the status.`), - dagql.NodeFuncWithCacheKey("start", s.spanStart, dagql.CachePerCall). - Doc(`Start a new instance of the span.`), + dagql.NodeFuncWithCacheKey("start", s.statusStart, dagql.CachePerCall). + Doc(`Start a new instance of the status.`), - dagql.Func("end", s.spanEnd). - Doc(`End the OpenTelemetry span, with an optional error.`), + dagql.Func("end", s.statusEnd). + Doc(`Mark the status as complete, with an optional error.`), }.Install(s.srv) } @@ -186,26 +186,26 @@ func (s *querySchema) schemaJSONFile( return fileInst.WithDigest(dgst), nil } -func (s *querySchema) span(ctx context.Context, parent *core.Query, args struct { +func (s *querySchema) status(ctx context.Context, parent *core.Query, args struct { Name string Key string `default:""` -}) (*core.Span, error) { +}) (*core.Status, error) { query := parent if args.Key != "" { - span, found := query.LookupSpan(args.Key) + status, found := query.LookupStatus(args.Key) if !found { - return nil, fmt.Errorf("span not found: %s", args.Key) + return nil, fmt.Errorf("status not found: %s", args.Key) } - return span, nil + return status, nil } - return &core.Span{ + return &core.Status{ Name: args.Name, Query: parent, }, nil } -func (s *querySchema) reveal(ctx context.Context, parent *core.Query, args struct{}) (*core.Span, error) { - return &core.Span{ +func (s *querySchema) reveal(ctx context.Context, parent *core.Query, args struct{}) (*core.Status, error) { + return &core.Status{ Name: "reveal", Reveal: true, Passthrough: true, @@ -213,27 +213,27 @@ func (s *querySchema) reveal(ctx context.Context, parent *core.Query, args struc }, nil } -func (s *querySchema) spanStart(ctx context.Context, parent dagql.Instance[*core.Span], args struct{}) (dagql.ID[*core.Span], error) { +func (s *querySchema) statusStart(ctx context.Context, parent dagql.Instance[*core.Status], args struct{}) (dagql.ID[*core.Status], error) { started := parent.Self.Start(ctx) - var inst dagql.Instance[*core.Span] + var inst dagql.Instance[*core.Status] err := s.srv.Select(ctx, s.srv.Root(), &inst, dagql.Selector{ - Field: "span", + Field: "status", Args: []dagql.NamedInput{ {Name: "name", Value: dagql.NewString(started.Name)}, {Name: "key", Value: dagql.NewString(started.InternalID())}, }, }) if err != nil { - return dagql.ID[*core.Span]{}, err + return dagql.ID[*core.Status]{}, err } - return dagql.NewID[*core.Span](inst.ID()), nil + return dagql.NewID[*core.Status](inst.ID()), nil } -func (s *querySchema) spanEnd(ctx context.Context, parent *core.Span, args struct { +func (s *querySchema) statusEnd(ctx context.Context, parent *core.Status, args struct { Error dagql.Optional[dagql.ID[*core.Error]] }) (dagql.Nullable[core.Void], error) { if parent.Span == nil { - return dagql.Null[core.Void](), fmt.Errorf("span not started") + return dagql.Null[core.Void](), fmt.Errorf("status not started") } if args.Error.Valid { dagErr, err := args.Error.Value.Load(ctx, s.srv) @@ -247,24 +247,24 @@ func (s *querySchema) spanEnd(ctx context.Context, parent *core.Span, args struc return dagql.Null[core.Void](), nil } -func (s *querySchema) spanInternalID(ctx context.Context, parent *core.Span, args struct{}) (string, error) { +func (s *querySchema) statusInternalID(ctx context.Context, parent *core.Status, args struct{}) (string, error) { return parent.Span.SpanContext().SpanID().String(), nil } -func (s *querySchema) spanWithActor(ctx context.Context, parent *core.Span, args struct { +func (s *querySchema) statusWithActor(ctx context.Context, parent *core.Status, args struct { Actor string -}) (*core.Span, error) { +}) (*core.Status, error) { return parent.WithActor(args.Actor), nil } -func (s *querySchema) spanWithInternal(ctx context.Context, parent *core.Span, args struct{}) (*core.Span, error) { +func (s *querySchema) statusWithInternal(ctx context.Context, parent *core.Status, args struct{}) (*core.Status, error) { return parent.WithInternal(), nil } -func (s *querySchema) spanWithReveal(ctx context.Context, parent *core.Span, args struct{}) (*core.Span, error) { +func (s *querySchema) statusWithReveal(ctx context.Context, parent *core.Status, args struct{}) (*core.Status, error) { return parent.WithReveal(), nil } -func (s *querySchema) spanWithPassthrough(ctx context.Context, parent *core.Span, args struct{}) (*core.Span, error) { +func (s *querySchema) statusWithPassthrough(ctx context.Context, parent *core.Status, args struct{}) (*core.Status, error) { return parent.WithPassthrough(), nil } diff --git a/core/span.go b/core/status.go similarity index 66% rename from core/span.go rename to core/status.go index 00f7131725e..beda2114873 100644 --- a/core/span.go +++ b/core/status.go @@ -9,8 +9,8 @@ import ( "go.opentelemetry.io/otel/trace" ) -type Span struct { - Name string `field:"true" doc:"The name of the span."` +type Status struct { + Name string `field:"true" doc:"The display name of the status."` Actor string Internal bool @@ -22,60 +22,59 @@ type Span struct { Span trace.Span } -func (*Span) Type() *ast.Type { +func (*Status) Type() *ast.Type { return &ast.Type{ - NamedType: "Span", + NamedType: "Status", NonNull: true, } } -func (*Span) TypeDescription() string { - // TODO: rename to Task and come up with a nice description - return "An OpenTelemetry span." +func (*Status) TypeDescription() string { + return "A status indicator to show to the user." } -func (s Span) Clone() *Span { +func (s Status) Clone() *Status { cp := &s cp.Query = cp.Query.Clone() return cp } -func (s *Span) WithActor(actor string) *Span { +func (s *Status) WithActor(actor string) *Status { cp := s.Clone() cp.Actor = actor return cp } -func (s *Span) WithInternal() *Span { +func (s *Status) WithInternal() *Status { cp := s.Clone() cp.Internal = true return cp } -func (s *Span) WithPassthrough() *Span { +func (s *Status) WithPassthrough() *Status { cp := s.Clone() cp.Passthrough = true return cp } -func (s *Span) WithReveal() *Span { +func (s *Status) WithReveal() *Status { cp := s.Clone() cp.Reveal = true return cp } -func (s *Span) Start(ctx context.Context) *Span { +func (s *Status) Start(ctx context.Context) *Status { return s.Query.StartSpan(ctx, s) } -func (s *Span) InternalID() string { +func (s *Status) InternalID() string { if s.Span == nil { return "" } return s.Span.SpanContext().SpanID().String() } -func (s *Span) Opts() []trace.SpanStartOption { +func (s *Status) Opts() []trace.SpanStartOption { var opts []trace.SpanStartOption if s.Actor != "" { opts = append(opts, trace.WithAttributes(attribute.String("dagger.io/ui.actor", s.Actor))) diff --git a/core/telemetry.go b/core/telemetry.go index ecb8278b5d8..7c6ed86bd39 100644 --- a/core/telemetry.go +++ b/core/telemetry.go @@ -220,7 +220,7 @@ func isIntrospection(id *call.ID) bool { // isMeta returns true if any type in the ID is "too meta" to show to the user, // for example span and error APIs. func isMeta(id *call.ID) bool { - if anyReturns(id, "Error") || anyReturns(id, "Span") { + if anyReturns(id, "Error") || anyReturns(id, "Status") { return true } switch id.Field() { diff --git a/sdk/elixir/lib/dagger/gen/client.ex b/sdk/elixir/lib/dagger/gen/client.ex index 5d03c1a4c9f..8e5cc483e95 100644 --- a/sdk/elixir/lib/dagger/gen/client.ex +++ b/sdk/elixir/lib/dagger/gen/client.ex @@ -937,14 +937,14 @@ defmodule Dagger.Client do end @doc """ - Load a Span from its ID. + Load a Status from its ID. """ - @spec load_span_from_id(t(), Dagger.SpanID.t()) :: Dagger.Span.t() - def load_span_from_id(%__MODULE__{} = client, id) do + @spec load_status_from_id(t(), Dagger.StatusID.t()) :: Dagger.Status.t() + def load_status_from_id(%__MODULE__{} = client, id) do query_builder = - client.query_builder |> QB.select("loadSpanFromID") |> QB.put_arg("id", id) + client.query_builder |> QB.select("loadStatusFromID") |> QB.put_arg("id", id) - %Dagger.Span{ + %Dagger.Status{ query_builder: query_builder, client: client.client } @@ -1018,14 +1018,14 @@ defmodule Dagger.Client do end @doc """ - Returns a span that reveals its child spans and hides itself. + Returns a status that reveals its child statuses and hides itself. """ - @spec reveal(t()) :: Dagger.Span.t() + @spec reveal(t()) :: Dagger.Status.t() def reveal(%__MODULE__{} = client) do query_builder = client.query_builder |> QB.select("reveal") - %Dagger.Span{ + %Dagger.Status{ query_builder: query_builder, client: client.client } @@ -1086,17 +1086,17 @@ defmodule Dagger.Client do end @doc """ - Create a new OpenTelemetry span. + Create a new status indicator. """ - @spec span(t(), String.t(), [{:key, String.t() | nil}]) :: Dagger.Span.t() - def span(%__MODULE__{} = client, name, optional_args \\ []) do + @spec status(t(), String.t(), [{:key, String.t() | nil}]) :: Dagger.Status.t() + def status(%__MODULE__{} = client, name, optional_args \\ []) do query_builder = client.query_builder - |> QB.select("span") + |> QB.select("status") |> QB.put_arg("name", name) |> QB.maybe_put_arg("key", optional_args[:key]) - %Dagger.Span{ + %Dagger.Status{ query_builder: query_builder, client: client.client } diff --git a/sdk/elixir/lib/dagger/gen/span.ex b/sdk/elixir/lib/dagger/gen/span.ex deleted file mode 100644 index dd606ddec0a..00000000000 --- a/sdk/elixir/lib/dagger/gen/span.ex +++ /dev/null @@ -1,150 +0,0 @@ -# This file generated by `dagger_codegen`. Please DO NOT EDIT. -defmodule Dagger.Span do - @moduledoc """ - An OpenTelemetry span. - """ - - use Dagger.Core.Base, kind: :object, name: "Span" - - alias Dagger.Core.Client - alias Dagger.Core.QueryBuilder, as: QB - - @derive Dagger.ID - - defstruct [:query_builder, :client] - - @type t() :: %__MODULE__{} - - @doc """ - End the OpenTelemetry span, with an optional error. - """ - @spec end_(t(), [{:error, Dagger.ErrorID.t() | nil}]) :: :ok | {:error, term()} - def end_(%__MODULE__{} = span, optional_args \\ []) do - query_builder = - span.query_builder |> QB.select("end") |> QB.maybe_put_arg("error", optional_args[:error]) - - case Client.execute(span.client, query_builder) do - {:ok, _} -> :ok - error -> error - end - end - - @doc """ - A unique identifier for this Span. - """ - @spec id(t()) :: {:ok, Dagger.SpanID.t()} | {:error, term()} - def id(%__MODULE__{} = span) do - query_builder = - span.query_builder |> QB.select("id") - - Client.execute(span.client, query_builder) - end - - @doc """ - Returns the internal ID of the span. - """ - @spec internal_id(t()) :: {:ok, String.t()} | {:error, term()} - def internal_id(%__MODULE__{} = span) do - query_builder = - span.query_builder |> QB.select("internalId") - - Client.execute(span.client, query_builder) - end - - @doc """ - The name of the span. - """ - @spec name(t()) :: {:ok, String.t()} | {:error, term()} - def name(%__MODULE__{} = span) do - query_builder = - span.query_builder |> QB.select("name") - - Client.execute(span.client, query_builder) - end - - @doc """ - Start a new instance of the span. - """ - @spec start(t()) :: {:ok, Dagger.Span.t()} | {:error, term()} - def start(%__MODULE__{} = span) do - query_builder = - span.query_builder |> QB.select("start") - - with {:ok, id} <- Client.execute(span.client, query_builder) do - {:ok, - %Dagger.Span{ - query_builder: - QB.query() - |> QB.select("loadSpanFromID") - |> QB.put_arg("id", id), - client: span.client - }} - end - end - - @spec with_actor(t(), String.t()) :: Dagger.Span.t() - def with_actor(%__MODULE__{} = span, actor) do - query_builder = - span.query_builder |> QB.select("withActor") |> QB.put_arg("actor", actor) - - %Dagger.Span{ - query_builder: query_builder, - client: span.client - } - end - - @doc """ - Returns a new span with the internal attribute set to true. - """ - @spec with_internal(t()) :: Dagger.Span.t() - def with_internal(%__MODULE__{} = span) do - query_builder = - span.query_builder |> QB.select("withInternal") - - %Dagger.Span{ - query_builder: query_builder, - client: span.client - } - end - - @doc """ - Returns a new span with the passthrough attribute set to true. - """ - @spec with_passthrough(t()) :: Dagger.Span.t() - def with_passthrough(%__MODULE__{} = span) do - query_builder = - span.query_builder |> QB.select("withPassthrough") - - %Dagger.Span{ - query_builder: query_builder, - client: span.client - } - end - - @doc """ - Returns a new span with the reveal attribute set to true. - """ - @spec with_reveal(t()) :: Dagger.Span.t() - def with_reveal(%__MODULE__{} = span) do - query_builder = - span.query_builder |> QB.select("withReveal") - - %Dagger.Span{ - query_builder: query_builder, - client: span.client - } - end -end - -defimpl Jason.Encoder, for: Dagger.Span do - def encode(span, opts) do - {:ok, id} = Dagger.Span.id(span) - Jason.Encode.string(id, opts) - end -end - -defimpl Nestru.Decoder, for: Dagger.Span do - def decode_fields_hint(_struct, _context, id) do - {:ok, Dagger.Client.load_span_from_id(Dagger.Global.dag(), id)} - end -end diff --git a/sdk/elixir/lib/dagger/gen/span_id.ex b/sdk/elixir/lib/dagger/gen/span_id.ex deleted file mode 100644 index 5a1b9aee271..00000000000 --- a/sdk/elixir/lib/dagger/gen/span_id.ex +++ /dev/null @@ -1,10 +0,0 @@ -# This file generated by `dagger_codegen`. Please DO NOT EDIT. -defmodule Dagger.SpanID do - @moduledoc """ - The `SpanID` scalar type represents an identifier for an object of type Span. - """ - - use Dagger.Core.Base, kind: :scalar, name: "SpanID" - - @type t() :: String.t() -end diff --git a/sdk/elixir/lib/dagger/gen/status.ex b/sdk/elixir/lib/dagger/gen/status.ex new file mode 100644 index 00000000000..61100cd0501 --- /dev/null +++ b/sdk/elixir/lib/dagger/gen/status.ex @@ -0,0 +1,150 @@ +# This file generated by `dagger_codegen`. Please DO NOT EDIT. +defmodule Dagger.Status do + @moduledoc """ + A status indicator to show to the user. + """ + + use Dagger.Core.Base, kind: :object, name: "Status" + + alias Dagger.Core.Client + alias Dagger.Core.QueryBuilder, as: QB + + @derive Dagger.ID + + defstruct [:query_builder, :client] + + @type t() :: %__MODULE__{} + + @doc """ + Mark the status as complete, with an optional error. + """ + @spec end_(t(), [{:error, Dagger.ErrorID.t() | nil}]) :: :ok | {:error, term()} + def end_(%__MODULE__{} = status, optional_args \\ []) do + query_builder = + status.query_builder |> QB.select("end") |> QB.maybe_put_arg("error", optional_args[:error]) + + case Client.execute(status.client, query_builder) do + {:ok, _} -> :ok + error -> error + end + end + + @doc """ + A unique identifier for this Status. + """ + @spec id(t()) :: {:ok, Dagger.StatusID.t()} | {:error, term()} + def id(%__MODULE__{} = status) do + query_builder = + status.query_builder |> QB.select("id") + + Client.execute(status.client, query_builder) + end + + @doc """ + Returns the internal ID of the status. + """ + @spec internal_id(t()) :: {:ok, String.t()} | {:error, term()} + def internal_id(%__MODULE__{} = status) do + query_builder = + status.query_builder |> QB.select("internalId") + + Client.execute(status.client, query_builder) + end + + @doc """ + The display name of the status. + """ + @spec name(t()) :: {:ok, String.t()} | {:error, term()} + def name(%__MODULE__{} = status) do + query_builder = + status.query_builder |> QB.select("name") + + Client.execute(status.client, query_builder) + end + + @doc """ + Start a new instance of the status. + """ + @spec start(t()) :: {:ok, Dagger.Status.t()} | {:error, term()} + def start(%__MODULE__{} = status) do + query_builder = + status.query_builder |> QB.select("start") + + with {:ok, id} <- Client.execute(status.client, query_builder) do + {:ok, + %Dagger.Status{ + query_builder: + QB.query() + |> QB.select("loadStatusFromID") + |> QB.put_arg("id", id), + client: status.client + }} + end + end + + @spec with_actor(t(), String.t()) :: Dagger.Status.t() + def with_actor(%__MODULE__{} = status, actor) do + query_builder = + status.query_builder |> QB.select("withActor") |> QB.put_arg("actor", actor) + + %Dagger.Status{ + query_builder: query_builder, + client: status.client + } + end + + @doc """ + Returns a new status with the internal attribute set to true. + """ + @spec with_internal(t()) :: Dagger.Status.t() + def with_internal(%__MODULE__{} = status) do + query_builder = + status.query_builder |> QB.select("withInternal") + + %Dagger.Status{ + query_builder: query_builder, + client: status.client + } + end + + @doc """ + Returns a new status with the passthrough attribute set to true. + """ + @spec with_passthrough(t()) :: Dagger.Status.t() + def with_passthrough(%__MODULE__{} = status) do + query_builder = + status.query_builder |> QB.select("withPassthrough") + + %Dagger.Status{ + query_builder: query_builder, + client: status.client + } + end + + @doc """ + Returns a new status with the reveal attribute set to true. + """ + @spec with_reveal(t()) :: Dagger.Status.t() + def with_reveal(%__MODULE__{} = status) do + query_builder = + status.query_builder |> QB.select("withReveal") + + %Dagger.Status{ + query_builder: query_builder, + client: status.client + } + end +end + +defimpl Jason.Encoder, for: Dagger.Status do + def encode(status, opts) do + {:ok, id} = Dagger.Status.id(status) + Jason.Encode.string(id, opts) + end +end + +defimpl Nestru.Decoder, for: Dagger.Status do + def decode_fields_hint(_struct, _context, id) do + {:ok, Dagger.Client.load_status_from_id(Dagger.Global.dag(), id)} + end +end diff --git a/sdk/elixir/lib/dagger/gen/status_id.ex b/sdk/elixir/lib/dagger/gen/status_id.ex new file mode 100644 index 00000000000..438fce2ed94 --- /dev/null +++ b/sdk/elixir/lib/dagger/gen/status_id.ex @@ -0,0 +1,10 @@ +# This file generated by `dagger_codegen`. Please DO NOT EDIT. +defmodule Dagger.StatusID do + @moduledoc """ + The `StatusID` scalar type represents an identifier for an object of type Status. + """ + + use Dagger.Core.Base, kind: :scalar, name: "StatusID" + + @type t() :: String.t() +end diff --git a/sdk/go/dag/dag.gen.go b/sdk/go/dag/dag.gen.go index 0a470ae76b3..3b201063394 100644 --- a/sdk/go/dag/dag.gen.go +++ b/sdk/go/dag/dag.gen.go @@ -420,10 +420,10 @@ func LoadSourceMapFromID(id dagger.SourceMapID) *dagger.SourceMap { return client.LoadSourceMapFromID(id) } -// Load a Span from its ID. -func LoadSpanFromID(id dagger.SpanID) *dagger.Span { +// Load a Status from its ID. +func LoadStatusFromID(id dagger.StatusID) *dagger.Status { client := initClient() - return client.LoadSpanFromID(id) + return client.LoadStatusFromID(id) } // Load a Terminal from its ID. @@ -450,8 +450,8 @@ func ModuleSource(refString string, opts ...dagger.ModuleSourceOpts) *dagger.Mod return client.ModuleSource(refString, opts...) } -// Returns a span that reveals its child spans and hides itself. -func Reveal() *dagger.Span { +// Returns a status that reveals its child statuses and hides itself. +func Reveal() *dagger.Status { client := initClient() return client.Reveal() } @@ -476,10 +476,10 @@ func SourceMap(filename string, line int, column int) *dagger.SourceMap { return client.SourceMap(filename, line, column) } -// Create a new OpenTelemetry span. -func Span(name string, opts ...dagger.SpanOpts) *dagger.Span { +// Create a new status indicator. +func Status(name string, opts ...dagger.StatusOpts) *dagger.Status { client := initClient() - return client.Span(name, opts...) + return client.Status(name, opts...) } // Create a new TypeDef. diff --git a/sdk/go/dagger.gen.go b/sdk/go/dagger.gen.go index cd3cafefafa..607ba2c632d 100644 --- a/sdk/go/dagger.gen.go +++ b/sdk/go/dagger.gen.go @@ -266,8 +266,8 @@ type SocketID string // The `SourceMapID` scalar type represents an identifier for an object of type SourceMap. type SourceMapID string -// The `SpanID` scalar type represents an identifier for an object of type Span. -type SpanID string +// The `StatusID` scalar type represents an identifier for an object of type Status. +type StatusID string // The `TerminalID` scalar type represents an identifier for an object of type Terminal. type TerminalID string @@ -9274,12 +9274,12 @@ func (r *Client) LoadSourceMapFromID(id SourceMapID) *SourceMap { } } -// Load a Span from its ID. -func (r *Client) LoadSpanFromID(id SpanID) *Span { - q := r.query.Select("loadSpanFromID") +// Load a Status from its ID. +func (r *Client) LoadStatusFromID(id StatusID) *Status { + q := r.query.Select("loadStatusFromID") q = q.Arg("id", id) - return &Span{ + return &Status{ query: q, client: r.client, } @@ -9358,11 +9358,11 @@ func (r *Client) ModuleSource(refString string, opts ...ModuleSourceOpts) *Modul } } -// Returns a span that reveals its child spans and hides itself. -func (r *Client) Reveal() *Span { +// Returns a status that reveals its child statuses and hides itself. +func (r *Client) Reveal() *Status { q := r.query.Select("reveal") - return &Span{ + return &Status{ query: q, client: r.client, } @@ -9422,14 +9422,14 @@ func (r *Client) SourceMap(filename string, line int, column int) *SourceMap { } } -// SpanOpts contains options for Client.Span -type SpanOpts struct { +// StatusOpts contains options for Client.Status +type StatusOpts struct { Key string } -// Create a new OpenTelemetry span. -func (r *Client) Span(name string, opts ...SpanOpts) *Span { - q := r.query.Select("span") +// Create a new status indicator. +func (r *Client) Status(name string, opts ...StatusOpts) *Status { + q := r.query.Select("status") for i := len(opts) - 1; i >= 0; i-- { // `key` optional argument if !querybuilder.IsZeroValue(opts[i].Key) { @@ -9438,7 +9438,7 @@ func (r *Client) Span(name string, opts ...SpanOpts) *Span { } q = q.Arg("name", name) - return &Span{ + return &Status{ query: q, client: r.client, } @@ -10123,33 +10123,33 @@ func (r *SourceMap) Module(ctx context.Context) (string, error) { return response, q.Execute(ctx) } -// An OpenTelemetry span. -type Span struct { +// A status indicator to show to the user. +type Status struct { query *querybuilder.Selection client graphql.Client end *Void - id *SpanID + id *StatusID internalId *string name *string - start *SpanID + start *StatusID } -type WithSpanFunc func(r *Span) *Span +type WithStatusFunc func(r *Status) *Status -// With calls the provided function with current Span. +// With calls the provided function with current Status. // // This is useful for reusability and readability by not breaking the calling chain. -func (r *Span) With(f WithSpanFunc) *Span { +func (r *Status) With(f WithStatusFunc) *Status { return f(r) } -func (r *Span) WithGraphQLQuery(q *querybuilder.Selection) *Span { - return &Span{ +func (r *Status) WithGraphQLQuery(q *querybuilder.Selection) *Status { + return &Status{ query: q, client: r.client, } } -func (r *Span) Context(ctx context.Context) (context.Context, *Span) { +func (r *Status) Context(ctx context.Context) (context.Context, *Status) { started, err := r.Start(ctx) if err != nil { panic(err) @@ -10171,8 +10171,8 @@ func (r *Span) Context(ctx context.Context) (context.Context, *Span) { TraceState: spanCtx.TraceState(), })), started } -func (r *Span) Run(ctx context.Context, cb func(context.Context) error) error { - ctx, span := r.Context(ctx) +func (r *Status) Run(ctx context.Context, cb func(context.Context) error) error { + ctx, status := r.Context(ctx) err := cb(ctx) var endErr error if err != nil { @@ -10180,22 +10180,22 @@ func (r *Span) Run(ctx context.Context, cb func(context.Context) error) error { query: querybuilder.Query().Client(r.client), client: r.client, } - endErr = span.End(ctx, SpanEndOpts{ + endErr = status.End(ctx, StatusEndOpts{ Error: errClient.Error(err.Error()), }) } else { - endErr = span.End(ctx) + endErr = status.End(ctx) } return errors.Join(err, endErr) } -// SpanEndOpts contains options for Span.End -type SpanEndOpts struct { +// StatusEndOpts contains options for Status.End +type StatusEndOpts struct { Error *Error } -// End the OpenTelemetry span, with an optional error. -func (r *Span) End(ctx context.Context, opts ...SpanEndOpts) error { +// Mark the status as complete, with an optional error. +func (r *Status) End(ctx context.Context, opts ...StatusEndOpts) error { if r.end != nil { return nil } @@ -10210,31 +10210,31 @@ func (r *Span) End(ctx context.Context, opts ...SpanEndOpts) error { return q.Execute(ctx) } -// A unique identifier for this Span. -func (r *Span) ID(ctx context.Context) (SpanID, error) { +// A unique identifier for this Status. +func (r *Status) ID(ctx context.Context) (StatusID, error) { if r.id != nil { return *r.id, nil } q := r.query.Select("id") - var response SpanID + var response StatusID q = q.Bind(&response) return response, q.Execute(ctx) } // XXX_GraphQLType is an internal function. It returns the native GraphQL type name -func (r *Span) XXX_GraphQLType() string { - return "Span" +func (r *Status) XXX_GraphQLType() string { + return "Status" } // XXX_GraphQLIDType is an internal function. It returns the native GraphQL type name for the ID of this object -func (r *Span) XXX_GraphQLIDType() string { - return "SpanID" +func (r *Status) XXX_GraphQLIDType() string { + return "StatusID" } // XXX_GraphQLID is an internal function. It returns the underlying type ID -func (r *Span) XXX_GraphQLID(ctx context.Context) (string, error) { +func (r *Status) XXX_GraphQLID(ctx context.Context) (string, error) { id, err := r.ID(ctx) if err != nil { return "", err @@ -10242,7 +10242,7 @@ func (r *Span) XXX_GraphQLID(ctx context.Context) (string, error) { return string(id), nil } -func (r *Span) MarshalJSON() ([]byte, error) { +func (r *Status) MarshalJSON() ([]byte, error) { id, err := r.ID(marshalCtx) if err != nil { return nil, err @@ -10250,8 +10250,8 @@ func (r *Span) MarshalJSON() ([]byte, error) { return json.Marshal(id) } -// Returns the internal ID of the span. -func (r *Span) InternalID(ctx context.Context) (string, error) { +// Returns the internal ID of the status. +func (r *Status) InternalID(ctx context.Context) (string, error) { if r.internalId != nil { return *r.internalId, nil } @@ -10263,8 +10263,8 @@ func (r *Span) InternalID(ctx context.Context) (string, error) { return response, q.Execute(ctx) } -// The name of the span. -func (r *Span) Name(ctx context.Context) (string, error) { +// The display name of the status. +func (r *Status) Name(ctx context.Context) (string, error) { if r.name != nil { return *r.name, nil } @@ -10276,54 +10276,54 @@ func (r *Span) Name(ctx context.Context) (string, error) { return response, q.Execute(ctx) } -// Start a new instance of the span. -func (r *Span) Start(ctx context.Context) (*Span, error) { +// Start a new instance of the status. +func (r *Status) Start(ctx context.Context) (*Status, error) { q := r.query.Select("start") - var id SpanID + var id StatusID if err := q.Bind(&id).Execute(ctx); err != nil { return nil, err } - return &Span{ - query: q.Root().Select("loadSpanFromID").Arg("id", id), + return &Status{ + query: q.Root().Select("loadStatusFromID").Arg("id", id), }, nil } -func (r *Span) WithActor(actor string) *Span { +func (r *Status) WithActor(actor string) *Status { q := r.query.Select("withActor") q = q.Arg("actor", actor) - return &Span{ + return &Status{ query: q, client: r.client, } } -// Returns a new span with the internal attribute set to true. -func (r *Span) WithInternal() *Span { +// Returns a new status with the internal attribute set to true. +func (r *Status) WithInternal() *Status { q := r.query.Select("withInternal") - return &Span{ + return &Status{ query: q, client: r.client, } } -// Returns a new span with the passthrough attribute set to true. -func (r *Span) WithPassthrough() *Span { +// Returns a new status with the passthrough attribute set to true. +func (r *Status) WithPassthrough() *Status { q := r.query.Select("withPassthrough") - return &Span{ + return &Status{ query: q, client: r.client, } } -// Returns a new span with the reveal attribute set to true. -func (r *Span) WithReveal() *Span { +// Returns a new status with the reveal attribute set to true. +func (r *Status) WithReveal() *Status { q := r.query.Select("withReveal") - return &Span{ + return &Status{ query: q, client: r.client, } diff --git a/sdk/php/generated/Client.php b/sdk/php/generated/Client.php index 3cc2e9c32b1..e49d7ffc72c 100644 --- a/sdk/php/generated/Client.php +++ b/sdk/php/generated/Client.php @@ -684,13 +684,13 @@ public function loadSourceMapFromID(SourceMapId|SourceMap $id): SourceMap } /** - * Load a Span from its ID. + * Load a Status from its ID. */ - public function loadSpanFromID(SpanId|Span $id): Span + public function loadStatusFromID(StatusId|Status $id): Status { - $innerQueryBuilder = new \Dagger\Client\QueryBuilder('loadSpanFromID'); + $innerQueryBuilder = new \Dagger\Client\QueryBuilder('loadStatusFromID'); $innerQueryBuilder->setArgument('id', $id); - return new \Dagger\Span($this->client, $this->queryBuilderChain->chain($innerQueryBuilder)); + return new \Dagger\Status($this->client, $this->queryBuilderChain->chain($innerQueryBuilder)); } /** @@ -750,12 +750,12 @@ public function moduleSource( } /** - * Returns a span that reveals its child spans and hides itself. + * Returns a status that reveals its child statuses and hides itself. */ - public function reveal(): Span + public function reveal(): Status { $innerQueryBuilder = new \Dagger\Client\QueryBuilder('reveal'); - return new \Dagger\Span($this->client, $this->queryBuilderChain->chain($innerQueryBuilder)); + return new \Dagger\Status($this->client, $this->queryBuilderChain->chain($innerQueryBuilder)); } /** @@ -797,16 +797,16 @@ public function sourceMap(string $filename, int $line, int $column): SourceMap } /** - * Create a new OpenTelemetry span. + * Create a new status indicator. */ - public function span(string $name, ?string $key = ''): Span + public function status(string $name, ?string $key = ''): Status { - $innerQueryBuilder = new \Dagger\Client\QueryBuilder('span'); + $innerQueryBuilder = new \Dagger\Client\QueryBuilder('status'); $innerQueryBuilder->setArgument('name', $name); if (null !== $key) { $innerQueryBuilder->setArgument('key', $key); } - return new \Dagger\Span($this->client, $this->queryBuilderChain->chain($innerQueryBuilder)); + return new \Dagger\Status($this->client, $this->queryBuilderChain->chain($innerQueryBuilder)); } /** diff --git a/sdk/php/generated/Span.php b/sdk/php/generated/Status.php similarity index 52% rename from sdk/php/generated/Span.php rename to sdk/php/generated/Status.php index 6d6e9f21c24..f339239b284 100644 --- a/sdk/php/generated/Span.php +++ b/sdk/php/generated/Status.php @@ -9,12 +9,12 @@ namespace Dagger; /** - * An OpenTelemetry span. + * A status indicator to show to the user. */ -class Span extends Client\AbstractObject implements Client\IdAble +class Status extends Client\AbstractObject implements Client\IdAble { /** - * End the OpenTelemetry span, with an optional error. + * Mark the status as complete, with an optional error. */ public function end(ErrorId|Error|null $error = null): void { @@ -26,16 +26,16 @@ public function end(ErrorId|Error|null $error = null): void } /** - * A unique identifier for this Span. + * A unique identifier for this Status. */ - public function id(): SpanId + public function id(): StatusId { $leafQueryBuilder = new \Dagger\Client\QueryBuilder('id'); - return new \Dagger\SpanId((string)$this->queryLeaf($leafQueryBuilder, 'id')); + return new \Dagger\StatusId((string)$this->queryLeaf($leafQueryBuilder, 'id')); } /** - * Returns the internal ID of the span. + * Returns the internal ID of the status. */ public function internalId(): string { @@ -44,7 +44,7 @@ public function internalId(): string } /** - * The name of the span. + * The display name of the status. */ public function name(): string { @@ -53,45 +53,45 @@ public function name(): string } /** - * Start a new instance of the span. + * Start a new instance of the status. */ - public function start(): SpanId + public function start(): StatusId { $leafQueryBuilder = new \Dagger\Client\QueryBuilder('start'); - return new \Dagger\SpanId((string)$this->queryLeaf($leafQueryBuilder, 'start')); + return new \Dagger\StatusId((string)$this->queryLeaf($leafQueryBuilder, 'start')); } - public function withActor(string $actor): Span + public function withActor(string $actor): Status { $innerQueryBuilder = new \Dagger\Client\QueryBuilder('withActor'); $innerQueryBuilder->setArgument('actor', $actor); - return new \Dagger\Span($this->client, $this->queryBuilderChain->chain($innerQueryBuilder)); + return new \Dagger\Status($this->client, $this->queryBuilderChain->chain($innerQueryBuilder)); } /** - * Returns a new span with the internal attribute set to true. + * Returns a new status with the internal attribute set to true. */ - public function withInternal(): Span + public function withInternal(): Status { $innerQueryBuilder = new \Dagger\Client\QueryBuilder('withInternal'); - return new \Dagger\Span($this->client, $this->queryBuilderChain->chain($innerQueryBuilder)); + return new \Dagger\Status($this->client, $this->queryBuilderChain->chain($innerQueryBuilder)); } /** - * Returns a new span with the passthrough attribute set to true. + * Returns a new status with the passthrough attribute set to true. */ - public function withPassthrough(): Span + public function withPassthrough(): Status { $innerQueryBuilder = new \Dagger\Client\QueryBuilder('withPassthrough'); - return new \Dagger\Span($this->client, $this->queryBuilderChain->chain($innerQueryBuilder)); + return new \Dagger\Status($this->client, $this->queryBuilderChain->chain($innerQueryBuilder)); } /** - * Returns a new span with the reveal attribute set to true. + * Returns a new status with the reveal attribute set to true. */ - public function withReveal(): Span + public function withReveal(): Status { $innerQueryBuilder = new \Dagger\Client\QueryBuilder('withReveal'); - return new \Dagger\Span($this->client, $this->queryBuilderChain->chain($innerQueryBuilder)); + return new \Dagger\Status($this->client, $this->queryBuilderChain->chain($innerQueryBuilder)); } } diff --git a/sdk/php/generated/SpanId.php b/sdk/php/generated/StatusId.php similarity index 50% rename from sdk/php/generated/SpanId.php rename to sdk/php/generated/StatusId.php index 4440c3fc383..117ea819eee 100644 --- a/sdk/php/generated/SpanId.php +++ b/sdk/php/generated/StatusId.php @@ -9,8 +9,8 @@ namespace Dagger; /** - * The `SpanID` scalar type represents an identifier for an object of type Span. + * The `StatusID` scalar type represents an identifier for an object of type Status. */ -readonly class SpanId extends Client\AbstractId +readonly class StatusId extends Client\AbstractId { } diff --git a/sdk/python/codegen/src/codegen/generator.py b/sdk/python/codegen/src/codegen/generator.py index cb4771f3736..a84ffc518d0 100644 --- a/sdk/python/codegen/src/codegen/generator.py +++ b/sdk/python/codegen/src/codegen/generator.py @@ -829,7 +829,7 @@ def render_body(self, t: GraphQLObjectType) -> Iterator[str]: self_name = self.type_name(t) - if self_name == "Span": + if self_name == "Status": yield textwrap.dedent( f""" def __init__(self, *args, **kwargs): diff --git a/sdk/python/src/dagger/client/gen.py b/sdk/python/src/dagger/client/gen.py index 347f666db7a..d1e4a411e09 100644 --- a/sdk/python/src/dagger/client/gen.py +++ b/sdk/python/src/dagger/client/gen.py @@ -239,9 +239,9 @@ class SourceMapID(Scalar): object of type SourceMap.""" -class SpanID(Scalar): - """The `SpanID` scalar type represents an identifier for an object of - type Span.""" +class StatusID(Scalar): + """The `StatusID` scalar type represents an identifier for an object + of type Status.""" class TerminalID(Scalar): @@ -8951,13 +8951,13 @@ def load_source_map_from_id(self, id: SourceMapID) -> "SourceMap": _ctx = self._select("loadSourceMapFromID", _args) return SourceMap(_ctx) - def load_span_from_id(self, id: SpanID) -> "Span": - """Load a Span from its ID.""" + def load_status_from_id(self, id: StatusID) -> "Status": + """Load a Status from its ID.""" _args = [ Arg("id", id), ] - _ctx = self._select("loadSpanFromID", _args) - return Span(_ctx) + _ctx = self._select("loadStatusFromID", _args) + return Status(_ctx) def load_terminal_from_id(self, id: TerminalID) -> "Terminal": """Load a Terminal from its ID.""" @@ -9019,11 +9019,11 @@ def module_source( _ctx = self._select("moduleSource", _args) return ModuleSource(_ctx) - def reveal(self) -> "Span": - """Returns a span that reveals its child spans and hides itself.""" + def reveal(self) -> "Status": + """Returns a status that reveals its child statuses and hides itself.""" _args: list[Arg] = [] _ctx = self._select("reveal", _args) - return Span(_ctx) + return Status(_ctx) def secret( self, @@ -9100,21 +9100,21 @@ def source_map( _ctx = self._select("sourceMap", _args) return SourceMap(_ctx) - def span(self, name: str, *, key: str | None = "") -> "Span": - """Create a new OpenTelemetry span. + def status(self, name: str, *, key: str | None = "") -> "Status": + """Create a new status indicator. Parameters ---------- name: - Name of the span. + A display name for the status. key: """ _args = [ Arg("name", name), Arg("key", key, ""), ] - _ctx = self._select("span", _args) - return Span(_ctx) + _ctx = self._select("status", _args) + return Status(_ctx) def type_def(self) -> "TypeDef": """Create a new TypeDef.""" @@ -9718,11 +9718,11 @@ async def module(self) -> str: @typecheck -class Span(Type): - """An OpenTelemetry span.""" +class Status(Type): + """A status indicator to show to the user.""" async def end(self, *, error: Error | None = None) -> Void | None: - """End the OpenTelemetry span, with an optional error. + """Mark the status as complete, with an optional error. Returns ------- @@ -9743,8 +9743,8 @@ async def end(self, *, error: Error | None = None) -> Void | None: _ctx = self._select("end", _args) await _ctx.execute() - async def id(self) -> SpanID: - """A unique identifier for this Span. + async def id(self) -> StatusID: + """A unique identifier for this Status. Note ---- @@ -9752,9 +9752,9 @@ async def id(self) -> SpanID: Returns ------- - SpanID - The `SpanID` scalar type represents an identifier for an object of - type Span. + StatusID + The `StatusID` scalar type represents an identifier for an object + of type Status. Raises ------ @@ -9765,10 +9765,10 @@ async def id(self) -> SpanID: """ _args: list[Arg] = [] _ctx = self._select("id", _args) - return await _ctx.execute(SpanID) + return await _ctx.execute(StatusID) async def internal_id(self) -> str: - """Returns the internal ID of the span. + """Returns the internal ID of the status. Returns ------- @@ -9789,7 +9789,7 @@ async def internal_id(self) -> str: return await _ctx.execute(str) async def name(self) -> str: - """The name of the span. + """The display name of the status. Returns ------- @@ -9810,7 +9810,7 @@ async def name(self) -> str: return await _ctx.execute(str) async def start(self) -> Self: - """Start a new instance of the span. + """Start a new instance of the status. Raises ------ @@ -9827,32 +9827,32 @@ def with_actor(self, actor: str) -> Self: Arg("actor", actor), ] _ctx = self._select("withActor", _args) - return Span(_ctx) + return Status(_ctx) def with_internal(self) -> Self: - """Returns a new span with the internal attribute set to true.""" + """Returns a new status with the internal attribute set to true.""" _args: list[Arg] = [] _ctx = self._select("withInternal", _args) - return Span(_ctx) + return Status(_ctx) def with_passthrough(self) -> Self: - """Returns a new span with the passthrough attribute set to true.""" + """Returns a new status with the passthrough attribute set to true.""" _args: list[Arg] = [] _ctx = self._select("withPassthrough", _args) - return Span(_ctx) + return Status(_ctx) def with_reveal(self) -> Self: - """Returns a new span with the reveal attribute set to true.""" + """Returns a new status with the reveal attribute set to true.""" _args: list[Arg] = [] _ctx = self._select("withReveal", _args) - return Span(_ctx) + return Status(_ctx) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.token = None self.started = None - async def __aenter__(self) -> "Span": + async def __aenter__(self) -> "Status": # Fetch the actual span ID created by the engine started = await self.start() span_id_hex = await started.internal_id() @@ -9899,8 +9899,8 @@ async def __aexit__( opentelemetry.context.detach(self.token) return void - def with_(self, cb: Callable[["Span"], "Span"]) -> "Span": - """Call the provided callable with current Span. + def with_(self, cb: Callable[["Status"], "Status"]) -> "Status": + """Call the provided callable with current Status. This is useful for reusability and readability by not breaking the calling chain. """ @@ -10402,8 +10402,8 @@ def with_(self, cb: Callable[["TypeDef"], "TypeDef"]) -> "TypeDef": "SocketID", "SourceMap", "SourceMapID", - "Span", - "SpanID", + "Status", + "StatusID", "Terminal", "TerminalID", "TypeDef", diff --git a/sdk/rust/crates/dagger-sdk/src/gen.rs b/sdk/rust/crates/dagger-sdk/src/gen.rs index 8c72f9103d1..a2561692b9d 100644 --- a/sdk/rust/crates/dagger-sdk/src/gen.rs +++ b/sdk/rust/crates/dagger-sdk/src/gen.rs @@ -1517,34 +1517,34 @@ impl SourceMapId { } } #[derive(Serialize, Deserialize, PartialEq, Debug, Clone)] -pub struct SpanId(pub String); -impl From<&str> for SpanId { +pub struct StatusId(pub String); +impl From<&str> for StatusId { fn from(value: &str) -> Self { Self(value.to_string()) } } -impl From for SpanId { +impl From for StatusId { fn from(value: String) -> Self { Self(value) } } -impl IntoID for Span { +impl IntoID for Status { fn into_id( self, - ) -> std::pin::Pin> + Send>> + ) -> std::pin::Pin> + Send>> { Box::pin(async move { self.id().await }) } } -impl IntoID for SpanId { +impl IntoID for StatusId { fn into_id( self, - ) -> std::pin::Pin> + Send>> + ) -> std::pin::Pin> + Send>> { - Box::pin(async move { Ok::(self) }) + Box::pin(async move { Ok::(self) }) } } -impl SpanId { +impl StatusId { fn quote(&self) -> String { format!("\"{}\"", self.0.clone()) } @@ -8450,7 +8450,7 @@ pub struct QuerySecretOpts<'a> { pub cache_key: Option<&'a str>, } #[derive(Builder, Debug, PartialEq)] -pub struct QuerySpanOpts<'a> { +pub struct QueryStatusOpts<'a> { #[builder(setter(into, strip_option), default)] pub key: Option<&'a str>, } @@ -9538,9 +9538,9 @@ impl Query { graphql_client: self.graphql_client.clone(), } } - /// Load a Span from its ID. - pub fn load_span_from_id(&self, id: impl IntoID) -> Span { - let mut query = self.selection.select("loadSpanFromID"); + /// Load a Status from its ID. + pub fn load_status_from_id(&self, id: impl IntoID) -> Status { + let mut query = self.selection.select("loadStatusFromID"); query = query.arg_lazy( "id", Box::new(move || { @@ -9548,7 +9548,7 @@ impl Query { Box::pin(async move { id.into_id().await.unwrap().quote() }) }), ); - Span { + Status { proc: self.proc.clone(), selection: query, graphql_client: self.graphql_client.clone(), @@ -9641,10 +9641,10 @@ impl Query { graphql_client: self.graphql_client.clone(), } } - /// Returns a span that reveals its child spans and hides itself. - pub fn reveal(&self) -> Span { + /// Returns a status that reveals its child statuses and hides itself. + pub fn reveal(&self) -> Status { let query = self.selection.select("reveal"); - Span { + Status { proc: self.proc.clone(), selection: query, graphql_client: self.graphql_client.clone(), @@ -9718,34 +9718,34 @@ impl Query { graphql_client: self.graphql_client.clone(), } } - /// Create a new OpenTelemetry span. + /// Create a new status indicator. /// /// # Arguments /// - /// * `name` - Name of the span. + /// * `name` - A display name for the status. /// * `opt` - optional argument, see inner type for documentation, use _opts to use - pub fn span(&self, name: impl Into) -> Span { - let mut query = self.selection.select("span"); + pub fn status(&self, name: impl Into) -> Status { + let mut query = self.selection.select("status"); query = query.arg("name", name.into()); - Span { + Status { proc: self.proc.clone(), selection: query, graphql_client: self.graphql_client.clone(), } } - /// Create a new OpenTelemetry span. + /// Create a new status indicator. /// /// # Arguments /// - /// * `name` - Name of the span. + /// * `name` - A display name for the status. /// * `opt` - optional argument, see inner type for documentation, use _opts to use - pub fn span_opts<'a>(&self, name: impl Into, opts: QuerySpanOpts<'a>) -> Span { - let mut query = self.selection.select("span"); + pub fn status_opts<'a>(&self, name: impl Into, opts: QueryStatusOpts<'a>) -> Status { + let mut query = self.selection.select("status"); query = query.arg("name", name.into()); if let Some(key) = opts.key { query = query.arg("key", key); } - Span { + Status { proc: self.proc.clone(), selection: query, graphql_client: self.graphql_client.clone(), @@ -10035,18 +10035,18 @@ impl SourceMap { } } #[derive(Clone)] -pub struct Span { +pub struct Status { pub proc: Option>, pub selection: Selection, pub graphql_client: DynGraphQLClient, } #[derive(Builder, Debug, PartialEq)] -pub struct SpanEndOpts { +pub struct StatusEndOpts { #[builder(setter(into, strip_option), default)] pub error: Option, } -impl Span { - /// End the OpenTelemetry span, with an optional error. +impl Status { + /// Mark the status as complete, with an optional error. /// /// # Arguments /// @@ -10055,69 +10055,69 @@ impl Span { let query = self.selection.select("end"); query.execute(self.graphql_client.clone()).await } - /// End the OpenTelemetry span, with an optional error. + /// Mark the status as complete, with an optional error. /// /// # Arguments /// /// * `opt` - optional argument, see inner type for documentation, use _opts to use - pub async fn end_opts(&self, opts: SpanEndOpts) -> Result { + pub async fn end_opts(&self, opts: StatusEndOpts) -> Result { let mut query = self.selection.select("end"); if let Some(error) = opts.error { query = query.arg("error", error); } query.execute(self.graphql_client.clone()).await } - /// A unique identifier for this Span. - pub async fn id(&self) -> Result { + /// A unique identifier for this Status. + pub async fn id(&self) -> Result { let query = self.selection.select("id"); query.execute(self.graphql_client.clone()).await } - /// Returns the internal ID of the span. + /// Returns the internal ID of the status. pub async fn internal_id(&self) -> Result { let query = self.selection.select("internalId"); query.execute(self.graphql_client.clone()).await } - /// The name of the span. + /// The display name of the status. pub async fn name(&self) -> Result { let query = self.selection.select("name"); query.execute(self.graphql_client.clone()).await } - /// Start a new instance of the span. - pub async fn start(&self) -> Result { + /// Start a new instance of the status. + pub async fn start(&self) -> Result { let query = self.selection.select("start"); query.execute(self.graphql_client.clone()).await } - pub fn with_actor(&self, actor: impl Into) -> Span { + pub fn with_actor(&self, actor: impl Into) -> Status { let mut query = self.selection.select("withActor"); query = query.arg("actor", actor.into()); - Span { + Status { proc: self.proc.clone(), selection: query, graphql_client: self.graphql_client.clone(), } } - /// Returns a new span with the internal attribute set to true. - pub fn with_internal(&self) -> Span { + /// Returns a new status with the internal attribute set to true. + pub fn with_internal(&self) -> Status { let query = self.selection.select("withInternal"); - Span { + Status { proc: self.proc.clone(), selection: query, graphql_client: self.graphql_client.clone(), } } - /// Returns a new span with the passthrough attribute set to true. - pub fn with_passthrough(&self) -> Span { + /// Returns a new status with the passthrough attribute set to true. + pub fn with_passthrough(&self) -> Status { let query = self.selection.select("withPassthrough"); - Span { + Status { proc: self.proc.clone(), selection: query, graphql_client: self.graphql_client.clone(), } } - /// Returns a new span with the reveal attribute set to true. - pub fn with_reveal(&self) -> Span { + /// Returns a new status with the reveal attribute set to true. + pub fn with_reveal(&self) -> Status { let query = self.selection.select("withReveal"); - Span { + Status { proc: self.proc.clone(), selection: query, graphql_client: self.graphql_client.clone(), diff --git a/sdk/typescript/src/api/client.gen.ts b/sdk/typescript/src/api/client.gen.ts index f4ecfc62f60..dd28618fc18 100644 --- a/sdk/typescript/src/api/client.gen.ts +++ b/sdk/typescript/src/api/client.gen.ts @@ -1319,7 +1319,7 @@ export type ClientSecretOpts = { cacheKey?: string } -export type ClientSpanOpts = { +export type ClientStatusOpts = { key?: string } @@ -1405,14 +1405,14 @@ export type SocketID = string & { __SocketID: never } */ export type SourceMapID = string & { __SourceMapID: never } -export type SpanEndOpts = { +export type StatusEndOpts = { error?: Error } /** - * The `SpanID` scalar type represents an identifier for an object of type Span. + * The `StatusID` scalar type represents an identifier for an object of type Status. */ -export type SpanID = string & { __SpanID: never } +export type StatusID = string & { __StatusID: never } /** * The `TerminalID` scalar type represents an identifier for an object of type Terminal. @@ -8381,11 +8381,11 @@ export class Client extends BaseClient { } /** - * Load a Span from its ID. + * Load a Status from its ID. */ - loadSpanFromID = (id: SpanID): Span => { - const ctx = this._ctx.select("loadSpanFromID", { id }) - return new Span(ctx) + loadStatusFromID = (id: StatusID): Status => { + const ctx = this._ctx.select("loadStatusFromID", { id }) + return new Status(ctx) } /** @@ -8437,11 +8437,11 @@ export class Client extends BaseClient { } /** - * Returns a span that reveals its child spans and hides itself. + * Returns a status that reveals its child statuses and hides itself. */ - reveal = (): Span => { + reveal = (): Status => { const ctx = this._ctx.select("reveal") - return new Span(ctx) + return new Status(ctx) } /** @@ -8482,12 +8482,12 @@ export class Client extends BaseClient { } /** - * Create a new OpenTelemetry span. - * @param name Name of the span. + * Create a new status indicator. + * @param name A display name for the status. */ - span = (name: string, opts?: ClientSpanOpts): Span => { - const ctx = this._ctx.select("span", { name, ...opts }) - return new Span(ctx) + status = (name: string, opts?: ClientStatusOpts): Status => { + const ctx = this._ctx.select("status", { name, ...opts }) + return new Status(ctx) } /** @@ -9032,25 +9032,25 @@ export class SourceMap extends BaseClient { } /** - * An OpenTelemetry span. + * A status indicator to show to the user. */ -export class Span extends BaseClient { - private readonly _id?: SpanID = undefined +export class Status extends BaseClient { + private readonly _id?: StatusID = undefined private readonly _end?: Void = undefined private readonly _internalId?: string = undefined private readonly _name?: string = undefined - private readonly _start?: SpanID = undefined + private readonly _start?: StatusID = undefined /** * Constructor is used for internal usage only, do not create object from it. */ constructor( ctx?: Context, - _id?: SpanID, + _id?: StatusID, _end?: Void, _internalId?: string, _name?: string, - _start?: SpanID, + _start?: StatusID, ) { super(ctx) @@ -9062,24 +9062,24 @@ export class Span extends BaseClient { } /** - * A unique identifier for this Span. + * A unique identifier for this Status. */ - id = async (): Promise => { + id = async (): Promise => { if (this._id) { return this._id } const ctx = this._ctx.select("id") - const response: Awaited = await ctx.execute() + const response: Awaited = await ctx.execute() return response } /** - * End the OpenTelemetry span, with an optional error. + * Mark the status as complete, with an optional error. */ - end = async (opts?: SpanEndOpts): Promise => { + end = async (opts?: StatusEndOpts): Promise => { if (this._end) { return } @@ -9090,7 +9090,7 @@ export class Span extends BaseClient { } /** - * Returns the internal ID of the span. + * Returns the internal ID of the status. */ internalId = async (): Promise => { if (this._internalId) { @@ -9105,7 +9105,7 @@ export class Span extends BaseClient { } /** - * The name of the span. + * The display name of the status. */ name = async (): Promise => { if (this._name) { @@ -9120,45 +9120,45 @@ export class Span extends BaseClient { } /** - * Start a new instance of the span. + * Start a new instance of the status. */ - start = async (): Promise => { + start = async (): Promise => { const ctx = this._ctx.select("start") - const response: Awaited = await ctx.execute() + const response: Awaited = await ctx.execute() - return new Client(ctx.copy()).loadSpanFromID(response) + return new Client(ctx.copy()).loadStatusFromID(response) } - withActor = (actor: string): Span => { + withActor = (actor: string): Status => { const ctx = this._ctx.select("withActor", { actor }) - return new Span(ctx) + return new Status(ctx) } /** - * Returns a new span with the internal attribute set to true. + * Returns a new status with the internal attribute set to true. */ - withInternal = (): Span => { + withInternal = (): Status => { const ctx = this._ctx.select("withInternal") - return new Span(ctx) + return new Status(ctx) } /** - * Returns a new span with the passthrough attribute set to true. + * Returns a new status with the passthrough attribute set to true. */ - withPassthrough = (): Span => { + withPassthrough = (): Status => { const ctx = this._ctx.select("withPassthrough") - return new Span(ctx) + return new Status(ctx) } /** - * Returns a new span with the reveal attribute set to true. + * Returns a new status with the reveal attribute set to true. */ - withReveal = (): Span => { + withReveal = (): Status => { const ctx = this._ctx.select("withReveal") - return new Span(ctx) + return new Status(ctx) } - public async run(fn: (span: Span) => Promise) { + public async run(fn: (span: Status) => Promise) { const started = await this.start() const spanIdHex = await started.internalId() @@ -9178,11 +9178,11 @@ export class Span extends BaseClient { } /** - * Call the provided function with current Span. + * Call the provided function with current Status. * * This is useful for reusability and readability by not breaking the calling chain. */ - with = (arg: (param: Span) => Span) => { + with = (arg: (param: Status) => Status) => { return arg(this) } } From e879bdd2e906686edd5731cc441ef323404b9c5a Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Thu, 26 Jun 2025 23:43:58 -0400 Subject: [PATCH 30/36] revise API * better docs * withActor -> withActorEmoji * add withReceivedMessage (a bit awkward, but when in Rome...) * remove withInternal; we don't really consistently support it yet, unsure if even needed update viztest along the way Signed-off-by: Alex Suraci --- core/schema/query.go | 24 +++++++------ core/status.go | 20 +++++------ dagql/idtui/viztest/dagger.json | 2 +- dagql/idtui/viztest/go.mod | 39 ++++++++++---------- dagql/idtui/viztest/go.sum | 64 +++++++++++++++++---------------- dagql/idtui/viztest/main.go | 47 ++++++++++++------------ 6 files changed, 101 insertions(+), 95 deletions(-) diff --git a/core/schema/query.go b/core/schema/query.go index 1de0f07d97b..cc0efcdbc18 100644 --- a/core/schema/query.go +++ b/core/schema/query.go @@ -82,16 +82,18 @@ func (s *querySchema) Install() { }.Install(s.srv) dagql.Fields[*core.Status]{ - dagql.Func("withActor", s.statusWithActor), - - dagql.Func("withInternal", s.statusWithInternal). - Doc(`Returns a new status with the internal attribute set to true.`), - dagql.Func("withPassthrough", s.statusWithPassthrough). - Doc(`Returns a new status with the passthrough attribute set to true.`), + Doc(`Hide the status itself, and reveal its children.`), dagql.Func("withReveal", s.statusWithReveal). - Doc(`Returns a new status with the reveal attribute set to true.`), + Doc(`Ensure the status is visible without having to expand its parents.`), + + dagql.Func("withActorEmoji", s.statusWithActorEmoji). + Doc(`Set an emoji representing the actor of the status.`), + + dagql.Func("withReceivedMessage", s.statusWithReceivedMessage). + Doc(`Indicates that the status represents a received message.`, + `The message body must be sent as logs, so that it can be streamed. The name of the status is ignored.`), dagql.Func("internalId", s.statusInternalID). Doc(`Returns the internal ID of the status.`), @@ -251,14 +253,14 @@ func (s *querySchema) statusInternalID(ctx context.Context, parent *core.Status, return parent.Span.SpanContext().SpanID().String(), nil } -func (s *querySchema) statusWithActor(ctx context.Context, parent *core.Status, args struct { +func (s *querySchema) statusWithActorEmoji(ctx context.Context, parent *core.Status, args struct { Actor string }) (*core.Status, error) { - return parent.WithActor(args.Actor), nil + return parent.WithActorEmoji(args.Actor), nil } -func (s *querySchema) statusWithInternal(ctx context.Context, parent *core.Status, args struct{}) (*core.Status, error) { - return parent.WithInternal(), nil +func (s *querySchema) statusWithReceivedMessage(ctx context.Context, parent *core.Status, args struct{}) (*core.Status, error) { + return parent.WithMessage("received"), nil } func (s *querySchema) statusWithReveal(ctx context.Context, parent *core.Status, args struct{}) (*core.Status, error) { diff --git a/core/status.go b/core/status.go index beda2114873..4d98d33aea2 100644 --- a/core/status.go +++ b/core/status.go @@ -12,8 +12,8 @@ import ( type Status struct { Name string `field:"true" doc:"The display name of the status."` - Actor string - Internal bool + ActorEmoji string + Message string Reveal bool Passthrough bool @@ -39,15 +39,15 @@ func (s Status) Clone() *Status { return cp } -func (s *Status) WithActor(actor string) *Status { +func (s *Status) WithActorEmoji(actor string) *Status { cp := s.Clone() - cp.Actor = actor + cp.ActorEmoji = actor return cp } -func (s *Status) WithInternal() *Status { +func (s *Status) WithMessage(message string) *Status { cp := s.Clone() - cp.Internal = true + cp.Message = message return cp } @@ -76,11 +76,11 @@ func (s *Status) InternalID() string { func (s *Status) Opts() []trace.SpanStartOption { var opts []trace.SpanStartOption - if s.Actor != "" { - opts = append(opts, trace.WithAttributes(attribute.String("dagger.io/ui.actor", s.Actor))) + if s.ActorEmoji != "" { + opts = append(opts, trace.WithAttributes(attribute.String(telemetry.UIActorEmojiAttr, s.ActorEmoji))) } - if s.Internal { - opts = append(opts, telemetry.Internal()) + if s.Message != "" { + opts = append(opts, trace.WithAttributes(attribute.String(telemetry.UIMessageAttr, s.Message))) } if s.Reveal { opts = append(opts, trace.WithAttributes(attribute.Bool(telemetry.UIRevealAttr, true))) diff --git a/dagql/idtui/viztest/dagger.json b/dagql/idtui/viztest/dagger.json index bda576b59af..3591143a29c 100644 --- a/dagql/idtui/viztest/dagger.json +++ b/dagql/idtui/viztest/dagger.json @@ -1,6 +1,6 @@ { "name": "viztest", - "engineVersion": "v0.18.10", + "engineVersion": "v0.18.12-250626223947-3332f01a3cf8", "sdk": { "source": "go" }, diff --git a/dagql/idtui/viztest/go.mod b/dagql/idtui/viztest/go.mod index 9d45d0fbdeb..fb4c002e862 100644 --- a/dagql/idtui/viztest/go.mod +++ b/dagql/idtui/viztest/go.mod @@ -5,24 +5,25 @@ go 1.23.0 toolchain go1.23.6 require ( - github.com/99designs/gqlgen v0.17.74 + github.com/99designs/gqlgen v0.17.75 github.com/Khan/genqlient v0.8.1 - github.com/vektah/gqlparser/v2 v2.5.27 - go.opentelemetry.io/otel v1.35.0 - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0 - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 - go.opentelemetry.io/otel/log v0.8.0 - go.opentelemetry.io/otel/sdk/log v0.8.0 - go.opentelemetry.io/otel/trace v1.35.0 + github.com/vektah/gqlparser/v2 v2.5.28 + go.opentelemetry.io/otel v1.36.0 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.12.2 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.12.2 + go.opentelemetry.io/otel/log v0.12.2 + go.opentelemetry.io/otel/sdk/log v0.12.2 + go.opentelemetry.io/otel/trace v1.36.0 golang.org/x/sync v0.15.0 ) require ( github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/cenkalti/backoff/v5 v5.0.2 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 // indirect github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect github.com/sosodev/duration v1.3.1 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect @@ -31,23 +32,23 @@ require ( go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 - go.opentelemetry.io/otel/metric v1.35.0 - go.opentelemetry.io/otel/sdk v1.35.0 - go.opentelemetry.io/otel/sdk/metric v1.35.0 - go.opentelemetry.io/proto/otlp v1.3.1 + go.opentelemetry.io/otel/metric v1.36.0 + go.opentelemetry.io/otel/sdk v1.36.0 + go.opentelemetry.io/otel/sdk/metric v1.36.0 + go.opentelemetry.io/proto/otlp v1.6.0 golang.org/x/net v0.41.0 // indirect golang.org/x/sys v0.33.0 // indirect golang.org/x/text v0.26.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237 // indirect google.golang.org/grpc v1.73.0 google.golang.org/protobuf v1.36.6 // indirect ) -replace go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc => go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0 +replace go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc => go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.12.2 -replace go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp => go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 +replace go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp => go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.12.2 -replace go.opentelemetry.io/otel/log => go.opentelemetry.io/otel/log v0.8.0 +replace go.opentelemetry.io/otel/log => go.opentelemetry.io/otel/log v0.12.2 -replace go.opentelemetry.io/otel/sdk/log => go.opentelemetry.io/otel/sdk/log v0.8.0 +replace go.opentelemetry.io/otel/sdk/log => go.opentelemetry.io/otel/sdk/log v0.12.2 diff --git a/dagql/idtui/viztest/go.sum b/dagql/idtui/viztest/go.sum index 9da9554410a..91a9903f422 100644 --- a/dagql/idtui/viztest/go.sum +++ b/dagql/idtui/viztest/go.sum @@ -1,11 +1,13 @@ -github.com/99designs/gqlgen v0.17.74 h1:1FuVtkXxOc87xpKio3f6sohREmec+Jvy86PcYOuwgWo= -github.com/99designs/gqlgen v0.17.74/go.mod h1:a+iR6mfRLNRp++kDpooFHiPWYiWX3Yu1BIilQRHgh10= +github.com/99designs/gqlgen v0.17.75 h1:GwHJsptXWLHeY7JO8b7YueUI4w9Pom6wJTICosDtQuI= +github.com/99designs/gqlgen v0.17.75/go.mod h1:p7gbTpdnHyl70hmSpM8XG8GiKwmCv+T5zkdY8U8bLog= github.com/Khan/genqlient v0.8.1 h1:wtOCc8N9rNynRLXN3k3CnfzheCUNKBcvXmVv5zt6WCs= github.com/Khan/genqlient v0.8.1/go.mod h1:R2G6DzjBvCbhjsEajfRjbWdVglSH/73kSivC9TLWVjU= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v5 v5.0.2 h1:rIfFVxEf1QsI7E1ZHfp/B4DF/6QBAUhmgkxc0H7Zss8= +github.com/cenkalti/backoff/v5 v5.0.2/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -20,8 +22,8 @@ github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 h1:5ZPtiqj0JL5oKWmcsq4VMaAW5ukBEgSGXEN89zeH1Jo= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -35,16 +37,16 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/vektah/gqlparser/v2 v2.5.27 h1:RHPD3JOplpk5mP5JGX8RKZkt2/Vwj/PZv0HxTdwFp0s= -github.com/vektah/gqlparser/v2 v2.5.27/go.mod h1:D1/VCZtV3LPnQrcPBeR/q5jkSQIPti0uYCP/RI0gIeo= +github.com/vektah/gqlparser/v2 v2.5.28 h1:bIulcl3LF69ba6EiZVGD88y4MkM+Jxrf3P2MX8xLRkY= +github.com/vektah/gqlparser/v2 v2.5.28/go.mod h1:D1/VCZtV3LPnQrcPBeR/q5jkSQIPti0uYCP/RI0gIeo= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= -go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0 h1:WzNab7hOOLzdDF/EoWCt4glhrbMPVMOO5JYTmpz36Ls= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0/go.mod h1:hKvJwTzJdp90Vh7p6q/9PAOd55dI6WA6sWj62a/JvSs= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 h1:S+LdBGiQXtJdowoJoQPEtI52syEP/JYBUpjO49EQhV8= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0/go.mod h1:5KXybFvPGds3QinJWQT7pmXf+TN5YIa7CNYObWRkj50= +go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg= +go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.12.2 h1:06ZeJRe5BnYXceSM9Vya83XXVaNGe3H1QqsvqRANQq8= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.12.2/go.mod h1:DvPtKE63knkDVP88qpatBj81JxN+w1bqfVbsbCbj1WY= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.12.2 h1:tPLwQlXbJ8NSOfZc4OkgU5h2A38M4c9kfHSVc4PFQGs= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.12.2/go.mod h1:QTnxBwT/1rBIgAG1goq6xMydfYOBKU6KTiYF4fp5zL8= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 h1:j7ZSD+5yn+lo3sGV69nW04rRR0jhYnBwjuX3r0HvnK0= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0/go.mod h1:WXbYJTUaZXAbYd8lbgGuvih0yuCfOFC5RJoYnoLcGz8= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 h1:t/Qur3vKSkUCcDVaSumWF2PKHt85pc7fRvFuoVT8qFU= @@ -55,20 +57,22 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 h1:9kV11 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0/go.mod h1:JyA0FHXe22E1NeNiHmVp7kFHglnexDQ7uRWDiiJ1hKQ= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 h1:cMyu9O88joYEaI47CnQkxO1XZdpoTF9fEnW2duIddhw= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0/go.mod h1:6Am3rn7P9TVVeXYG+wtcGE7IE1tsQ+bP3AuWcKt/gOI= -go.opentelemetry.io/otel/log v0.8.0 h1:egZ8vV5atrUWUbnSsHn6vB8R21G2wrKqNiDt3iWertk= -go.opentelemetry.io/otel/log v0.8.0/go.mod h1:M9qvDdUTRCopJcGRKg57+JSQ9LgLBrwwfC32epk5NX8= -go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M= -go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE= -go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY= -go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg= -go.opentelemetry.io/otel/sdk/log v0.8.0 h1:zg7GUYXqxk1jnGF/dTdLPrK06xJdrXgqgFLnI4Crxvs= -go.opentelemetry.io/otel/sdk/log v0.8.0/go.mod h1:50iXr0UVwQrYS45KbruFrEt4LvAdCaWWgIrsN3ZQggo= -go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o= -go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w= -go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= -go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= -go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= -go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.opentelemetry.io/otel/log v0.12.2 h1:yob9JVHn2ZY24byZeaXpTVoPS6l+UrrxmxmPKohXTwc= +go.opentelemetry.io/otel/log v0.12.2/go.mod h1:ShIItIxSYxufUMt+1H5a2wbckGli3/iCfuEbVZi/98E= +go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE= +go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs= +go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs= +go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY= +go.opentelemetry.io/otel/sdk/log v0.12.2 h1:yNoETvTByVKi7wHvYS6HMcZrN5hFLD7I++1xIZ/k6W0= +go.opentelemetry.io/otel/sdk/log v0.12.2/go.mod h1:DcpdmUXHJgSqN/dh+XMWa7Vf89u9ap0/AAk/XGLnEzY= +go.opentelemetry.io/otel/sdk/log/logtest v0.0.0-20250521073539-a85ae98dcedc h1:uqxdywfHqqCl6LmZzI3pUnXT1RGFYyUgxj0AkWPFxi0= +go.opentelemetry.io/otel/sdk/log/logtest v0.0.0-20250521073539-a85ae98dcedc/go.mod h1:TY/N/FT7dmFrP/r5ym3g0yysP1DefqGpAZr4f82P0dE= +go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis= +go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4= +go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w= +go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA= +go.opentelemetry.io/proto/otlp v1.6.0 h1:jQjP+AQyTf+Fe7OKj/MfkDrmK4MNVtw2NpXsf9fefDI= +go.opentelemetry.io/proto/otlp v1.6.0/go.mod h1:cicgGehlFuNdgZkcALOCh3VE6K/u2tAjzlRhDwmVpZc= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= @@ -79,10 +83,10 @@ golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= -google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463 h1:hE3bRWtU6uceqlh4fhrSnUyjKHMKB9KrTLLG+bc0ddM= -google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463/go.mod h1:U90ffi8eUL9MwPcrJylN5+Mk2v3vuPDptd5yyNUiRR8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463 h1:e0AIkUUhxyBKh6ssZNrAMeqhA7RKUj42346d1y02i2g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237 h1:Kog3KlB4xevJlAcbbbzPfRG0+X9fdoGM+UBRKVz6Wr0= +google.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237/go.mod h1:ezi0AVyMKDWy5xAncvjLWH7UcLBB5n7y2fQ8MzjJcto= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237 h1:cJfm9zPbe1e873mHJzmQ1nwVEeRDU/T1wXDK2kUSU34= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok= google.golang.org/grpc v1.73.0/go.mod h1:50sbHOUqWoCQGI8V2HQLJM0B+LMlIUjNSZmow7EVBQc= google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= diff --git a/dagql/idtui/viztest/main.go b/dagql/idtui/viztest/main.go index f22af2b87ab..9741106c76a 100644 --- a/dagql/idtui/viztest/main.go +++ b/dagql/idtui/viztest/main.go @@ -44,13 +44,13 @@ func (v *Viztest) Encapsulate(ctx context.Context) error { func (*Viztest) FailEncapsulated(ctx context.Context) error { // Scenario 1: UNSET span under ERROR span - should hoist (func() (rerr error) { - ctx, span := Tracer().Start(ctx, "failing outer span") + ctx, span := dag.Status("failing outer span").Context(ctx) defer telemetry.End(span, func() error { return rerr }) (func() { - ctx, span := Tracer().Start(ctx, "unset middle span") + ctx, span := dag.Status("unset middle span").Context(ctx) defer span.End() // UNSET (func() (rerr error) { - ctx, span := Tracer().Start(ctx, "failing inner span") + ctx, span := dag.Status("failing inner span").Context(ctx) defer telemetry.End(span, func() error { return rerr }) stdio := telemetry.SpanStdio(ctx, "") fmt.Fprintln(stdio.Stdout, "this should be hoisted - ancestor failed") @@ -62,13 +62,13 @@ func (*Viztest) FailEncapsulated(ctx context.Context) error { // Scenario 2: UNSET span under OK span - should NOT hoist (func() (rerr error) { - ctx, span := Tracer().Start(ctx, "succeeding outer span") + ctx, span := dag.Status("succeeding outer span").Context(ctx) defer telemetry.End(span, func() error { return rerr }) (func() { - ctx, span := Tracer().Start(ctx, "unset middle span") + ctx, span := dag.Status("unset middle span").Context(ctx) defer span.End() // UNSET (func() (rerr error) { - ctx, span := Tracer().Start(ctx, "failing inner span") + ctx, span := dag.Status("failing inner span").Context(ctx) defer telemetry.End(span, func() error { return rerr }) stdio := telemetry.SpanStdio(ctx, "") fmt.Fprintln(stdio.Stdout, "this should NOT be hoisted - ancestor succeeded") @@ -114,34 +114,33 @@ func (*Viztest) ManyLines(n int) { } func (v *Viztest) CustomSpan(ctx context.Context) (res string, rerr error) { - ctx, span := dag.Span("custom span").Context(ctx) + ctx, span := dag.Status("custom span").Context(ctx) defer span.End(ctx) return v.Echo(ctx, "hello from Go! it is currently "+time.Now().String()) } func (v *Viztest) RevealedSpans(ctx context.Context) (res string, rerr error) { func() { - _, span := Tracer().Start(ctx, "custom span") - span.End() + ctx, status := dag.Status("custom span").Context(ctx) + status.End(ctx) }() func() { - _, span := Tracer().Start(ctx, "revealed span", - trace.WithAttributes(attribute.Bool("dagger.io/ui.reveal", true))) - span.End() + ctx, status := dag.Status("revealed span").WithReveal().Context(ctx) + status.End(ctx) }() func() { - ctx, span := Tracer().Start(ctx, "revealed message", - trace.WithAttributes(attribute.Bool("dagger.io/ui.reveal", true)), - trace.WithAttributes(attribute.String("dagger.io/ui.actor.emoji", "😊")), - trace.WithAttributes(attribute.String("dagger.io/ui.message", "received")), - ) + ctx, span := dag.Status("revealed message"). + WithReveal(). + WithActor("😊"). + WithMessage("received"). + Context(ctx) span.End() stdio := telemetry.SpanStdio(ctx, "doesnt matter", log.String("dagger.io/content.type", "text/markdown")) defer stdio.Close() fmt.Fprintln(stdio.Stdout, "sometimes you gotta be **bold**") }() func() { - _, span := Tracer().Start(ctx, "revealed span") + _, span := dag.Status("revealed span").Context(ctx) span.End() }() return v.Echo(ctx, "hello from Go! it is currently "+time.Now().String()) @@ -163,24 +162,24 @@ func (v *Viztest) NestedSpans(ctx context.Context, // +default=false fail bool, ) (res string, rerr error) { - err := dag.Span("custom span").Run(ctx, func(ctx context.Context) error { + err := dag.Status("custom span").Run(ctx, func(ctx context.Context) error { if _, err := v.Echo(ctx, "outer: "+time.Now().String()); err != nil { return err } - if err := dag.Span("sub span").Run(ctx, func(ctx context.Context) error { + if err := dag.Status("sub span").Run(ctx, func(ctx context.Context) error { _, err := v.Echo(ctx, "sub 1: "+time.Now().String()) return err }); err != nil { return err } - if err := dag.Span("sub span").Run(ctx, func(ctx context.Context) error { + if err := dag.Status("sub span").Run(ctx, func(ctx context.Context) error { _, err := v.Echo(ctx, "sub 2: "+time.Now().String()) return err }); err != nil { return err } - return dag.Span("another sub span").Run(ctx, func(ctx context.Context) error { - return dag.Span("sub span").Run(ctx, func(ctx context.Context) error { + return dag.Status("another sub span").Run(ctx, func(ctx context.Context) error { + return dag.Status("sub span").Run(ctx, func(ctx context.Context) error { if fail { return errors.New("oh no") } else { @@ -203,7 +202,7 @@ func (*Viztest) ManySpans( delayMs int, ) { for i := 1; i <= n; i++ { - ctx, span := dag.Span(fmt.Sprintf("span %d", i)).Context(ctx) + ctx, span := dag.Status(fmt.Sprintf("span %d", i)).Context(ctx) time.Sleep(time.Duration(delayMs) * time.Millisecond) span.End(ctx) } From 2e33cc8e584471ac71d2e12271148e512b46a8fa Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Fri, 27 Jun 2025 00:08:57 -0400 Subject: [PATCH 31/36] regen, update tests for Span => Status Signed-off-by: Alex Suraci --- core/schema/query.go | 8 +- dagql/idtui/golden_test.go | 20 ++-- .../TestGolden/{custom-span => custom-status} | 4 +- .../TestGolden/fail-encapsulated | 10 +- .../{nested-spans => nested-statuses} | 12 +- .../{nested-spans#01 => nested-statuses#01} | 12 +- .../python/{custom-span => custom-status} | 4 +- .../python/{nested-spans => nested-statuses} | 12 +- .../{nested-spans#01 => nested-statuses#01} | 12 +- .../{revealed-spans => revealed-statuses} | 4 +- .../typescript/{custom-span => custom-status} | 4 +- .../{nested-spans => nested-statuses} | 12 +- .../{nested-spans#01 => nested-statuses#01} | 12 +- .../TestGolden/viztest/python/nested-spans | 45 -------- .../TestGolden/viztest/python/nested-spans#01 | 41 ------- .../viztest/typescript/nested-spans | 45 -------- .../viztest/typescript/nested-spans#01 | 48 -------- dagql/idtui/viztest/dagger.json | 2 +- dagql/idtui/viztest/main.go | 85 ++++++-------- .../idtui/viztest/python/src/main/__init__.py | 16 +-- dagql/idtui/viztest/typescript/src/index.ts | 44 ++++---- docs/docs-graphql/schema.graphqls | 57 +++++----- docs/static/api/reference/index.html | 84 +++++++------- docs/static/reference/php/Dagger.html | 8 +- docs/static/reference/php/Dagger/Client.html | 44 ++++---- .../php/Dagger/{Span.html => Status.html} | 106 +++++++++--------- .../php/Dagger/{SpanId.html => StatusId.html} | 12 +- docs/static/reference/php/classes.html | 8 +- docs/static/reference/php/doc-index.html | 64 +++++------ docs/static/reference/php/doctum-search.json | 80 ++++++------- docs/static/reference/php/doctum.js | 2 +- sdk/elixir/lib/dagger/gen/status.ex | 29 +++-- sdk/go/dagger.gen.go | 21 ++-- sdk/php/generated/Status.php | 23 ++-- sdk/python/src/dagger/client/gen.py | 23 ++-- sdk/rust/crates/dagger-sdk/src/gen.rs | 20 ++-- sdk/typescript/src/api/client.gen.ts | 24 ++-- 37 files changed, 451 insertions(+), 606 deletions(-) rename dagql/idtui/testdata/TestTelemetry/TestGolden/{custom-span => custom-status} (94%) rename dagql/idtui/testdata/TestTelemetry/TestGolden/{nested-spans => nested-statuses} (92%) rename dagql/idtui/testdata/TestTelemetry/TestGolden/{nested-spans#01 => nested-statuses#01} (86%) rename dagql/idtui/testdata/TestTelemetry/TestGolden/python/{custom-span => custom-status} (94%) rename dagql/idtui/testdata/TestTelemetry/TestGolden/python/{nested-spans => nested-statuses} (89%) rename dagql/idtui/testdata/TestTelemetry/TestGolden/python/{nested-spans#01 => nested-statuses#01} (85%) rename dagql/idtui/testdata/TestTelemetry/TestGolden/{revealed-spans => revealed-statuses} (91%) rename dagql/idtui/testdata/TestTelemetry/TestGolden/typescript/{custom-span => custom-status} (94%) rename dagql/idtui/testdata/TestTelemetry/TestGolden/typescript/{nested-spans => nested-statuses} (89%) rename dagql/idtui/testdata/TestTelemetry/TestGolden/typescript/{nested-spans#01 => nested-statuses#01} (85%) delete mode 100644 dagql/idtui/testdata/TestTelemetry/TestGolden/viztest/python/nested-spans delete mode 100644 dagql/idtui/testdata/TestTelemetry/TestGolden/viztest/python/nested-spans#01 delete mode 100644 dagql/idtui/testdata/TestTelemetry/TestGolden/viztest/typescript/nested-spans delete mode 100644 dagql/idtui/testdata/TestTelemetry/TestGolden/viztest/typescript/nested-spans#01 rename docs/static/reference/php/Dagger/{Span.html => Status.html} (80%) rename docs/static/reference/php/Dagger/{SpanId.html => StatusId.html} (95%) diff --git a/core/schema/query.go b/core/schema/query.go index cc0efcdbc18..db395f2aa5d 100644 --- a/core/schema/query.go +++ b/core/schema/query.go @@ -6,6 +6,7 @@ import ( "fmt" "io/fs" + "dagger.io/dagger/telemetry" codegenintrospection "github.com/dagger/dagger/cmd/codegen/introspection" "github.com/dagger/dagger/core" "github.com/dagger/dagger/dagql" @@ -242,10 +243,13 @@ func (s *querySchema) statusEnd(ctx context.Context, parent *core.Status, args s if err != nil { parent.Span.SetStatus(codes.Error, fmt.Sprintf("failed to load error: %v", err)) } else { - parent.Span.SetStatus(codes.Error, dagErr.Self.Message) + // use telemetry.End which also provides origin tracking + telemetry.End(parent.Span, func() error { return dagErr.Self }) } + } else { + // use telemetry.End so the status gets set to OK + telemetry.End(parent.Span, func() error { return nil }) } - parent.Span.End() return dagql.Null[core.Void](), nil } diff --git a/dagql/idtui/golden_test.go b/dagql/idtui/golden_test.go index cbfc07a9744..70a3dcd3044 100644 --- a/dagql/idtui/golden_test.go +++ b/dagql/idtui/golden_test.go @@ -78,7 +78,7 @@ func (s TelemetrySuite) TestGolden(ctx context.Context, t *testctx.T) { {Function: "nested-calls"}, {Function: "path-args", Args: []string{"--file", "golden_test.go", "--dir", "."}}, { - Function: "custom-span", + Function: "custom-status", Env: []string{ "OTEL_RESOURCE_ATTRIBUTES=foo=bar,fizz=buzz", }, @@ -91,8 +91,8 @@ func (s TelemetrySuite) TestGolden(ctx context.Context, t *testctx.T) { require.Contains(t, attrs, attribute.String("fizz", "buzz")) }, }, - {Function: "nested-spans"}, - {Function: "nested-spans", Args: []string{"--fail"}, Fail: true}, + {Function: "nested-statuses"}, + {Function: "nested-statuses", Args: []string{"--fail"}, Fail: true}, {Function: "use-exec-service"}, {Function: "use-no-exec-service"}, {Function: "docker-build", Args: []string{ @@ -103,7 +103,7 @@ func (s TelemetrySuite) TestGolden(ctx context.Context, t *testctx.T) { "with-exec", "--args", "echo,hey", "stdout", }, Fail: true}, - {Function: "revealed-spans"}, + {Function: "revealed-statuses"}, {Function: "git-readme", Args: []string{ "--remote", "https://github.com/dagger/dagger", @@ -153,18 +153,18 @@ func (s TelemetrySuite) TestGolden(ctx context.Context, t *testctx.T) { // Python SDK tests {Module: "./viztest/python", Function: "pending", Fail: true}, - {Module: "./viztest/python", Function: "custom-span"}, - {Module: "./viztest/python", Function: "nested-spans"}, - {Module: "./viztest/python", Function: "nested-spans", Args: []string{"--fail"}, Fail: true}, + {Module: "./viztest/python", Function: "custom-status"}, + {Module: "./viztest/python", Function: "nested-statuses"}, + {Module: "./viztest/python", Function: "nested-statuses", Args: []string{"--fail"}, Fail: true}, // TypeScript SDK tests {Module: "./viztest/typescript", Function: "pending", Fail: true}, - {Module: "./viztest/typescript", Function: "custom-span"}, + {Module: "./viztest/typescript", Function: "custom-status"}, {Module: "./viztest/typescript", Function: "fail-log", Fail: true}, {Module: "./viztest/typescript", Function: "fail-effect", Fail: true}, {Module: "./viztest/typescript", Function: "fail-log-native", Fail: true}, - {Module: "./viztest/typescript", Function: "nested-spans"}, - {Module: "./viztest/typescript", Function: "nested-spans", Args: []string{"--fail"}, Fail: true}, + {Module: "./viztest/typescript", Function: "nested-statuses"}, + {Module: "./viztest/typescript", Function: "nested-statuses", Args: []string{"--fail"}, Fail: true}, } { testName := ex.Function if ex.Module != "" { diff --git a/dagql/idtui/testdata/TestTelemetry/TestGolden/custom-span b/dagql/idtui/testdata/TestTelemetry/TestGolden/custom-status similarity index 94% rename from dagql/idtui/testdata/TestTelemetry/TestGolden/custom-span rename to dagql/idtui/testdata/TestTelemetry/TestGolden/custom-status index dc7e642ed08..04223a14c53 100644 --- a/dagql/idtui/testdata/TestTelemetry/TestGolden/custom-span +++ b/dagql/idtui/testdata/TestTelemetry/TestGolden/custom-status @@ -19,9 +19,9 @@ Expected stderr: ● parsing command line arguments X.Xs ● viztest: Viztest! X.Xs -▼ .customSpan: String! X.Xs +▼ .customStatus: String! X.Xs ┃ hello from Go! it is currently 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X -╰─▼ custom span X.Xs +╰─▼ custom status X.Xs ├─● container: Container! X.Xs ├─$ .from(address: "alpine"): Container! X.Xs CACHED ├─▼ .withExec(args: ["echo", "hello from Go! it is currently 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X"]): Container! X.Xs diff --git a/dagql/idtui/testdata/TestTelemetry/TestGolden/fail-encapsulated b/dagql/idtui/testdata/TestTelemetry/TestGolden/fail-encapsulated index 994aff07485..7af7a5e2e13 100644 --- a/dagql/idtui/testdata/TestTelemetry/TestGolden/fail-encapsulated +++ b/dagql/idtui/testdata/TestTelemetry/TestGolden/fail-encapsulated @@ -16,22 +16,22 @@ Expected stderr: ● viztest: Viztest! X.Xs ▼ .failEncapsulated: Void X.Xs ERROR ! i failed on the outside -├─▼ failing outer span X.Xs ERROR +├─▼ failing outer status X.Xs ERROR │ ! outer failure │ ╰─▼ unset middle span X.Xs -│ ╰─▼ failing inner span X.Xs ERROR +│ ╰─▼ failing inner status X.Xs ERROR │ ┃ this should be hoisted - ancestor failed │ ! inner failure │ -╰─▼ succeeding outer span X.Xs +╰─▼ succeeding outer status X.Xs ╰─▼ unset middle span X.Xs - ╰─▼ failing inner span X.Xs ERROR + ╰─▼ failing inner status X.Xs ERROR ┃ this should NOT be hoisted - ancestor succeeded ! inner failure Error logs: -▼ failing inner span X.Xs ERROR +▼ failing inner status X.Xs ERROR this should be hoisted - ancestor failed ! inner failure diff --git a/dagql/idtui/testdata/TestTelemetry/TestGolden/nested-spans b/dagql/idtui/testdata/TestTelemetry/TestGolden/nested-statuses similarity index 92% rename from dagql/idtui/testdata/TestTelemetry/TestGolden/nested-spans rename to dagql/idtui/testdata/TestTelemetry/TestGolden/nested-statuses index 659fe606fa3..572f331ebce 100644 --- a/dagql/idtui/testdata/TestTelemetry/TestGolden/nested-spans +++ b/dagql/idtui/testdata/TestTelemetry/TestGolden/nested-statuses @@ -19,9 +19,9 @@ Expected stderr: ● parsing command line arguments X.Xs ● viztest: Viztest! X.Xs -▼ .nestedSpans: String! X.Xs +▼ .nestedStatuses: String! X.Xs ┃ hello from Go! it is currently 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X -├─▼ custom span X.Xs +├─▼ custom status X.Xs │ ├─● container: Container! X.Xs │ ├─$ .from(address: "alpine"): Container! X.Xs CACHED │ ├─▼ .withExec(args: ["echo", "outer: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X"]): Container! X.Xs @@ -29,20 +29,20 @@ Expected stderr: │ ├─▼ .stdout: String! X.Xs │ │ ┃ outer: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X │ │ -│ ├─▼ sub span X.Xs +│ ├─▼ sub status X.Xs │ │ ├─▼ Container.withExec(args: ["echo", "sub 1: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X"]): Container! X.Xs │ │ │ ┃ sub 1: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X │ │ ╰─▼ .stdout: String! X.Xs │ │ ┃ sub 1: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X │ │ -│ ├─▼ sub span X.Xs +│ ├─▼ sub status X.Xs │ │ ├─▼ Container.withExec(args: ["echo", "sub 2: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X"]): Container! X.Xs │ │ │ ┃ sub 2: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X │ │ ╰─▼ .stdout: String! X.Xs │ │ ┃ sub 2: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X │ │ -│ ╰─▼ another sub span X.Xs -│ ╰─▼ sub span X.Xs +│ ╰─▼ another sub status X.Xs +│ ╰─▼ sub status X.Xs │ ├─▼ Container.withExec(args: ["echo", "im even deeper: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X"]): Container! X.Xs │ │ ┃ im even deeper: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X │ ╰─▼ .stdout: String! X.Xs diff --git a/dagql/idtui/testdata/TestTelemetry/TestGolden/nested-spans#01 b/dagql/idtui/testdata/TestTelemetry/TestGolden/nested-statuses#01 similarity index 86% rename from dagql/idtui/testdata/TestTelemetry/TestGolden/nested-spans#01 rename to dagql/idtui/testdata/TestTelemetry/TestGolden/nested-statuses#01 index d3fa0480604..e5450d0edb9 100644 --- a/dagql/idtui/testdata/TestTelemetry/TestGolden/nested-spans#01 +++ b/dagql/idtui/testdata/TestTelemetry/TestGolden/nested-statuses#01 @@ -14,9 +14,9 @@ Expected stderr: ● parsing command line arguments X.Xs ● viztest: Viztest! X.Xs -▼ .nestedSpans(fail: true): String! X.Xs ERROR +▼ .nestedStatuses(fail: true): String! X.Xs ERROR ! oh no -╰─▼ custom span X.Xs ERROR +╰─▼ custom status X.Xs ERROR ! oh no ├─● container: Container! X.Xs ├─$ .from(address: "alpine"): Container! X.Xs CACHED @@ -25,21 +25,21 @@ Expected stderr: ├─▼ .stdout: String! X.Xs │ ┃ outer: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X │ - ├─▼ sub span X.Xs + ├─▼ sub status X.Xs │ ├─▼ Container.withExec(args: ["echo", "sub 1: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X"]): Container! X.Xs │ │ ┃ sub 1: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X │ ╰─▼ .stdout: String! X.Xs │ ┃ sub 1: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X │ - ├─▼ sub span X.Xs + ├─▼ sub status X.Xs │ ├─▼ Container.withExec(args: ["echo", "sub 2: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X"]): Container! X.Xs │ │ ┃ sub 2: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X │ ╰─▼ .stdout: String! X.Xs │ ┃ sub 2: 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X │ - ╰─▼ another sub span X.Xs ERROR + ╰─▼ another sub status X.Xs ERROR ! oh no - ╰─✘ sub span X.Xs ERROR + ╰─✘ sub status X.Xs ERROR ! oh no Setup tracing at https://dagger.cloud/traces/setup. To hide set DAGGER_NO_NAG=1 diff --git a/dagql/idtui/testdata/TestTelemetry/TestGolden/python/custom-span b/dagql/idtui/testdata/TestTelemetry/TestGolden/python/custom-status similarity index 94% rename from dagql/idtui/testdata/TestTelemetry/TestGolden/python/custom-span rename to dagql/idtui/testdata/TestTelemetry/TestGolden/python/custom-status index 782de96049c..ac68d070e11 100644 --- a/dagql/idtui/testdata/TestTelemetry/TestGolden/python/custom-span +++ b/dagql/idtui/testdata/TestTelemetry/TestGolden/python/custom-status @@ -19,9 +19,9 @@ Expected stderr: ● parsing command line arguments X.Xs ● python: Python! X.Xs -▼ .customSpan: String! X.Xs +▼ .customStatus: String! X.Xs ┃ hello from Python! it is currently 20XX-XX-XX XX:XX:XX.XXXX -╰─▼ custom span X.Xs +╰─▼ custom status X.Xs ├─$ Container.from(address: "alpine:latest"): Container! X.Xs CACHED ├─▼ .withExec(args: ["echo", "hello from Python! it is currently 20XX-XX-XX XX:XX:XX.XXXX"]): Container! X.Xs │ ┃ hello from Python! it is currently 20XX-XX-XX XX:XX:XX.XXXX diff --git a/dagql/idtui/testdata/TestTelemetry/TestGolden/python/nested-spans b/dagql/idtui/testdata/TestTelemetry/TestGolden/python/nested-statuses similarity index 89% rename from dagql/idtui/testdata/TestTelemetry/TestGolden/python/nested-spans rename to dagql/idtui/testdata/TestTelemetry/TestGolden/python/nested-statuses index 0689c81efe8..eb78321f7a6 100644 --- a/dagql/idtui/testdata/TestTelemetry/TestGolden/python/nested-spans +++ b/dagql/idtui/testdata/TestTelemetry/TestGolden/python/nested-statuses @@ -18,29 +18,29 @@ Expected stderr: ● parsing command line arguments X.Xs ● python: Python! X.Xs -▼ .nestedSpans: String! X.Xs +▼ .nestedStatuses: String! X.Xs ┃ done -╰─▼ custom span X.Xs +╰─▼ custom status X.Xs ├─$ Container.from(address: "alpine:latest"): Container! X.Xs CACHED ├─▼ .withExec(args: ["echo", "outer: 20XX-XX-XX XX:XX:XX.XXXX"]): Container! X.Xs │ ┃ outer: 20XX-XX-XX XX:XX:XX.XXXX ├─▼ .stdout: String! X.Xs │ ┃ outer: 20XX-XX-XX XX:XX:XX.XXXX │ - ├─▼ sub span X.Xs + ├─▼ sub status X.Xs │ ├─▼ Container.withExec(args: ["echo", "sub 1: 20XX-XX-XX XX:XX:XX.XXXX"]): Container! X.Xs │ │ ┃ sub 1: 20XX-XX-XX XX:XX:XX.XXXX │ ╰─▼ .stdout: String! X.Xs │ ┃ sub 1: 20XX-XX-XX XX:XX:XX.XXXX │ - ├─▼ sub span X.Xs + ├─▼ sub status X.Xs │ ├─▼ Container.withExec(args: ["echo", "sub 2: 20XX-XX-XX XX:XX:XX.XXXX"]): Container! X.Xs │ │ ┃ sub 2: 20XX-XX-XX XX:XX:XX.XXXX │ ╰─▼ .stdout: String! X.Xs │ ┃ sub 2: 20XX-XX-XX XX:XX:XX.XXXX │ - ╰─▼ another sub span X.Xs - ╰─▼ sub span X.Xs + ╰─▼ another sub status X.Xs + ╰─▼ sub status X.Xs ├─▼ Container.withExec(args: ["echo", "im even deeper: 20XX-XX-XX XX:XX:XX.XXXX"]): Container! X.Xs │ ┃ im even deeper: 20XX-XX-XX XX:XX:XX.XXXX ╰─▼ .stdout: String! X.Xs diff --git a/dagql/idtui/testdata/TestTelemetry/TestGolden/python/nested-spans#01 b/dagql/idtui/testdata/TestTelemetry/TestGolden/python/nested-statuses#01 similarity index 85% rename from dagql/idtui/testdata/TestTelemetry/TestGolden/python/nested-spans#01 rename to dagql/idtui/testdata/TestTelemetry/TestGolden/python/nested-statuses#01 index 2d116584bd4..f55f15bf06c 100644 --- a/dagql/idtui/testdata/TestTelemetry/TestGolden/python/nested-spans#01 +++ b/dagql/idtui/testdata/TestTelemetry/TestGolden/python/nested-statuses#01 @@ -14,9 +14,9 @@ Expected stderr: ● parsing command line arguments X.Xs ● python: Python! X.Xs -▼ .nestedSpans(fail: true): String! X.Xs ERROR +▼ .nestedStatuses(fail: true): String! X.Xs ERROR ! oh no -╰─▼ custom span X.Xs ERROR +╰─▼ custom status X.Xs ERROR ! ValueError: oh no ├─$ Container.from(address: "alpine:latest"): Container! X.Xs CACHED ├─▼ .withExec(args: ["echo", "outer: 20XX-XX-XX XX:XX:XX.XXXX"]): Container! X.Xs @@ -24,21 +24,21 @@ Expected stderr: ├─▼ .stdout: String! X.Xs │ ┃ outer: 20XX-XX-XX XX:XX:XX.XXXX │ - ├─▼ sub span X.Xs + ├─▼ sub status X.Xs │ ├─▼ Container.withExec(args: ["echo", "sub 1: 20XX-XX-XX XX:XX:XX.XXXX"]): Container! X.Xs │ │ ┃ sub 1: 20XX-XX-XX XX:XX:XX.XXXX │ ╰─▼ .stdout: String! X.Xs │ ┃ sub 1: 20XX-XX-XX XX:XX:XX.XXXX │ - ├─▼ sub span X.Xs + ├─▼ sub status X.Xs │ ├─▼ Container.withExec(args: ["echo", "sub 2: 20XX-XX-XX XX:XX:XX.XXXX"]): Container! X.Xs │ │ ┃ sub 2: 20XX-XX-XX XX:XX:XX.XXXX │ ╰─▼ .stdout: String! X.Xs │ ┃ sub 2: 20XX-XX-XX XX:XX:XX.XXXX │ - ╰─▼ another sub span X.Xs ERROR + ╰─▼ another sub status X.Xs ERROR ! ValueError: oh no - ╰─✘ sub span X.Xs ERROR + ╰─✘ sub status X.Xs ERROR ! ValueError: oh no Setup tracing at https://dagger.cloud/traces/setup. To hide set DAGGER_NO_NAG=1 diff --git a/dagql/idtui/testdata/TestTelemetry/TestGolden/revealed-spans b/dagql/idtui/testdata/TestTelemetry/TestGolden/revealed-statuses similarity index 91% rename from dagql/idtui/testdata/TestTelemetry/TestGolden/revealed-spans rename to dagql/idtui/testdata/TestTelemetry/TestGolden/revealed-statuses index 2597dfb7bd2..f83f930a79e 100644 --- a/dagql/idtui/testdata/TestTelemetry/TestGolden/revealed-spans +++ b/dagql/idtui/testdata/TestTelemetry/TestGolden/revealed-statuses @@ -19,9 +19,9 @@ Expected stderr: ● parsing command line arguments X.Xs ● viztest: Viztest! X.Xs -▼ .revealedSpans: String! X.Xs +▼ .revealedStatuses: String! X.Xs ┃ hello from Go! it is currently 20XX-XX-XX XX:XX:XX.XXXX +XXXX UTC m=+X.X -├─● revealed span X.Xs +├─● revealed status X.Xs │ ╰─😊 sometimes you gotta be bold ┃ X.Xs diff --git a/dagql/idtui/testdata/TestTelemetry/TestGolden/typescript/custom-span b/dagql/idtui/testdata/TestTelemetry/TestGolden/typescript/custom-status similarity index 94% rename from dagql/idtui/testdata/TestTelemetry/TestGolden/typescript/custom-span rename to dagql/idtui/testdata/TestTelemetry/TestGolden/typescript/custom-status index 683f191afdd..1ff5708776a 100644 --- a/dagql/idtui/testdata/TestTelemetry/TestGolden/typescript/custom-span +++ b/dagql/idtui/testdata/TestTelemetry/TestGolden/typescript/custom-status @@ -19,9 +19,9 @@ Expected stderr: ● parsing command line arguments X.Xs ● typescript: Typescript! X.Xs -▼ .customSpan: String! X.Xs +▼ .customStatus: String! X.Xs ┃ hello from TypeScript! it is currently XXXX-XX-XXTXX:XX:XX.XXXZ -╰─▼ custom span X.Xs +╰─▼ custom status X.Xs ├─$ Container.from(address: "alpine:latest"): Container! X.Xs CACHED ├─▼ .withExec(args: ["echo", "hello from TypeScript! it is currently XXXX-XX-XXTXX:XX:XX.XXXZ"]): Container! X.Xs │ ┃ hello from TypeScript! it is currently XXXX-XX-XXTXX:XX:XX.XXXZ diff --git a/dagql/idtui/testdata/TestTelemetry/TestGolden/typescript/nested-spans b/dagql/idtui/testdata/TestTelemetry/TestGolden/typescript/nested-statuses similarity index 89% rename from dagql/idtui/testdata/TestTelemetry/TestGolden/typescript/nested-spans rename to dagql/idtui/testdata/TestTelemetry/TestGolden/typescript/nested-statuses index 60bbe177381..ba937fe5641 100644 --- a/dagql/idtui/testdata/TestTelemetry/TestGolden/typescript/nested-spans +++ b/dagql/idtui/testdata/TestTelemetry/TestGolden/typescript/nested-statuses @@ -18,29 +18,29 @@ Expected stderr: ● parsing command line arguments X.Xs ● typescript: Typescript! X.Xs -▼ .nestedSpans: String! X.Xs +▼ .nestedStatuses: String! X.Xs ┃ done -╰─▼ custom span X.Xs +╰─▼ custom status X.Xs ├─$ Container.from(address: "alpine:latest"): Container! X.Xs CACHED ├─▼ .withExec(args: ["echo", "outer: XXXX-XX-XXTXX:XX:XX.XXXZ"]): Container! X.Xs │ ┃ outer: XXXX-XX-XXTXX:XX:XX.XXXZ ├─▼ .stdout: String! X.Xs │ ┃ outer: XXXX-XX-XXTXX:XX:XX.XXXZ │ - ├─▼ sub span X.Xs + ├─▼ sub status X.Xs │ ├─▼ Container.withExec(args: ["echo", "sub 1: XXXX-XX-XXTXX:XX:XX.XXXZ"]): Container! X.Xs │ │ ┃ sub 1: XXXX-XX-XXTXX:XX:XX.XXXZ │ ╰─▼ .stdout: String! X.Xs │ ┃ sub 1: XXXX-XX-XXTXX:XX:XX.XXXZ │ - ├─▼ sub span X.Xs + ├─▼ sub status X.Xs │ ├─▼ Container.withExec(args: ["echo", "sub 2: XXXX-XX-XXTXX:XX:XX.XXXZ"]): Container! X.Xs │ │ ┃ sub 2: XXXX-XX-XXTXX:XX:XX.XXXZ │ ╰─▼ .stdout: String! X.Xs │ ┃ sub 2: XXXX-XX-XXTXX:XX:XX.XXXZ │ - ╰─▼ another sub span X.Xs - ╰─▼ sub span X.Xs + ╰─▼ another sub status X.Xs + ╰─▼ sub status X.Xs ├─▼ Container.withExec(args: ["echo", "im even deeper: XXXX-XX-XXTXX:XX:XX.XXXZ"]): Container! X.Xs │ ┃ im even deeper: XXXX-XX-XXTXX:XX:XX.XXXZ ╰─▼ .stdout: String! X.Xs diff --git a/dagql/idtui/testdata/TestTelemetry/TestGolden/typescript/nested-spans#01 b/dagql/idtui/testdata/TestTelemetry/TestGolden/typescript/nested-statuses#01 similarity index 85% rename from dagql/idtui/testdata/TestTelemetry/TestGolden/typescript/nested-spans#01 rename to dagql/idtui/testdata/TestTelemetry/TestGolden/typescript/nested-statuses#01 index 5eac1bd546d..e7cb4e16b2c 100644 --- a/dagql/idtui/testdata/TestTelemetry/TestGolden/typescript/nested-spans#01 +++ b/dagql/idtui/testdata/TestTelemetry/TestGolden/typescript/nested-statuses#01 @@ -14,9 +14,9 @@ Expected stderr: ● parsing command line arguments X.Xs ● typescript: Typescript! X.Xs -▼ .nestedSpans(fail: true): String! X.Xs ERROR +▼ .nestedStatuses(fail: true): String! X.Xs ERROR ! oh no -╰─▼ custom span X.Xs ERROR +╰─▼ custom status X.Xs ERROR ! oh no ├─$ Container.from(address: "alpine:latest"): Container! X.Xs CACHED ├─▼ .withExec(args: ["echo", "outer: XXXX-XX-XXTXX:XX:XX.XXXZ"]): Container! X.Xs @@ -24,21 +24,21 @@ Expected stderr: ├─▼ .stdout: String! X.Xs │ ┃ outer: XXXX-XX-XXTXX:XX:XX.XXXZ │ - ├─▼ sub span X.Xs + ├─▼ sub status X.Xs │ ├─▼ Container.withExec(args: ["echo", "sub 1: XXXX-XX-XXTXX:XX:XX.XXXZ"]): Container! X.Xs │ │ ┃ sub 1: XXXX-XX-XXTXX:XX:XX.XXXZ │ ╰─▼ .stdout: String! X.Xs │ ┃ sub 1: XXXX-XX-XXTXX:XX:XX.XXXZ │ - ├─▼ sub span X.Xs + ├─▼ sub status X.Xs │ ├─▼ Container.withExec(args: ["echo", "sub 2: XXXX-XX-XXTXX:XX:XX.XXXZ"]): Container! X.Xs │ │ ┃ sub 2: XXXX-XX-XXTXX:XX:XX.XXXZ │ ╰─▼ .stdout: String! X.Xs │ ┃ sub 2: XXXX-XX-XXTXX:XX:XX.XXXZ │ - ╰─▼ another sub span X.Xs ERROR + ╰─▼ another sub status X.Xs ERROR ! oh no - ╰─✘ sub span X.Xs ERROR + ╰─✘ sub status X.Xs ERROR ! oh no Setup tracing at https://dagger.cloud/traces/setup. To hide set DAGGER_NO_NAG=1 diff --git a/dagql/idtui/testdata/TestTelemetry/TestGolden/viztest/python/nested-spans b/dagql/idtui/testdata/TestTelemetry/TestGolden/viztest/python/nested-spans deleted file mode 100644 index 4a91431bec5..00000000000 --- a/dagql/idtui/testdata/TestTelemetry/TestGolden/viztest/python/nested-spans +++ /dev/null @@ -1,45 +0,0 @@ -Expected stdout: - -done - -Expected stderr: - -✔ connect X.Xs -│ ✔ starting engine X.Xs -│ ✔ connecting to engine X.Xs -│ ✔ starting session X.Xs - -✔ load module X.Xs -│ ✔ finding module configuration X.Xs -│ ✔ initializing module X.Xs -│ ✔ inspecting module metadata X.Xs -│ ✔ loading type definitions X.Xs - -✔ parsing command line arguments X.Xs - -✔ python: Python! X.Xs -✔ .nestedSpans: String! X.Xs -│ ✔ custom span X.Xs -│ │ $ Container.from(address: "alpine:latest"): Container! X.Xs CACHED -│ │ ✔ .withExec(args: ["echo", "outer: 20XX-XX-XX XX:XX:XX.XXXX"]): Container! X.Xs -│ │ ┃ outer: 20XX-XX-XX XX:XX:XX.XXXX -│ │ ✔ .stdout: String! X.Xs -│ │ -│ │ ✔ sub span X.Xs -│ │ │ ✔ Container.withExec(args: ["echo", "sub 1: 20XX-XX-XX XX:XX:XX.XXXX"]): Container! X.Xs -│ │ │ ┃ sub 1: 20XX-XX-XX XX:XX:XX.XXXX -│ │ │ ✔ .stdout: String! X.Xs -│ │ -│ │ ✔ sub span X.Xs -│ │ │ ✔ Container.withExec(args: ["echo", "sub 2: 20XX-XX-XX XX:XX:XX.XXXX"]): Container! X.Xs -│ │ │ ┃ sub 2: 20XX-XX-XX XX:XX:XX.XXXX -│ │ │ ✔ .stdout: String! X.Xs -│ │ -│ │ ✔ another sub span X.Xs -│ │ │ ✔ sub span X.Xs -│ │ │ │ ✔ Container.withExec(args: ["echo", "im even deeper: 20XX-XX-XX XX:XX:XX.XXXX"]): Container! X.Xs -│ │ │ │ ┃ im even deeper: 20XX-XX-XX XX:XX:XX.XXXX -│ │ │ │ ✔ .stdout: String! X.Xs - - -Setup tracing at https://dagger.cloud/traces/setup. To hide set DAGGER_NO_NAG=1 diff --git a/dagql/idtui/testdata/TestTelemetry/TestGolden/viztest/python/nested-spans#01 b/dagql/idtui/testdata/TestTelemetry/TestGolden/viztest/python/nested-spans#01 deleted file mode 100644 index af8ea113aef..00000000000 --- a/dagql/idtui/testdata/TestTelemetry/TestGolden/viztest/python/nested-spans#01 +++ /dev/null @@ -1,41 +0,0 @@ -Expected stderr: - -✔ connect X.Xs -│ ✔ starting engine X.Xs -│ ✔ connecting to engine X.Xs -│ ✔ starting session X.Xs - -✔ load module X.Xs -│ ✔ finding module configuration X.Xs -│ ✔ initializing module X.Xs -│ ✔ inspecting module metadata X.Xs -│ ✔ loading type definitions X.Xs - -✔ parsing command line arguments X.Xs - -✔ python: Python! X.Xs -✘ .nestedSpans(fail: true): String! X.Xs -! oh no -│ ✘ custom span X.Xs -│ ! ValueError: oh no -│ │ $ Container.from(address: "alpine:latest"): Container! X.Xs CACHED -│ │ ✔ .withExec(args: ["echo", "outer: 20XX-XX-XX XX:XX:XX.XXXX"]): Container! X.Xs -│ │ ┃ outer: 20XX-XX-XX XX:XX:XX.XXXX -│ │ ✔ .stdout: String! X.Xs -│ │ -│ │ ✔ sub span X.Xs -│ │ │ ✔ Container.withExec(args: ["echo", "sub 1: 20XX-XX-XX XX:XX:XX.XXXX"]): Container! X.Xs -│ │ │ ┃ sub 1: 20XX-XX-XX XX:XX:XX.XXXX -│ │ │ ✔ .stdout: String! X.Xs -│ │ -│ │ ✔ sub span X.Xs -│ │ │ ✔ Container.withExec(args: ["echo", "sub 2: 20XX-XX-XX XX:XX:XX.XXXX"]): Container! X.Xs -│ │ │ ┃ sub 2: 20XX-XX-XX XX:XX:XX.XXXX -│ │ │ ✔ .stdout: String! X.Xs -│ │ -│ │ ✘ another sub span X.Xs -│ │ ! ValueError: oh no -│ │ │ ✘ sub span X.Xs -│ │ │ ! ValueError: oh no - -Setup tracing at https://dagger.cloud/traces/setup. To hide set DAGGER_NO_NAG=1 diff --git a/dagql/idtui/testdata/TestTelemetry/TestGolden/viztest/typescript/nested-spans b/dagql/idtui/testdata/TestTelemetry/TestGolden/viztest/typescript/nested-spans deleted file mode 100644 index 7506c853829..00000000000 --- a/dagql/idtui/testdata/TestTelemetry/TestGolden/viztest/typescript/nested-spans +++ /dev/null @@ -1,45 +0,0 @@ -Expected stdout: - -done - -Expected stderr: - -✔ connect X.Xs -│ ✔ starting engine X.Xs -│ ✔ connecting to engine X.Xs -│ ✔ starting session X.Xs - -✔ load module X.Xs -│ ✔ finding module configuration X.Xs -│ ✔ initializing module X.Xs -│ ✔ inspecting module metadata X.Xs -│ ✔ loading type definitions X.Xs - -✔ parsing command line arguments X.Xs - -✔ typescript: Typescript! X.Xs -✔ .nestedSpans: String! X.Xs -│ ✔ custom span X.Xs -│ │ $ Container.from(address: "alpine:latest"): Container! X.Xs CACHED -│ │ ✔ .withExec(args: ["echo", "outer: XXXX-XX-XXTXX:XX:XX.XXXZ"]): Container! X.Xs -│ │ ┃ outer: XXXX-XX-XXTXX:XX:XX.XXXZ -│ │ ✔ .stdout: String! X.Xs -│ │ -│ │ ✔ sub span X.Xs -│ │ │ ✔ Container.withExec(args: ["echo", "sub 1: XXXX-XX-XXTXX:XX:XX.XXXZ"]): Container! X.Xs -│ │ │ ┃ sub 1: XXXX-XX-XXTXX:XX:XX.XXXZ -│ │ │ ✔ .stdout: String! X.Xs -│ │ -│ │ ✔ sub span X.Xs -│ │ │ ✔ Container.withExec(args: ["echo", "sub 2: XXXX-XX-XXTXX:XX:XX.XXXZ"]): Container! X.Xs -│ │ │ ┃ sub 2: XXXX-XX-XXTXX:XX:XX.XXXZ -│ │ │ ✔ .stdout: String! X.Xs -│ │ -│ │ ✔ another sub span X.Xs -│ │ │ ✔ sub span X.Xs -│ │ │ │ ✔ Container.withExec(args: ["echo", "im even deeper: XXXX-XX-XXTXX:XX:XX.XXXZ"]): Container! X.Xs -│ │ │ │ ┃ im even deeper: XXXX-XX-XXTXX:XX:XX.XXXZ -│ │ │ │ ✔ .stdout: String! X.Xs - - -Setup tracing at https://dagger.cloud/traces/setup. To hide set DAGGER_NO_NAG=1 diff --git a/dagql/idtui/testdata/TestTelemetry/TestGolden/viztest/typescript/nested-spans#01 b/dagql/idtui/testdata/TestTelemetry/TestGolden/viztest/typescript/nested-spans#01 deleted file mode 100644 index 84487310c4d..00000000000 --- a/dagql/idtui/testdata/TestTelemetry/TestGolden/viztest/typescript/nested-spans#01 +++ /dev/null @@ -1,48 +0,0 @@ -Expected stderr: - -✔ connect X.Xs -│ ✔ starting engine X.Xs -│ ✔ connecting to engine X.Xs -│ ✔ starting session X.Xs - -✔ load module X.Xs -│ ✔ finding module configuration X.Xs -│ ✔ initializing module X.Xs -│ ✔ inspecting module metadata X.Xs -│ ✔ loading type definitions X.Xs - -✔ parsing command line arguments X.Xs - -✔ typescript: Typescript! X.Xs -✘ .nestedSpans(fail: true): String! X.Xs -┃ Error: oh no -! process "tsx --no-deprecation --tsconfig /src/tsconfig.json /src/src/__dagger.entrypoint.ts" did not complete successfully: exit code: 1 -│ ✘ custom span X.Xs -│ ! oh no -│ │ $ Container.from(address: "alpine:latest"): Container! X.Xs CACHED -│ │ ✔ .withExec(args: ["echo", "outer: XXXX-XX-XXTXX:XX:XX.XXXZ"]): Container! X.Xs -│ │ ┃ outer: XXXX-XX-XXTXX:XX:XX.XXXZ -│ │ ✔ .stdout: String! X.Xs -│ │ -│ │ ✔ sub span X.Xs -│ │ │ ✔ Container.withExec(args: ["echo", "sub 1: XXXX-XX-XXTXX:XX:XX.XXXZ"]): Container! X.Xs -│ │ │ ┃ sub 1: XXXX-XX-XXTXX:XX:XX.XXXZ -│ │ │ ✔ .stdout: String! X.Xs -│ │ -│ │ ✔ sub span X.Xs -│ │ │ ✔ Container.withExec(args: ["echo", "sub 2: XXXX-XX-XXTXX:XX:XX.XXXZ"]): Container! X.Xs -│ │ │ ┃ sub 2: XXXX-XX-XXTXX:XX:XX.XXXZ -│ │ │ ✔ .stdout: String! X.Xs -│ │ -│ │ ✘ another sub span X.Xs -│ │ ! oh no -│ │ │ ✘ sub span X.Xs -│ │ │ ! oh no - -Error logs: - -✘ .nestedSpans(fail: true): String! X.Xs -Error: oh no -! process "tsx --no-deprecation --tsconfig /src/tsconfig.json /src/src/__dagger.entrypoint.ts" did not complete successfully: exit code: 1 - -Setup tracing at https://dagger.cloud/traces/setup. To hide set DAGGER_NO_NAG=1 diff --git a/dagql/idtui/viztest/dagger.json b/dagql/idtui/viztest/dagger.json index 3591143a29c..f42bd5d3da8 100644 --- a/dagql/idtui/viztest/dagger.json +++ b/dagql/idtui/viztest/dagger.json @@ -1,6 +1,6 @@ { "name": "viztest", - "engineVersion": "v0.18.12-250626223947-3332f01a3cf8", + "engineVersion": "v0.18.12-010101000000-dev-b7aafcc48109", "sdk": { "source": "go" }, diff --git a/dagql/idtui/viztest/main.go b/dagql/idtui/viztest/main.go index 9741106c76a..2cb19b13d45 100644 --- a/dagql/idtui/viztest/main.go +++ b/dagql/idtui/viztest/main.go @@ -12,9 +12,7 @@ import ( "dagger/viztest/internal/dagger" "dagger/viztest/internal/telemetry" - "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/log" - "go.opentelemetry.io/otel/trace" ) type Viztest struct { @@ -42,41 +40,33 @@ func (v *Viztest) Encapsulate(ctx context.Context) error { // Demonstrate that error logs are not hoisted as long as their enclosing span // did not fail, and how UNSET spans interact with the hoisting logic. func (*Viztest) FailEncapsulated(ctx context.Context) error { - // Scenario 1: UNSET span under ERROR span - should hoist - (func() (rerr error) { - ctx, span := dag.Status("failing outer span").Context(ctx) - defer telemetry.End(span, func() error { return rerr }) + // Scenario 1: UNSET span under ERROR status - should hoist + dag.Status("failing outer status").Run(ctx, func(ctx context.Context) error { (func() { - ctx, span := dag.Status("unset middle span").Context(ctx) + ctx, span := Tracer().Start(ctx, "unset middle span") defer span.End() // UNSET - (func() (rerr error) { - ctx, span := dag.Status("failing inner span").Context(ctx) - defer telemetry.End(span, func() error { return rerr }) + dag.Status("failing inner status").Run(ctx, func(ctx context.Context) error { stdio := telemetry.SpanStdio(ctx, "") fmt.Fprintln(stdio.Stdout, "this should be hoisted - ancestor failed") return errors.New("inner failure") - })() + }) })() return errors.New("outer failure") - })() + }) - // Scenario 2: UNSET span under OK span - should NOT hoist - (func() (rerr error) { - ctx, span := dag.Status("succeeding outer span").Context(ctx) - defer telemetry.End(span, func() error { return rerr }) + // Scenario 2: UNSET span under OK status - should NOT hoist + dag.Status("succeeding outer status").Run(ctx, func(ctx context.Context) error { (func() { - ctx, span := dag.Status("unset middle span").Context(ctx) + ctx, span := Tracer().Start(ctx, "unset middle span") defer span.End() // UNSET - (func() (rerr error) { - ctx, span := dag.Status("failing inner span").Context(ctx) - defer telemetry.End(span, func() error { return rerr }) + dag.Status("failing inner status").Run(ctx, func(ctx context.Context) error { stdio := telemetry.SpanStdio(ctx, "") fmt.Fprintln(stdio.Stdout, "this should NOT be hoisted - ancestor succeeded") return errors.New("inner failure") - })() + }) })() return nil // outer span succeeds - })() + }) return errors.New("i failed on the outside") } @@ -113,73 +103,72 @@ func (*Viztest) ManyLines(n int) { } } -func (v *Viztest) CustomSpan(ctx context.Context) (res string, rerr error) { - ctx, span := dag.Status("custom span").Context(ctx) - defer span.End(ctx) +func (v *Viztest) CustomStatus(ctx context.Context) (res string, rerr error) { + ctx, status := dag.Status("custom status").Context(ctx) + defer status.End(ctx) return v.Echo(ctx, "hello from Go! it is currently "+time.Now().String()) } -func (v *Viztest) RevealedSpans(ctx context.Context) (res string, rerr error) { +func (v *Viztest) RevealedStatuses(ctx context.Context) (res string, rerr error) { func() { - ctx, status := dag.Status("custom span").Context(ctx) + ctx, status := dag.Status("custom status").Context(ctx) status.End(ctx) }() func() { - ctx, status := dag.Status("revealed span").WithReveal().Context(ctx) + ctx, status := dag.Status("revealed status").WithReveal().Context(ctx) status.End(ctx) }() func() { - ctx, span := dag.Status("revealed message"). + ctx, status := dag.Status("revealed message"). WithReveal(). - WithActor("😊"). - WithMessage("received"). + WithActorEmoji("😊"). + WithReceivedMessage(). Context(ctx) - span.End() + status.End(ctx) stdio := telemetry.SpanStdio(ctx, "doesnt matter", log.String("dagger.io/content.type", "text/markdown")) defer stdio.Close() fmt.Fprintln(stdio.Stdout, "sometimes you gotta be **bold**") }() func() { - _, span := dag.Status("revealed span").Context(ctx) - span.End() + _, status := dag.Status("revealed status").Context(ctx) + status.End(ctx) }() return v.Echo(ctx, "hello from Go! it is currently "+time.Now().String()) } func (v *Viztest) RevealAndLog(ctx context.Context) (res string, rerr error) { - ctx, span := Tracer().Start(ctx, "revealed span", - trace.WithAttributes(attribute.Bool("dagger.io/ui.reveal", true))) + ctx, status := dag.Status("revealed status").WithReveal().Context(ctx) res, err := v.Echo(ctx, "hello from Go! it is currently "+time.Now().String()) if err != nil { return "", err } - span.End() + status.End(ctx) fmt.Println("i did stuff, here's the result:", res) return res, nil } -func (v *Viztest) NestedSpans(ctx context.Context, +func (v *Viztest) NestedStatuses(ctx context.Context, // +default=false fail bool, ) (res string, rerr error) { - err := dag.Status("custom span").Run(ctx, func(ctx context.Context) error { + err := dag.Status("custom status").Run(ctx, func(ctx context.Context) error { if _, err := v.Echo(ctx, "outer: "+time.Now().String()); err != nil { return err } - if err := dag.Status("sub span").Run(ctx, func(ctx context.Context) error { + if err := dag.Status("sub status").Run(ctx, func(ctx context.Context) error { _, err := v.Echo(ctx, "sub 1: "+time.Now().String()) return err }); err != nil { return err } - if err := dag.Status("sub span").Run(ctx, func(ctx context.Context) error { + if err := dag.Status("sub status").Run(ctx, func(ctx context.Context) error { _, err := v.Echo(ctx, "sub 2: "+time.Now().String()) return err }); err != nil { return err } - return dag.Status("another sub span").Run(ctx, func(ctx context.Context) error { - return dag.Status("sub span").Run(ctx, func(ctx context.Context) error { + return dag.Status("another sub status").Run(ctx, func(ctx context.Context) error { + return dag.Status("sub status").Run(ctx, func(ctx context.Context) error { if fail { return errors.New("oh no") } else { @@ -195,16 +184,16 @@ func (v *Viztest) NestedSpans(ctx context.Context, return v.Echo(ctx, "hello from Go! it is currently "+time.Now().String()) } -func (*Viztest) ManySpans( +func (*Viztest) ManyStatuses( ctx context.Context, n int, // +default=0 delayMs int, ) { for i := 1; i <= n; i++ { - ctx, span := dag.Status(fmt.Sprintf("span %d", i)).Context(ctx) + ctx, status := dag.Status(fmt.Sprintf("status %d", i)).Context(ctx) time.Sleep(time.Duration(delayMs) * time.Millisecond) - span.End(ctx) + status.End(ctx) } } @@ -225,7 +214,7 @@ func (*Viztest) StreamingLogs( case <-ctx.Done(): return case <-ticker.C: - for i := 0; i < batchSize; i++ { + for range batchSize { fmt.Printf("%d: %d\n", lineNo, time.Now().UnixNano()) lineNo += 1 } @@ -250,7 +239,7 @@ func (*Viztest) StreamingChunks( case <-ctx.Done(): return case <-ticker.C: - for i := 0; i < batchSize; i++ { + for range batchSize { fmt.Printf("%d: %d; ", lineNo, time.Now().UnixNano()) lineNo += 1 } diff --git a/dagql/idtui/viztest/python/src/main/__init__.py b/dagql/idtui/viztest/python/src/main/__init__.py index 25d8b4bfe18..f971f41c5b9 100644 --- a/dagql/idtui/viztest/python/src/main/__init__.py +++ b/dagql/idtui/viztest/python/src/main/__init__.py @@ -16,23 +16,23 @@ async def echo(self, msg: str) -> str: ) @function - async def custom_span(self) -> str: - async with dag.span("custom span"): + async def custom_status(self) -> str: + async with dag.status("custom status"): return await self.echo(f"hello from Python! it is currently {now}") @function - async def nested_spans(self, fail: bool = False) -> str: - async with dag.span("custom span"): + async def nested_statuses(self, fail: bool = False) -> str: + async with dag.status("custom status"): await self.echo(f"outer: {now}") - async with dag.span("sub span"): + async with dag.status("sub status"): await self.echo(f"sub 1: {now}") - async with dag.span("sub span"): + async with dag.status("sub status"): await self.echo(f"sub 2: {now}") - async with dag.span("another sub span"): - async with dag.span("sub span"): + async with dag.status("another sub status"): + async with dag.status("sub status"): if fail: raise ValueError("oh no") else: diff --git a/dagql/idtui/viztest/typescript/src/index.ts b/dagql/idtui/viztest/typescript/src/index.ts index 48e04e5cae4..caac58fd582 100644 --- a/dagql/idtui/viztest/typescript/src/index.ts +++ b/dagql/idtui/viztest/typescript/src/index.ts @@ -56,39 +56,39 @@ export class Typescript { } @func() - async customSpan(): Promise { - return dag.span("custom span").run(async () => { + async customStatus(): Promise { + return dag.status("custom status").run(async () => { return this.echo(`hello from TypeScript! it is currently ${now}`) }) } @func() - async nestedSpans(fail = false): Promise { - return dag.span("custom span").run(async () => { - await this.echo(`outer: ${now}`); + async nestedStatuses(fail = false): Promise { + return dag.status("custom status").run(async () => { + await this.echo(`outer: ${now}`) - // First sub-span - await dag.span("sub span").run(async () => { - await this.echo(`sub 1: ${now}`); - }); + // First sub-status + await dag.status("sub status").run(async () => { + await this.echo(`sub 1: ${now}`) + }) - // Second sub-span - await dag.span("sub span").run(async () => { - await this.echo(`sub 2: ${now}`); - }); + // Second sub-status + await dag.status("sub status").run(async () => { + await this.echo(`sub 2: ${now}`) + }) - // Nested sub-span - await dag.span("another sub span").run(async () => { - await dag.span("sub span").run(async () => { + // Nested sub-status + await dag.status("another sub status").run(async () => { + await dag.status("sub status").run(async () => { if (fail) { - throw new Error("oh no"); + throw new Error("oh no") } else { - await this.echo(`im even deeper: ${now}`); + await this.echo(`im even deeper: ${now}`) } - }); - }); + }) + }) - return "done"; - }); + return "done" + }) } } diff --git a/docs/docs-graphql/schema.graphqls b/docs/docs-graphql/schema.graphqls index 6c003e5af12..ee62dcff339 100644 --- a/docs/docs-graphql/schema.graphqls +++ b/docs/docs-graphql/schema.graphqls @@ -3543,8 +3543,8 @@ type Query { """Load a SourceMap from its ID.""" loadSourceMapFromID(id: SourceMapID!): SourceMap! - """Load a Span from its ID.""" - loadSpanFromID(id: SpanID!): Span! + """Load a Status from its ID.""" + loadStatusFromID(id: StatusID!): Status! """Load a Terminal from its ID.""" loadTerminalFromID(id: TerminalID!): Terminal! @@ -3582,8 +3582,8 @@ type Query { requireKind: ModuleSourceKind ): ModuleSource! - """Returns a span that reveals its child spans and hides itself.""" - reveal: Span! + """Returns a status that reveals its child statuses and hides itself.""" + reveal: Status! """Creates a new secret.""" secret( @@ -3631,13 +3631,13 @@ type Query { column: Int! ): SourceMap! - """Create a new OpenTelemetry span.""" - span( - """Name of the span.""" + """Create a new status indicator.""" + status( + """A display name for the status.""" name: String! key: String = "" - ): Span! + ): Status! """Create a new TypeDef.""" typeDef: TypeDef! @@ -3822,39 +3822,44 @@ The `SourceMapID` scalar type represents an identifier for an object of type Sou """ scalar SourceMapID -"""An OpenTelemetry span.""" -type Span { - """End the OpenTelemetry span, with an optional error.""" +"""A status indicator to show to the user.""" +type Status { + """Mark the status as complete, with an optional error.""" end(error: ErrorID): Void - """A unique identifier for this Span.""" - id: SpanID! + """A unique identifier for this Status.""" + id: StatusID! - """Returns the internal ID of the span.""" + """Returns the internal ID of the status.""" internalId: String! - """The name of the span.""" + """The display name of the status.""" name: String! - """Start a new instance of the span.""" - start: SpanID! + """Start a new instance of the status.""" + start: StatusID! - withActor(actor: String!): Span! + """Set an emoji representing the actor of the status.""" + withActorEmoji(actor: String!): Status! - """Returns a new span with the internal attribute set to true.""" - withInternal: Span! + """Hide the status itself, and reveal its children.""" + withPassthrough: Status! - """Returns a new span with the passthrough attribute set to true.""" - withPassthrough: Span! + """ + Indicates that the status represents a received message. + + The message body must be sent as logs, so that it can be streamed. The name of the status is ignored. + """ + withReceivedMessage: Status! - """Returns a new span with the reveal attribute set to true.""" - withReveal: Span! + """Ensure the status is visible without having to expand its parents.""" + withReveal: Status! } """ -The `SpanID` scalar type represents an identifier for an object of type Span. +The `StatusID` scalar type represents an identifier for an object of type Status. """ -scalar SpanID +scalar StatusID """An interactive terminal that clients can connect to.""" type Terminal { diff --git a/docs/static/api/reference/index.html b/docs/static/api/reference/index.html index 788c62f926a..09548623782 100644 --- a/docs/static/api/reference/index.html +++ b/docs/static/api/reference/index.html @@ -89,7 +89,7 @@
  • loadServiceFromID
  • loadSocketFromID
  • loadSourceMapFromID
  • -
  • loadSpanFromID
  • +
  • loadStatusFromID
  • loadTerminalFromID
  • loadTypeDefFromID
  • module
  • @@ -98,7 +98,7 @@
  • secret
  • setSecret
  • sourceMap
  • -
  • span
  • +
  • status
  • typeDef
  • version
  • @@ -205,8 +205,8 @@
  • SocketID
  • SourceMap
  • SourceMapID
  • -
  • Span
  • -
  • SpanID
  • +
  • Status
  • +
  • StatusID
  • String
  • Terminal
  • TerminalID
  • @@ -3479,18 +3479,18 @@
    Example
    -
    +

    - loadSpanFromID + loadStatusFromID

    Description
    -

    Load a Span from its ID.

    +

    Load a Status from its ID.

    @@ -3499,7 +3499,7 @@
    Description
    Type

    - Span! + Status!

    @@ -3514,7 +3514,7 @@
    Arguments
    - id - SpanID! + id - StatusID! @@ -3758,7 +3758,7 @@

    Description
    -

    Returns a span that reveals its child spans and hides itself.

    +

    Returns a status that reveals its child statuses and hides itself.

    @@ -3767,7 +3767,7 @@
    Description
    Type

    - Span! + Status!

    @@ -3971,18 +3971,18 @@
    Example
    -
    +

    - span + status

    Description
    -

    Create a new OpenTelemetry span.

    +

    Create a new status indicator.

    @@ -3991,7 +3991,7 @@
    Description
    Type

    - Span! + Status!

    @@ -4008,7 +4008,7 @@
    Arguments
    name - String! - Name of the span. + A display name for the status. @@ -11075,16 +11075,16 @@
    Description
    -
    +
    -

    Span

    +

    Status

    Description
    -

    An OpenTelemetry span.

    +

    A status indicator to show to the user.

    Fields
    @@ -11097,8 +11097,8 @@
    Fields
    - end - Void - End the OpenTelemetry span, with an optional error. + end - Void + Mark the status as complete, with an optional error. @@ -11113,25 +11113,24 @@
    error - id - SpanID! - A unique identifier for this Span. + id - StatusID! + A unique identifier for this Status. - internalId - String! - Returns the internal ID of the span. + internalId - String! + Returns the internal ID of the status. - name - String! - The name of the span. + name - String! + The display name of the status. - start - SpanID! - Start a new instance of the span. + start - StatusID! + Start a new instance of the status. - withActor - Span! - - + withActorEmoji - Status! + Set an emoji representing the actor of the status. @@ -11146,16 +11145,19 @@
    actor - withInternal - Span! - Returns a new span with the internal attribute set to true. + withPassthrough - Status! + Hide the status itself, and reveal its children. - withPassthrough - Span! - Returns a new span with the passthrough attribute set to true. + withReceivedMessage - Status! + +

    Indicates that the status represents a received message.

    +

    The message body must be sent as logs, so that it can be streamed. The name of the status is ignored.

    + - withReveal - Span! - Returns a new span with the reveal attribute set to true. + withReveal - Status! + Ensure the status is visible without having to expand its parents. @@ -11163,16 +11165,16 @@
    actor
    -
    +
    -

    SpanID

    +

    StatusID

    Description
    -

    The SpanID scalar type represents an identifier for an object of type Span.

    +

    The StatusID scalar type represents an identifier for an object of type Status.

    diff --git a/docs/static/reference/php/Dagger.html b/docs/static/reference/php/Dagger.html index 7f02511c300..d91faaaf13c 100644 --- a/docs/static/reference/php/Dagger.html +++ b/docs/static/reference/php/Dagger.html @@ -561,13 +561,13 @@

    Classes

    - Span
    -

    An OpenTelemetry span.

    + Status
    +

    A status indicator to show to the user.

    - SpanId
    -

    The SpanID scalar type represents an identifier for an object of type Span.

    + StatusId
    +

    The StatusID scalar type represents an identifier for an object of type Status.

    diff --git a/docs/static/reference/php/Dagger/Client.html b/docs/static/reference/php/Dagger/Client.html index 93902806f67..9d897b489fa 100644 --- a/docs/static/reference/php/Dagger/Client.html +++ b/docs/static/reference/php/Dagger/Client.html @@ -775,12 +775,12 @@

    Methods

    - Span + Status
    - loadSpanFromID(Span $id) + loadStatusFromID(Status $id) -

    Load a Span from its ID.

    +

    Load a Status from its ID.

    @@ -825,12 +825,12 @@

    Methods

    - Span + Status
    reveal() -

    Returns a span that reveals its child spans and hides itself.

    +

    Returns a status that reveals its child statuses and hides itself.

    @@ -865,12 +865,12 @@

    Methods

    - Span + Status
    - span(string $name, string|null $key = '') + status(string $name, string|null $key = '') -

    Create a new OpenTelemetry span.

    +

    Create a new status indicator.

    @@ -3595,10 +3595,10 @@

    Return Value

    -

    +

    at line 689
    - Span - loadSpanFromID(Span $id) + Status + loadStatusFromID(Status $id)

    @@ -3606,14 +3606,14 @@

    -

    Load a Span from its ID.

    +

    Load a Status from its ID.

    Parameters

    - + @@ -3624,7 +3624,7 @@

    Return Value

    SpanStatus $id
    - +
    SpanStatus
    @@ -3817,7 +3817,7 @@

    Return Value

    at line 755
    - Span + Status reveal()

    @@ -3826,7 +3826,7 @@

    -

    Returns a span that reveals its child spans and hides itself.

    +

    Returns a status that reveals its child statuses and hides itself.

    @@ -3834,7 +3834,7 @@

    Return Value

    - +
    SpanStatus
    @@ -3993,10 +3993,10 @@

    Return Value

    -

    +

    at line 802
    - Span - span(string $name, string|null $key = '') + Status + status(string $name, string|null $key = '')

    @@ -4004,7 +4004,7 @@

    -

    Create a new OpenTelemetry span.

    +

    Create a new status indicator.

    Parameters

    @@ -4027,7 +4027,7 @@

    Return Value

    - +
    SpanStatus
    diff --git a/docs/static/reference/php/Dagger/Span.html b/docs/static/reference/php/Dagger/Status.html similarity index 80% rename from docs/static/reference/php/Dagger/Span.html rename to docs/static/reference/php/Dagger/Status.html index 75424413dd6..8cf6f0723eb 100644 --- a/docs/static/reference/php/Dagger/Span.html +++ b/docs/static/reference/php/Dagger/Status.html @@ -3,7 +3,7 @@ - Dagger\Span | API + Dagger\Status | API @@ -19,7 +19,7 @@ - +
    @@ -75,18 +75,18 @@

    class - Span extends AbstractObject implements IdAble + Status extends AbstractObject implements IdAble

    @@ -94,7 +94,7 @@

    Span
    -

    An OpenTelemetry span.

    +

    A status indicator to show to the user.

    @@ -148,7 +148,7 @@

    Methods

    end(Error|null $error = null) -

    End the OpenTelemetry span, with an optional error.

    +

    Mark the status as complete, with an optional error.

    @@ -158,7 +158,7 @@

    Methods

    id() -

    A unique identifier for this Span.

    +

    A unique identifier for this Status.

    @@ -168,7 +168,7 @@

    Methods

    internalId() -

    Returns the internal ID of the span.

    +

    Returns the internal ID of the status.

    @@ -178,58 +178,57 @@

    Methods

    name() -

    The name of the span.

    +

    The display name of the status.

    start() -

    Start a new instance of the span.

    +

    Start a new instance of the status.

    - Span + Status
    - withActor(string $actor) + withActorEmoji(string $actor) -

    No description

    -
    +

    Set an emoji representing the actor of the status.

    - Span + Status
    - withInternal() + withPassthrough() -

    Returns a new span with the internal attribute set to true.

    +

    Hide the status itself, and reveal its children.

    - Span + Status
    - withPassthrough() + withReceivedMessage() -

    Returns a new span with the passthrough attribute set to true.

    +

    Indicates that the status represents a received message.

    - Span + Status
    withReveal() -

    Returns a new span with the reveal attribute set to true.

    +

    Ensure the status is visible without having to expand its parents.

    @@ -339,7 +338,7 @@

    -

    End the OpenTelemetry span, with an optional error.

    +

    Mark the status as complete, with an optional error.

    Parameters

    @@ -381,7 +380,7 @@

    -

    A unique identifier for this Span.

    +

    A unique identifier for this Status.

    @@ -413,7 +412,7 @@

    -

    Returns the internal ID of the span.

    +

    Returns the internal ID of the status.

    @@ -445,7 +444,7 @@

    -

    The name of the span.

    +

    The display name of the status.

    @@ -468,7 +467,7 @@

    Return Value

    at line 58
    - SpanId + StatusId start()

    @@ -477,7 +476,7 @@

    -

    Start a new instance of the span.

    +

    Start a new instance of the status.

    @@ -485,7 +484,7 @@

    Return Value

    - +
    SpanIdStatusId
    @@ -498,10 +497,10 @@

    Return Value

    -

    -
    at line 64
    - Span - withActor(string $actor) +

    +
    at line 67
    + Status + withActorEmoji(string $actor)

    @@ -509,8 +508,7 @@

    -

    No description

    - +

    Set an emoji representing the actor of the status.

    Parameters

    @@ -528,7 +526,7 @@

    Return Value

    - +
    SpanStatus
    @@ -541,10 +539,10 @@

    Return Value

    -

    -
    at line 74
    - Span - withInternal() +

    +
    at line 77
    + Status + withPassthrough()

    @@ -552,7 +550,7 @@

    -

    Returns a new span with the internal attribute set to true.

    +

    Hide the status itself, and reveal its children.

    @@ -560,7 +558,7 @@

    Return Value

    - +
    SpanStatus
    @@ -573,10 +571,10 @@

    Return Value

    -

    -
    at line 83
    - Span - withPassthrough() +

    +
    at line 88
    + Status + withReceivedMessage()

    @@ -584,7 +582,7 @@

    -

    Returns a new span with the passthrough attribute set to true.

    +

    Indicates that the status represents a received message.

    The message body must be sent as logs, so that it can be streamed. The name of the status is ignored.

    @@ -592,7 +590,7 @@

    Return Value

    - +
    SpanStatus
    @@ -606,8 +604,8 @@

    Return Value

    -
    at line 92
    - Span +
    at line 97
    + Status withReveal()

    @@ -616,7 +614,7 @@

    -

    Returns a new span with the reveal attribute set to true.

    +

    Ensure the status is visible without having to expand its parents.

    @@ -624,7 +622,7 @@

    Return Value

    - +
    SpanStatus
    diff --git a/docs/static/reference/php/Dagger/SpanId.html b/docs/static/reference/php/Dagger/StatusId.html similarity index 95% rename from docs/static/reference/php/Dagger/SpanId.html rename to docs/static/reference/php/Dagger/StatusId.html index f6afbbb69b2..e4aac99aeaa 100644 --- a/docs/static/reference/php/Dagger/SpanId.html +++ b/docs/static/reference/php/Dagger/StatusId.html @@ -3,7 +3,7 @@ - Dagger\SpanId | API + Dagger\StatusId | API @@ -19,7 +19,7 @@ - +
    @@ -75,18 +75,18 @@

    class - SpanId extends AbstractId + StatusId extends AbstractId

    @@ -94,7 +94,7 @@

    SpanId
    -

    The SpanID scalar type represents an identifier for an object of type Span.

    +

    The StatusID scalar type represents an identifier for an object of type Status.

    diff --git a/docs/static/reference/php/classes.html b/docs/static/reference/php/classes.html index f9f4873edad..75ba80b51d2 100644 --- a/docs/static/reference/php/classes.html +++ b/docs/static/reference/php/classes.html @@ -626,13 +626,13 @@

    Classes

    - Span
    -

    An OpenTelemetry span.

    + Status
    +

    A status indicator to show to the user.

    - SpanId
    -

    The SpanID scalar type represents an identifier for an object of type Span.

    + StatusId
    +

    The StatusID scalar type represents an identifier for an object of type Status.

    diff --git a/docs/static/reference/php/doc-index.html b/docs/static/reference/php/doc-index.html index 0b98a2b4256..49f00c38765 100644 --- a/docs/static/reference/php/doc-index.html +++ b/docs/static/reference/php/doc-index.html @@ -389,9 +389,9 @@

    A

    Port::experimentalSkipHealthcheck() — Method in class Port

    Skip the health check when run as a service.

    Service::endpoint() — Method in class Service
    -

    Retrieves an endpoint that clients can use to reach this container.

    -Span::end() — Method in class Span
    -

    End the OpenTelemetry span, with an optional error.

    F

    +

    Retrieves an endpoint that clients can use to reach this container.

    +Status::end() — Method in class Status
    +

    Mark the status as complete, with an optional error.

    F

    Client::file() — Method in class Client

    Creates a file with the specified contents.

    @@ -591,11 +591,11 @@

    A

    Socket::id
    () — Method in class Socket

    A unique identifier for this Socket.

    SourceMap::id() — Method in class SourceMap
    -

    A unique identifier for this SourceMap.

    -Span::id() — Method in class Span
    -

    A unique identifier for this Span.

    -Span::internalId() — Method in class Span
    -

    Returns the internal ID of the span.

    +

    A unique identifier for this SourceMap.

    +Status::id() — Method in class Status
    +

    A unique identifier for this Status.

    +Status::internalId() — Method in class Status
    +

    Returns the internal ID of the status.

    Terminal::id() — Method in class Terminal

    A unique identifier for this Terminal.

    TypeDef::id() — Method in class TypeDef
    @@ -698,9 +698,9 @@

    A

    Client::loadSocketFromID() — Method in class Client

    Load a Socket from its ID.

    Client::loadSourceMapFromID() — Method in class Client
    -

    Load a SourceMap from its ID.

    -Client::loadSpanFromID() — Method in class Client
    -

    Load a Span from its ID.

    +

    Load a SourceMap from its ID.

    +Client::loadStatusFromID() — Method in class Client
    +

    Load a Status from its ID.

    Client::loadTerminalFromID() — Method in class Client

    Load a Terminal from its ID.

    Client::loadTypeDefFromID() — Method in class Client
    @@ -804,9 +804,9 @@

    A

    ScalarTypeDef::name() — Method in class ScalarTypeDef

    The name of the scalar.

    Secret::name() — Method in class Secret
    -

    The name of this secret.

    -Span::name() — Method in class Span
    -

    The name of the span.

    O

    +

    The name of this secret.

    +Status::name() — Method in class Status
    +

    The display name of the status.

    O

    Env::output() — Method in class Env

    retrieve an output value by name

    @@ -859,7 +859,7 @@

    A

    ReturnsListOfTypeClass in namespace Dagger\Attribute
    Client::reveal() — Method in class Client
    -

    Returns a span that reveals its child spans and hides itself.

    +

    Returns a status that reveals its child statuses and hides itself.

    AbstractClient::runQuery() — Method in class AbstractClient
    Container::rootfs() — Method in class Container
    @@ -886,9 +886,9 @@

    A

    Client::setSecret() — Method in class Client

    Sets a secret given a user defined name to its plaintext and returns the secret.

    Client::sourceMap() — Method in class Client
    -

    Creates source map metadata.

    -Client::span() — Method in class Client
    -

    Create a new OpenTelemetry span.

    +

    Creates source map metadata.

    +Client::status() — Method in class Client
    +

    Create a new status indicator.

    QueryBuilder::setArgument() — Method in class QueryBuilder
    Container::stderr() — Method in class Container
    @@ -966,11 +966,11 @@

    A

    A Unix or TCP/IP socket that can be mounted into a container.

    SocketIdClass in namespace Dagger

    The SocketID scalar type represents an identifier for an object of type Socket.

    SourceMapClass in namespace Dagger

    Source location information.

    SourceMapIdClass in namespace Dagger
    -

    The SourceMapID scalar type represents an identifier for an object of type SourceMap.

    SpanClass in namespace Dagger
    -

    An OpenTelemetry span.

    -Span::start() — Method in class Span
    -

    Start a new instance of the span.

    SpanIdClass in namespace Dagger
    -

    The SpanID scalar type represents an identifier for an object of type Span.

    +

    The SourceMapID scalar type represents an identifier for an object of type SourceMap.

    StatusClass in namespace Dagger
    +

    A status indicator to show to the user.

    +Status::start() — Method in class Status
    +

    Start a new instance of the status.

    StatusIdClass in namespace Dagger
    +

    The StatusID scalar type represents an identifier for an object of type Status.

    Terminal::sync() — Method in class Terminal

    Forces evaluation of the pipeline in the engine.

    T

    @@ -1274,15 +1274,15 @@

    A

    ModuleSource::withoutDependencies
    () — Method in class ModuleSource

    Remove the provided dependencies from the module source's dependency list.

    Service::withHostname() — Method in class Service
    -

    Configures a hostname which can be used by clients within the session to reach this container.

    -Span::withActor() — Method in class Span
    -
    -Span::withInternal() — Method in class Span
    -

    Returns a new span with the internal attribute set to true.

    -Span::withPassthrough() — Method in class Span
    -

    Returns a new span with the passthrough attribute set to true.

    -Span::withReveal() — Method in class Span
    -

    Returns a new span with the reveal attribute set to true.

    +

    Configures a hostname which can be used by clients within the session to reach this container.

    +Status::withActorEmoji() — Method in class Status
    +

    Set an emoji representing the actor of the status.

    +Status::withPassthrough() — Method in class Status
    +

    Hide the status itself, and reveal its children.

    +Status::withReceivedMessage() — Method in class Status
    +

    Indicates that the status represents a received message.

    +Status::withReveal() — Method in class Status
    +

    Ensure the status is visible without having to expand its parents.

    TypeDef::withConstructor() — Method in class TypeDef

    Adds a function for constructing a new instance of an Object TypeDef, failing if the type is not an object.

    TypeDef::withEnum() — Method in class TypeDef
    diff --git a/docs/static/reference/php/doctum-search.json b/docs/static/reference/php/doctum-search.json index 36be2c03a9b..bb2ee4729dd 100644 --- a/docs/static/reference/php/doctum-search.json +++ b/docs/static/reference/php/doctum-search.json @@ -1098,9 +1098,9 @@ }, { "t": "C", - "n": "Dagger\\Span", - "p": "Dagger/Span.html", - "d": "

    An OpenTelemetry span.

    ", + "n": "Dagger\\Status", + "p": "Dagger/Status.html", + "d": "

    A status indicator to show to the user.

    ", "f": { "n": "Dagger", "p": "Dagger.html" @@ -1108,9 +1108,9 @@ }, { "t": "C", - "n": "Dagger\\SpanId", - "p": "Dagger/SpanId.html", - "d": "

    The SpanID scalar type represents an identifier for an object of type Span.

    ", + "n": "Dagger\\StatusId", + "p": "Dagger/StatusId.html", + "d": "

    The StatusID scalar type represents an identifier for an object of type Status.

    ", "f": { "n": "Dagger", "p": "Dagger.html" @@ -1713,9 +1713,9 @@ }, { "t": "M", - "n": "Dagger\\Client::loadSpanFromID", - "p": "Dagger/Client.html#method_loadSpanFromID", - "d": "

    Load a Span from its ID.

    " + "n": "Dagger\\Client::loadStatusFromID", + "p": "Dagger/Client.html#method_loadStatusFromID", + "d": "

    Load a Status from its ID.

    " }, { "t": "M", @@ -1745,7 +1745,7 @@ "t": "M", "n": "Dagger\\Client::reveal", "p": "Dagger/Client.html#method_reveal", - "d": "

    Returns a span that reveals its child spans and hides itself.

    " + "d": "

    Returns a status that reveals its child statuses and hides itself.

    " }, { "t": "M", @@ -1767,9 +1767,9 @@ }, { "t": "M", - "n": "Dagger\\Client::span", - "p": "Dagger/Client.html#method_span", - "d": "

    Create a new OpenTelemetry span.

    " + "n": "Dagger\\Client::status", + "p": "Dagger/Client.html#method_status", + "d": "

    Create a new status indicator.

    " }, { "t": "M", @@ -4221,57 +4221,57 @@ }, { "t": "M", - "n": "Dagger\\Span::end", - "p": "Dagger/Span.html#method_end", - "d": "

    End the OpenTelemetry span, with an optional error.

    " + "n": "Dagger\\Status::end", + "p": "Dagger/Status.html#method_end", + "d": "

    Mark the status as complete, with an optional error.

    " }, { "t": "M", - "n": "Dagger\\Span::id", - "p": "Dagger/Span.html#method_id", - "d": "

    A unique identifier for this Span.

    " + "n": "Dagger\\Status::id", + "p": "Dagger/Status.html#method_id", + "d": "

    A unique identifier for this Status.

    " }, { "t": "M", - "n": "Dagger\\Span::internalId", - "p": "Dagger/Span.html#method_internalId", - "d": "

    Returns the internal ID of the span.

    " + "n": "Dagger\\Status::internalId", + "p": "Dagger/Status.html#method_internalId", + "d": "

    Returns the internal ID of the status.

    " }, { "t": "M", - "n": "Dagger\\Span::name", - "p": "Dagger/Span.html#method_name", - "d": "

    The name of the span.

    " + "n": "Dagger\\Status::name", + "p": "Dagger/Status.html#method_name", + "d": "

    The display name of the status.

    " }, { "t": "M", - "n": "Dagger\\Span::start", - "p": "Dagger/Span.html#method_start", - "d": "

    Start a new instance of the span.

    " + "n": "Dagger\\Status::start", + "p": "Dagger/Status.html#method_start", + "d": "

    Start a new instance of the status.

    " }, { "t": "M", - "n": "Dagger\\Span::withActor", - "p": "Dagger/Span.html#method_withActor", - "d": null + "n": "Dagger\\Status::withActorEmoji", + "p": "Dagger/Status.html#method_withActorEmoji", + "d": "

    Set an emoji representing the actor of the status.

    " }, { "t": "M", - "n": "Dagger\\Span::withInternal", - "p": "Dagger/Span.html#method_withInternal", - "d": "

    Returns a new span with the internal attribute set to true.

    " + "n": "Dagger\\Status::withPassthrough", + "p": "Dagger/Status.html#method_withPassthrough", + "d": "

    Hide the status itself, and reveal its children.

    " }, { "t": "M", - "n": "Dagger\\Span::withPassthrough", - "p": "Dagger/Span.html#method_withPassthrough", - "d": "

    Returns a new span with the passthrough attribute set to true.

    " + "n": "Dagger\\Status::withReceivedMessage", + "p": "Dagger/Status.html#method_withReceivedMessage", + "d": "

    Indicates that the status represents a received message.

    " }, { "t": "M", - "n": "Dagger\\Span::withReveal", - "p": "Dagger/Span.html#method_withReveal", - "d": "

    Returns a new span with the reveal attribute set to true.

    " + "n": "Dagger\\Status::withReveal", + "p": "Dagger/Status.html#method_withReveal", + "d": "

    Ensure the status is visible without having to expand its parents.

    " }, { "t": "M", diff --git a/docs/static/reference/php/doctum.js b/docs/static/reference/php/doctum.js index 54b5efa7bbb..f1222f5e64a 100644 --- a/docs/static/reference/php/doctum.js +++ b/docs/static/reference/php/doctum.js @@ -1,5 +1,5 @@ var Doctum = { - treeJson: {"tree":{"l":0,"n":"","p":"","c":[{"l":1,"n":"Dagger","p":"Dagger","c":[{"l":2,"n":"Attribute","p":"Dagger/Attribute","c":[{"l":3,"n":"Argument","p":"Dagger/Attribute/Argument"},{"l":3,"n":"DaggerFunction","p":"Dagger/Attribute/DaggerFunction"},{"l":3,"n":"DaggerObject","p":"Dagger/Attribute/DaggerObject"},{"l":3,"n":"DefaultPath","p":"Dagger/Attribute/DefaultPath"},{"l":3,"n":"Doc","p":"Dagger/Attribute/Doc"},{"l":3,"n":"Ignore","p":"Dagger/Attribute/Ignore"},{"l":3,"n":"ListOfType","p":"Dagger/Attribute/ListOfType"},{"l":3,"n":"ReturnsListOfType","p":"Dagger/Attribute/ReturnsListOfType"}]},{"l":2,"n":"Client","p":"Dagger/Client","c":[{"l":3,"n":"AbstractClient","p":"Dagger/Client/AbstractClient"},{"l":3,"n":"AbstractId","p":"Dagger/Client/AbstractId"},{"l":3,"n":"AbstractInputObject","p":"Dagger/Client/AbstractInputObject"},{"l":3,"n":"AbstractObject","p":"Dagger/Client/AbstractObject"},{"l":3,"n":"AbstractScalar","p":"Dagger/Client/AbstractScalar"},{"l":3,"n":"IdAble","p":"Dagger/Client/IdAble"},{"l":3,"n":"QueryBuilder","p":"Dagger/Client/QueryBuilder"}]},{"l":2,"n":"Binding","p":"Dagger/Binding"},{"l":2,"n":"BindingId","p":"Dagger/BindingId"},{"l":2,"n":"BuildArg","p":"Dagger/BuildArg"},{"l":2,"n":"CacheVolume","p":"Dagger/CacheVolume"},{"l":2,"n":"CacheVolumeId","p":"Dagger/CacheVolumeId"},{"l":2,"n":"Client","p":"Dagger/Client"},{"l":2,"n":"Cloud","p":"Dagger/Cloud"},{"l":2,"n":"CloudId","p":"Dagger/CloudId"},{"l":2,"n":"Connection","p":"Dagger/Connection"},{"l":2,"n":"Container","p":"Dagger/Container"},{"l":2,"n":"ContainerId","p":"Dagger/ContainerId"},{"l":2,"n":"CurrentModule","p":"Dagger/CurrentModule"},{"l":2,"n":"CurrentModuleId","p":"Dagger/CurrentModuleId"},{"l":2,"n":"Dagger","p":"Dagger/Dagger"},{"l":2,"n":"Directory","p":"Dagger/Directory"},{"l":2,"n":"DirectoryId","p":"Dagger/DirectoryId"},{"l":2,"n":"Engine","p":"Dagger/Engine"},{"l":2,"n":"EngineCache","p":"Dagger/EngineCache"},{"l":2,"n":"EngineCacheEntry","p":"Dagger/EngineCacheEntry"},{"l":2,"n":"EngineCacheEntryId","p":"Dagger/EngineCacheEntryId"},{"l":2,"n":"EngineCacheEntrySet","p":"Dagger/EngineCacheEntrySet"},{"l":2,"n":"EngineCacheEntrySetId","p":"Dagger/EngineCacheEntrySetId"},{"l":2,"n":"EngineCacheId","p":"Dagger/EngineCacheId"},{"l":2,"n":"EngineId","p":"Dagger/EngineId"},{"l":2,"n":"EnumTypeDef","p":"Dagger/EnumTypeDef"},{"l":2,"n":"EnumTypeDefId","p":"Dagger/EnumTypeDefId"},{"l":2,"n":"EnumValueTypeDef","p":"Dagger/EnumValueTypeDef"},{"l":2,"n":"EnumValueTypeDefId","p":"Dagger/EnumValueTypeDefId"},{"l":2,"n":"Env","p":"Dagger/Env"},{"l":2,"n":"EnvId","p":"Dagger/EnvId"},{"l":2,"n":"EnvVariable","p":"Dagger/EnvVariable"},{"l":2,"n":"EnvVariableId","p":"Dagger/EnvVariableId"},{"l":2,"n":"Error","p":"Dagger/Error"},{"l":2,"n":"ErrorId","p":"Dagger/ErrorId"},{"l":2,"n":"ErrorValue","p":"Dagger/ErrorValue"},{"l":2,"n":"ErrorValueId","p":"Dagger/ErrorValueId"},{"l":2,"n":"FieldTypeDef","p":"Dagger/FieldTypeDef"},{"l":2,"n":"FieldTypeDefId","p":"Dagger/FieldTypeDefId"},{"l":2,"n":"File","p":"Dagger/File"},{"l":2,"n":"FileId","p":"Dagger/FileId"},{"l":2,"n":"FunctionArg","p":"Dagger/FunctionArg"},{"l":2,"n":"FunctionArgId","p":"Dagger/FunctionArgId"},{"l":2,"n":"FunctionCall","p":"Dagger/FunctionCall"},{"l":2,"n":"FunctionCallArgValue","p":"Dagger/FunctionCallArgValue"},{"l":2,"n":"FunctionCallArgValueId","p":"Dagger/FunctionCallArgValueId"},{"l":2,"n":"FunctionCallId","p":"Dagger/FunctionCallId"},{"l":2,"n":"FunctionId","p":"Dagger/FunctionId"},{"l":2,"n":"Function_","p":"Dagger/Function_"},{"l":2,"n":"GeneratedCode","p":"Dagger/GeneratedCode"},{"l":2,"n":"GeneratedCodeId","p":"Dagger/GeneratedCodeId"},{"l":2,"n":"GitRef","p":"Dagger/GitRef"},{"l":2,"n":"GitRefId","p":"Dagger/GitRefId"},{"l":2,"n":"GitRepository","p":"Dagger/GitRepository"},{"l":2,"n":"GitRepositoryId","p":"Dagger/GitRepositoryId"},{"l":2,"n":"Host","p":"Dagger/Host"},{"l":2,"n":"HostId","p":"Dagger/HostId"},{"l":2,"n":"InputTypeDef","p":"Dagger/InputTypeDef"},{"l":2,"n":"InputTypeDefId","p":"Dagger/InputTypeDefId"},{"l":2,"n":"InterfaceTypeDef","p":"Dagger/InterfaceTypeDef"},{"l":2,"n":"InterfaceTypeDefId","p":"Dagger/InterfaceTypeDefId"},{"l":2,"n":"Json","p":"Dagger/Json"},{"l":2,"n":"LLM","p":"Dagger/LLM"},{"l":2,"n":"LLMId","p":"Dagger/LLMId"},{"l":2,"n":"LLMTokenUsage","p":"Dagger/LLMTokenUsage"},{"l":2,"n":"LLMTokenUsageId","p":"Dagger/LLMTokenUsageId"},{"l":2,"n":"Label","p":"Dagger/Label"},{"l":2,"n":"LabelId","p":"Dagger/LabelId"},{"l":2,"n":"ListTypeDef","p":"Dagger/ListTypeDef"},{"l":2,"n":"ListTypeDefId","p":"Dagger/ListTypeDefId"},{"l":2,"n":"Module","p":"Dagger/Module"},{"l":2,"n":"ModuleConfigClient","p":"Dagger/ModuleConfigClient"},{"l":2,"n":"ModuleConfigClientId","p":"Dagger/ModuleConfigClientId"},{"l":2,"n":"ModuleId","p":"Dagger/ModuleId"},{"l":2,"n":"ModuleSource","p":"Dagger/ModuleSource"},{"l":2,"n":"ModuleSourceId","p":"Dagger/ModuleSourceId"},{"l":2,"n":"ObjectTypeDef","p":"Dagger/ObjectTypeDef"},{"l":2,"n":"ObjectTypeDefId","p":"Dagger/ObjectTypeDefId"},{"l":2,"n":"PipelineLabel","p":"Dagger/PipelineLabel"},{"l":2,"n":"Platform","p":"Dagger/Platform"},{"l":2,"n":"Port","p":"Dagger/Port"},{"l":2,"n":"PortForward","p":"Dagger/PortForward"},{"l":2,"n":"PortId","p":"Dagger/PortId"},{"l":2,"n":"SDKConfig","p":"Dagger/SDKConfig"},{"l":2,"n":"SDKConfigId","p":"Dagger/SDKConfigId"},{"l":2,"n":"ScalarTypeDef","p":"Dagger/ScalarTypeDef"},{"l":2,"n":"ScalarTypeDefId","p":"Dagger/ScalarTypeDefId"},{"l":2,"n":"Secret","p":"Dagger/Secret"},{"l":2,"n":"SecretId","p":"Dagger/SecretId"},{"l":2,"n":"Service","p":"Dagger/Service"},{"l":2,"n":"ServiceId","p":"Dagger/ServiceId"},{"l":2,"n":"Socket","p":"Dagger/Socket"},{"l":2,"n":"SocketId","p":"Dagger/SocketId"},{"l":2,"n":"SourceMap","p":"Dagger/SourceMap"},{"l":2,"n":"SourceMapId","p":"Dagger/SourceMapId"},{"l":2,"n":"Span","p":"Dagger/Span"},{"l":2,"n":"SpanId","p":"Dagger/SpanId"},{"l":2,"n":"Terminal","p":"Dagger/Terminal"},{"l":2,"n":"TerminalId","p":"Dagger/TerminalId"},{"l":2,"n":"TypeDef","p":"Dagger/TypeDef"},{"l":2,"n":"TypeDefId","p":"Dagger/TypeDefId"}]}]},"treeOpenLevel":2}, + treeJson: {"tree":{"l":0,"n":"","p":"","c":[{"l":1,"n":"Dagger","p":"Dagger","c":[{"l":2,"n":"Attribute","p":"Dagger/Attribute","c":[{"l":3,"n":"Argument","p":"Dagger/Attribute/Argument"},{"l":3,"n":"DaggerFunction","p":"Dagger/Attribute/DaggerFunction"},{"l":3,"n":"DaggerObject","p":"Dagger/Attribute/DaggerObject"},{"l":3,"n":"DefaultPath","p":"Dagger/Attribute/DefaultPath"},{"l":3,"n":"Doc","p":"Dagger/Attribute/Doc"},{"l":3,"n":"Ignore","p":"Dagger/Attribute/Ignore"},{"l":3,"n":"ListOfType","p":"Dagger/Attribute/ListOfType"},{"l":3,"n":"ReturnsListOfType","p":"Dagger/Attribute/ReturnsListOfType"}]},{"l":2,"n":"Client","p":"Dagger/Client","c":[{"l":3,"n":"AbstractClient","p":"Dagger/Client/AbstractClient"},{"l":3,"n":"AbstractId","p":"Dagger/Client/AbstractId"},{"l":3,"n":"AbstractInputObject","p":"Dagger/Client/AbstractInputObject"},{"l":3,"n":"AbstractObject","p":"Dagger/Client/AbstractObject"},{"l":3,"n":"AbstractScalar","p":"Dagger/Client/AbstractScalar"},{"l":3,"n":"IdAble","p":"Dagger/Client/IdAble"},{"l":3,"n":"QueryBuilder","p":"Dagger/Client/QueryBuilder"}]},{"l":2,"n":"Binding","p":"Dagger/Binding"},{"l":2,"n":"BindingId","p":"Dagger/BindingId"},{"l":2,"n":"BuildArg","p":"Dagger/BuildArg"},{"l":2,"n":"CacheVolume","p":"Dagger/CacheVolume"},{"l":2,"n":"CacheVolumeId","p":"Dagger/CacheVolumeId"},{"l":2,"n":"Client","p":"Dagger/Client"},{"l":2,"n":"Cloud","p":"Dagger/Cloud"},{"l":2,"n":"CloudId","p":"Dagger/CloudId"},{"l":2,"n":"Connection","p":"Dagger/Connection"},{"l":2,"n":"Container","p":"Dagger/Container"},{"l":2,"n":"ContainerId","p":"Dagger/ContainerId"},{"l":2,"n":"CurrentModule","p":"Dagger/CurrentModule"},{"l":2,"n":"CurrentModuleId","p":"Dagger/CurrentModuleId"},{"l":2,"n":"Dagger","p":"Dagger/Dagger"},{"l":2,"n":"Directory","p":"Dagger/Directory"},{"l":2,"n":"DirectoryId","p":"Dagger/DirectoryId"},{"l":2,"n":"Engine","p":"Dagger/Engine"},{"l":2,"n":"EngineCache","p":"Dagger/EngineCache"},{"l":2,"n":"EngineCacheEntry","p":"Dagger/EngineCacheEntry"},{"l":2,"n":"EngineCacheEntryId","p":"Dagger/EngineCacheEntryId"},{"l":2,"n":"EngineCacheEntrySet","p":"Dagger/EngineCacheEntrySet"},{"l":2,"n":"EngineCacheEntrySetId","p":"Dagger/EngineCacheEntrySetId"},{"l":2,"n":"EngineCacheId","p":"Dagger/EngineCacheId"},{"l":2,"n":"EngineId","p":"Dagger/EngineId"},{"l":2,"n":"EnumTypeDef","p":"Dagger/EnumTypeDef"},{"l":2,"n":"EnumTypeDefId","p":"Dagger/EnumTypeDefId"},{"l":2,"n":"EnumValueTypeDef","p":"Dagger/EnumValueTypeDef"},{"l":2,"n":"EnumValueTypeDefId","p":"Dagger/EnumValueTypeDefId"},{"l":2,"n":"Env","p":"Dagger/Env"},{"l":2,"n":"EnvId","p":"Dagger/EnvId"},{"l":2,"n":"EnvVariable","p":"Dagger/EnvVariable"},{"l":2,"n":"EnvVariableId","p":"Dagger/EnvVariableId"},{"l":2,"n":"Error","p":"Dagger/Error"},{"l":2,"n":"ErrorId","p":"Dagger/ErrorId"},{"l":2,"n":"ErrorValue","p":"Dagger/ErrorValue"},{"l":2,"n":"ErrorValueId","p":"Dagger/ErrorValueId"},{"l":2,"n":"FieldTypeDef","p":"Dagger/FieldTypeDef"},{"l":2,"n":"FieldTypeDefId","p":"Dagger/FieldTypeDefId"},{"l":2,"n":"File","p":"Dagger/File"},{"l":2,"n":"FileId","p":"Dagger/FileId"},{"l":2,"n":"FunctionArg","p":"Dagger/FunctionArg"},{"l":2,"n":"FunctionArgId","p":"Dagger/FunctionArgId"},{"l":2,"n":"FunctionCall","p":"Dagger/FunctionCall"},{"l":2,"n":"FunctionCallArgValue","p":"Dagger/FunctionCallArgValue"},{"l":2,"n":"FunctionCallArgValueId","p":"Dagger/FunctionCallArgValueId"},{"l":2,"n":"FunctionCallId","p":"Dagger/FunctionCallId"},{"l":2,"n":"FunctionId","p":"Dagger/FunctionId"},{"l":2,"n":"Function_","p":"Dagger/Function_"},{"l":2,"n":"GeneratedCode","p":"Dagger/GeneratedCode"},{"l":2,"n":"GeneratedCodeId","p":"Dagger/GeneratedCodeId"},{"l":2,"n":"GitRef","p":"Dagger/GitRef"},{"l":2,"n":"GitRefId","p":"Dagger/GitRefId"},{"l":2,"n":"GitRepository","p":"Dagger/GitRepository"},{"l":2,"n":"GitRepositoryId","p":"Dagger/GitRepositoryId"},{"l":2,"n":"Host","p":"Dagger/Host"},{"l":2,"n":"HostId","p":"Dagger/HostId"},{"l":2,"n":"InputTypeDef","p":"Dagger/InputTypeDef"},{"l":2,"n":"InputTypeDefId","p":"Dagger/InputTypeDefId"},{"l":2,"n":"InterfaceTypeDef","p":"Dagger/InterfaceTypeDef"},{"l":2,"n":"InterfaceTypeDefId","p":"Dagger/InterfaceTypeDefId"},{"l":2,"n":"Json","p":"Dagger/Json"},{"l":2,"n":"LLM","p":"Dagger/LLM"},{"l":2,"n":"LLMId","p":"Dagger/LLMId"},{"l":2,"n":"LLMTokenUsage","p":"Dagger/LLMTokenUsage"},{"l":2,"n":"LLMTokenUsageId","p":"Dagger/LLMTokenUsageId"},{"l":2,"n":"Label","p":"Dagger/Label"},{"l":2,"n":"LabelId","p":"Dagger/LabelId"},{"l":2,"n":"ListTypeDef","p":"Dagger/ListTypeDef"},{"l":2,"n":"ListTypeDefId","p":"Dagger/ListTypeDefId"},{"l":2,"n":"Module","p":"Dagger/Module"},{"l":2,"n":"ModuleConfigClient","p":"Dagger/ModuleConfigClient"},{"l":2,"n":"ModuleConfigClientId","p":"Dagger/ModuleConfigClientId"},{"l":2,"n":"ModuleId","p":"Dagger/ModuleId"},{"l":2,"n":"ModuleSource","p":"Dagger/ModuleSource"},{"l":2,"n":"ModuleSourceId","p":"Dagger/ModuleSourceId"},{"l":2,"n":"ObjectTypeDef","p":"Dagger/ObjectTypeDef"},{"l":2,"n":"ObjectTypeDefId","p":"Dagger/ObjectTypeDefId"},{"l":2,"n":"PipelineLabel","p":"Dagger/PipelineLabel"},{"l":2,"n":"Platform","p":"Dagger/Platform"},{"l":2,"n":"Port","p":"Dagger/Port"},{"l":2,"n":"PortForward","p":"Dagger/PortForward"},{"l":2,"n":"PortId","p":"Dagger/PortId"},{"l":2,"n":"SDKConfig","p":"Dagger/SDKConfig"},{"l":2,"n":"SDKConfigId","p":"Dagger/SDKConfigId"},{"l":2,"n":"ScalarTypeDef","p":"Dagger/ScalarTypeDef"},{"l":2,"n":"ScalarTypeDefId","p":"Dagger/ScalarTypeDefId"},{"l":2,"n":"Secret","p":"Dagger/Secret"},{"l":2,"n":"SecretId","p":"Dagger/SecretId"},{"l":2,"n":"Service","p":"Dagger/Service"},{"l":2,"n":"ServiceId","p":"Dagger/ServiceId"},{"l":2,"n":"Socket","p":"Dagger/Socket"},{"l":2,"n":"SocketId","p":"Dagger/SocketId"},{"l":2,"n":"SourceMap","p":"Dagger/SourceMap"},{"l":2,"n":"SourceMapId","p":"Dagger/SourceMapId"},{"l":2,"n":"Status","p":"Dagger/Status"},{"l":2,"n":"StatusId","p":"Dagger/StatusId"},{"l":2,"n":"Terminal","p":"Dagger/Terminal"},{"l":2,"n":"TerminalId","p":"Dagger/TerminalId"},{"l":2,"n":"TypeDef","p":"Dagger/TypeDef"},{"l":2,"n":"TypeDefId","p":"Dagger/TypeDefId"}]}]},"treeOpenLevel":2}, /** @var boolean */ treeLoaded: false, /** @var boolean */ diff --git a/sdk/elixir/lib/dagger/gen/status.ex b/sdk/elixir/lib/dagger/gen/status.ex index 61100cd0501..8a74e101c0e 100644 --- a/sdk/elixir/lib/dagger/gen/status.ex +++ b/sdk/elixir/lib/dagger/gen/status.ex @@ -82,10 +82,13 @@ defmodule Dagger.Status do end end - @spec with_actor(t(), String.t()) :: Dagger.Status.t() - def with_actor(%__MODULE__{} = status, actor) do + @doc """ + Set an emoji representing the actor of the status. + """ + @spec with_actor_emoji(t(), String.t()) :: Dagger.Status.t() + def with_actor_emoji(%__MODULE__{} = status, actor) do query_builder = - status.query_builder |> QB.select("withActor") |> QB.put_arg("actor", actor) + status.query_builder |> QB.select("withActorEmoji") |> QB.put_arg("actor", actor) %Dagger.Status{ query_builder: query_builder, @@ -94,12 +97,12 @@ defmodule Dagger.Status do end @doc """ - Returns a new status with the internal attribute set to true. + Hide the status itself, and reveal its children. """ - @spec with_internal(t()) :: Dagger.Status.t() - def with_internal(%__MODULE__{} = status) do + @spec with_passthrough(t()) :: Dagger.Status.t() + def with_passthrough(%__MODULE__{} = status) do query_builder = - status.query_builder |> QB.select("withInternal") + status.query_builder |> QB.select("withPassthrough") %Dagger.Status{ query_builder: query_builder, @@ -108,12 +111,14 @@ defmodule Dagger.Status do end @doc """ - Returns a new status with the passthrough attribute set to true. + Indicates that the status represents a received message. + + The message body must be sent as logs, so that it can be streamed. The name of the status is ignored. """ - @spec with_passthrough(t()) :: Dagger.Status.t() - def with_passthrough(%__MODULE__{} = status) do + @spec with_received_message(t()) :: Dagger.Status.t() + def with_received_message(%__MODULE__{} = status) do query_builder = - status.query_builder |> QB.select("withPassthrough") + status.query_builder |> QB.select("withReceivedMessage") %Dagger.Status{ query_builder: query_builder, @@ -122,7 +127,7 @@ defmodule Dagger.Status do end @doc """ - Returns a new status with the reveal attribute set to true. + Ensure the status is visible without having to expand its parents. """ @spec with_reveal(t()) :: Dagger.Status.t() def with_reveal(%__MODULE__{} = status) do diff --git a/sdk/go/dagger.gen.go b/sdk/go/dagger.gen.go index 607ba2c632d..24972b5772f 100644 --- a/sdk/go/dagger.gen.go +++ b/sdk/go/dagger.gen.go @@ -10289,8 +10289,9 @@ func (r *Status) Start(ctx context.Context) (*Status, error) { }, nil } -func (r *Status) WithActor(actor string) *Status { - q := r.query.Select("withActor") +// Set an emoji representing the actor of the status. +func (r *Status) WithActorEmoji(actor string) *Status { + q := r.query.Select("withActorEmoji") q = q.Arg("actor", actor) return &Status{ @@ -10299,9 +10300,9 @@ func (r *Status) WithActor(actor string) *Status { } } -// Returns a new status with the internal attribute set to true. -func (r *Status) WithInternal() *Status { - q := r.query.Select("withInternal") +// Hide the status itself, and reveal its children. +func (r *Status) WithPassthrough() *Status { + q := r.query.Select("withPassthrough") return &Status{ query: q, @@ -10309,9 +10310,11 @@ func (r *Status) WithInternal() *Status { } } -// Returns a new status with the passthrough attribute set to true. -func (r *Status) WithPassthrough() *Status { - q := r.query.Select("withPassthrough") +// Indicates that the status represents a received message. +// +// The message body must be sent as logs, so that it can be streamed. The name of the status is ignored. +func (r *Status) WithReceivedMessage() *Status { + q := r.query.Select("withReceivedMessage") return &Status{ query: q, @@ -10319,7 +10322,7 @@ func (r *Status) WithPassthrough() *Status { } } -// Returns a new status with the reveal attribute set to true. +// Ensure the status is visible without having to expand its parents. func (r *Status) WithReveal() *Status { q := r.query.Select("withReveal") diff --git a/sdk/php/generated/Status.php b/sdk/php/generated/Status.php index f339239b284..f9f564e6c3e 100644 --- a/sdk/php/generated/Status.php +++ b/sdk/php/generated/Status.php @@ -61,33 +61,38 @@ public function start(): StatusId return new \Dagger\StatusId((string)$this->queryLeaf($leafQueryBuilder, 'start')); } - public function withActor(string $actor): Status + /** + * Set an emoji representing the actor of the status. + */ + public function withActorEmoji(string $actor): Status { - $innerQueryBuilder = new \Dagger\Client\QueryBuilder('withActor'); + $innerQueryBuilder = new \Dagger\Client\QueryBuilder('withActorEmoji'); $innerQueryBuilder->setArgument('actor', $actor); return new \Dagger\Status($this->client, $this->queryBuilderChain->chain($innerQueryBuilder)); } /** - * Returns a new status with the internal attribute set to true. + * Hide the status itself, and reveal its children. */ - public function withInternal(): Status + public function withPassthrough(): Status { - $innerQueryBuilder = new \Dagger\Client\QueryBuilder('withInternal'); + $innerQueryBuilder = new \Dagger\Client\QueryBuilder('withPassthrough'); return new \Dagger\Status($this->client, $this->queryBuilderChain->chain($innerQueryBuilder)); } /** - * Returns a new status with the passthrough attribute set to true. + * Indicates that the status represents a received message. + * + * The message body must be sent as logs, so that it can be streamed. The name of the status is ignored. */ - public function withPassthrough(): Status + public function withReceivedMessage(): Status { - $innerQueryBuilder = new \Dagger\Client\QueryBuilder('withPassthrough'); + $innerQueryBuilder = new \Dagger\Client\QueryBuilder('withReceivedMessage'); return new \Dagger\Status($this->client, $this->queryBuilderChain->chain($innerQueryBuilder)); } /** - * Returns a new status with the reveal attribute set to true. + * Ensure the status is visible without having to expand its parents. */ public function withReveal(): Status { diff --git a/sdk/python/src/dagger/client/gen.py b/sdk/python/src/dagger/client/gen.py index d1e4a411e09..5c525e1b1ed 100644 --- a/sdk/python/src/dagger/client/gen.py +++ b/sdk/python/src/dagger/client/gen.py @@ -9822,27 +9822,32 @@ async def start(self) -> Self: _args: list[Arg] = [] return await self._ctx.execute_sync(self, "start", _args) - def with_actor(self, actor: str) -> Self: + def with_actor_emoji(self, actor: str) -> Self: + """Set an emoji representing the actor of the status.""" _args = [ Arg("actor", actor), ] - _ctx = self._select("withActor", _args) + _ctx = self._select("withActorEmoji", _args) return Status(_ctx) - def with_internal(self) -> Self: - """Returns a new status with the internal attribute set to true.""" + def with_passthrough(self) -> Self: + """Hide the status itself, and reveal its children.""" _args: list[Arg] = [] - _ctx = self._select("withInternal", _args) + _ctx = self._select("withPassthrough", _args) return Status(_ctx) - def with_passthrough(self) -> Self: - """Returns a new status with the passthrough attribute set to true.""" + def with_received_message(self) -> Self: + """Indicates that the status represents a received message. + + The message body must be sent as logs, so that it can be streamed. The + name of the status is ignored. + """ _args: list[Arg] = [] - _ctx = self._select("withPassthrough", _args) + _ctx = self._select("withReceivedMessage", _args) return Status(_ctx) def with_reveal(self) -> Self: - """Returns a new status with the reveal attribute set to true.""" + """Ensure the status is visible without having to expand its parents.""" _args: list[Arg] = [] _ctx = self._select("withReveal", _args) return Status(_ctx) diff --git a/sdk/rust/crates/dagger-sdk/src/gen.rs b/sdk/rust/crates/dagger-sdk/src/gen.rs index a2561692b9d..b9483d1ac54 100644 --- a/sdk/rust/crates/dagger-sdk/src/gen.rs +++ b/sdk/rust/crates/dagger-sdk/src/gen.rs @@ -10087,8 +10087,9 @@ impl Status { let query = self.selection.select("start"); query.execute(self.graphql_client.clone()).await } - pub fn with_actor(&self, actor: impl Into) -> Status { - let mut query = self.selection.select("withActor"); + /// Set an emoji representing the actor of the status. + pub fn with_actor_emoji(&self, actor: impl Into) -> Status { + let mut query = self.selection.select("withActorEmoji"); query = query.arg("actor", actor.into()); Status { proc: self.proc.clone(), @@ -10096,25 +10097,26 @@ impl Status { graphql_client: self.graphql_client.clone(), } } - /// Returns a new status with the internal attribute set to true. - pub fn with_internal(&self) -> Status { - let query = self.selection.select("withInternal"); + /// Hide the status itself, and reveal its children. + pub fn with_passthrough(&self) -> Status { + let query = self.selection.select("withPassthrough"); Status { proc: self.proc.clone(), selection: query, graphql_client: self.graphql_client.clone(), } } - /// Returns a new status with the passthrough attribute set to true. - pub fn with_passthrough(&self) -> Status { - let query = self.selection.select("withPassthrough"); + /// Indicates that the status represents a received message. + /// The message body must be sent as logs, so that it can be streamed. The name of the status is ignored. + pub fn with_received_message(&self) -> Status { + let query = self.selection.select("withReceivedMessage"); Status { proc: self.proc.clone(), selection: query, graphql_client: self.graphql_client.clone(), } } - /// Returns a new status with the reveal attribute set to true. + /// Ensure the status is visible without having to expand its parents. pub fn with_reveal(&self) -> Status { let query = self.selection.select("withReveal"); Status { diff --git a/sdk/typescript/src/api/client.gen.ts b/sdk/typescript/src/api/client.gen.ts index dd28618fc18..de9fc60c622 100644 --- a/sdk/typescript/src/api/client.gen.ts +++ b/sdk/typescript/src/api/client.gen.ts @@ -9129,21 +9129,17 @@ export class Status extends BaseClient { return new Client(ctx.copy()).loadStatusFromID(response) } - withActor = (actor: string): Status => { - const ctx = this._ctx.select("withActor", { actor }) - return new Status(ctx) - } /** - * Returns a new status with the internal attribute set to true. + * Set an emoji representing the actor of the status. */ - withInternal = (): Status => { - const ctx = this._ctx.select("withInternal") + withActorEmoji = (actor: string): Status => { + const ctx = this._ctx.select("withActorEmoji", { actor }) return new Status(ctx) } /** - * Returns a new status with the passthrough attribute set to true. + * Hide the status itself, and reveal its children. */ withPassthrough = (): Status => { const ctx = this._ctx.select("withPassthrough") @@ -9151,7 +9147,17 @@ export class Status extends BaseClient { } /** - * Returns a new status with the reveal attribute set to true. + * Indicates that the status represents a received message. + * + * The message body must be sent as logs, so that it can be streamed. The name of the status is ignored. + */ + withReceivedMessage = (): Status => { + const ctx = this._ctx.select("withReceivedMessage") + return new Status(ctx) + } + + /** + * Ensure the status is visible without having to expand its parents. */ withReveal = (): Status => { const ctx = this._ctx.select("withReveal") From 8f6a416bf9ae659d4bf9d6146c17129fbed94cdf Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Fri, 27 Jun 2025 00:49:07 -0400 Subject: [PATCH 32/36] add Status.display helper Signed-off-by: Alex Suraci --- core/schema/query.go | 19 +++++++++++++++++++ core/status.go | 7 +++++++ 2 files changed, 26 insertions(+) diff --git a/core/schema/query.go b/core/schema/query.go index db395f2aa5d..511f879dc42 100644 --- a/core/schema/query.go +++ b/core/schema/query.go @@ -102,6 +102,9 @@ func (s *querySchema) Install() { dagql.NodeFuncWithCacheKey("start", s.statusStart, dagql.CachePerCall). Doc(`Start a new instance of the status.`), + dagql.NodeFuncWithCacheKey("display", s.statusDisplay, dagql.CachePerCall). + Doc(`Start and immediately finish the status, so that it just gets displayed to the user.`), + dagql.Func("end", s.statusEnd). Doc(`Mark the status as complete, with an optional error.`), }.Install(s.srv) @@ -232,6 +235,22 @@ func (s *querySchema) statusStart(ctx context.Context, parent dagql.Instance[*co return dagql.NewID[*core.Status](inst.ID()), nil } +func (s *querySchema) statusDisplay(ctx context.Context, parent dagql.Instance[*core.Status], args struct{}) (dagql.ID[*core.Status], error) { + started := parent.Self.Display(ctx) + var inst dagql.Instance[*core.Status] + err := s.srv.Select(ctx, s.srv.Root(), &inst, dagql.Selector{ + Field: "status", + Args: []dagql.NamedInput{ + {Name: "name", Value: dagql.NewString(started.Name)}, + {Name: "key", Value: dagql.NewString(started.InternalID())}, + }, + }) + if err != nil { + return dagql.ID[*core.Status]{}, err + } + return dagql.NewID[*core.Status](inst.ID()), nil +} + func (s *querySchema) statusEnd(ctx context.Context, parent *core.Status, args struct { Error dagql.Optional[dagql.ID[*core.Error]] }) (dagql.Nullable[core.Void], error) { diff --git a/core/status.go b/core/status.go index 4d98d33aea2..846a0e45897 100644 --- a/core/status.go +++ b/core/status.go @@ -63,6 +63,13 @@ func (s *Status) WithReveal() *Status { return cp } +func (s *Status) Display(ctx context.Context) *Status { + status := s.Start(ctx) + // UNSET should be ok, it's not like failure is even possible + status.Span.End() + return status +} + func (s *Status) Start(ctx context.Context) *Status { return s.Query.StartSpan(ctx, s) } From ee482201de234192f060663c351e1974bb2ae02c Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Fri, 27 Jun 2025 00:49:19 -0400 Subject: [PATCH 33/36] regen Signed-off-by: Alex Suraci --- docs/docs-graphql/schema.graphqls | 5 +++++ docs/static/api/reference/index.html | 4 ++++ sdk/elixir/lib/dagger/gen/status.ex | 20 ++++++++++++++++++++ sdk/go/dagger.gen.go | 14 ++++++++++++++ sdk/php/generated/Status.php | 9 +++++++++ sdk/python/src/dagger/client/gen.py | 14 ++++++++++++++ sdk/rust/crates/dagger-sdk/src/gen.rs | 5 +++++ sdk/typescript/src/api/client.gen.ts | 14 ++++++++++++++ 8 files changed, 85 insertions(+) diff --git a/docs/docs-graphql/schema.graphqls b/docs/docs-graphql/schema.graphqls index ee62dcff339..cdac132fabb 100644 --- a/docs/docs-graphql/schema.graphqls +++ b/docs/docs-graphql/schema.graphqls @@ -3824,6 +3824,11 @@ scalar SourceMapID """A status indicator to show to the user.""" type Status { + """ + Start and immediately finish the status, so that it just gets displayed to the user. + """ + display: StatusID! + """Mark the status as complete, with an optional error.""" end(error: ErrorID): Void diff --git a/docs/static/api/reference/index.html b/docs/static/api/reference/index.html index 09548623782..9ce574ebb31 100644 --- a/docs/static/api/reference/index.html +++ b/docs/static/api/reference/index.html @@ -11096,6 +11096,10 @@
    Fields
    + + display - StatusID! + Start and immediately finish the status, so that it just gets displayed to the user. + end - Void Mark the status as complete, with an optional error. diff --git a/sdk/elixir/lib/dagger/gen/status.ex b/sdk/elixir/lib/dagger/gen/status.ex index 8a74e101c0e..a015dfa05c9 100644 --- a/sdk/elixir/lib/dagger/gen/status.ex +++ b/sdk/elixir/lib/dagger/gen/status.ex @@ -15,6 +15,26 @@ defmodule Dagger.Status do @type t() :: %__MODULE__{} + @doc """ + Start and immediately finish the status, so that it just gets displayed to the user. + """ + @spec display(t()) :: {:ok, Dagger.Status.t()} | {:error, term()} + def display(%__MODULE__{} = status) do + query_builder = + status.query_builder |> QB.select("display") + + with {:ok, id} <- Client.execute(status.client, query_builder) do + {:ok, + %Dagger.Status{ + query_builder: + QB.query() + |> QB.select("loadStatusFromID") + |> QB.put_arg("id", id), + client: status.client + }} + end + end + @doc """ Mark the status as complete, with an optional error. """ diff --git a/sdk/go/dagger.gen.go b/sdk/go/dagger.gen.go index 24972b5772f..aaad031b648 100644 --- a/sdk/go/dagger.gen.go +++ b/sdk/go/dagger.gen.go @@ -10128,6 +10128,7 @@ type Status struct { query *querybuilder.Selection client graphql.Client + display *StatusID end *Void id *StatusID internalId *string @@ -10189,6 +10190,19 @@ func (r *Status) Run(ctx context.Context, cb func(context.Context) error) error return errors.Join(err, endErr) } +// Start and immediately finish the status, so that it just gets displayed to the user. +func (r *Status) Display(ctx context.Context) (*Status, error) { + q := r.query.Select("display") + + var id StatusID + if err := q.Bind(&id).Execute(ctx); err != nil { + return nil, err + } + return &Status{ + query: q.Root().Select("loadStatusFromID").Arg("id", id), + }, nil +} + // StatusEndOpts contains options for Status.End type StatusEndOpts struct { Error *Error diff --git a/sdk/php/generated/Status.php b/sdk/php/generated/Status.php index f9f564e6c3e..1db23b5fa9b 100644 --- a/sdk/php/generated/Status.php +++ b/sdk/php/generated/Status.php @@ -13,6 +13,15 @@ */ class Status extends Client\AbstractObject implements Client\IdAble { + /** + * Start and immediately finish the status, so that it just gets displayed to the user. + */ + public function display(): StatusId + { + $leafQueryBuilder = new \Dagger\Client\QueryBuilder('display'); + return new \Dagger\StatusId((string)$this->queryLeaf($leafQueryBuilder, 'display')); + } + /** * Mark the status as complete, with an optional error. */ diff --git a/sdk/python/src/dagger/client/gen.py b/sdk/python/src/dagger/client/gen.py index 5c525e1b1ed..dc92e0873ce 100644 --- a/sdk/python/src/dagger/client/gen.py +++ b/sdk/python/src/dagger/client/gen.py @@ -9721,6 +9721,20 @@ async def module(self) -> str: class Status(Type): """A status indicator to show to the user.""" + async def display(self) -> Self: + """Start and immediately finish the status, so that it just gets + displayed to the user. + + Raises + ------ + ExecuteTimeoutError + If the time to execute the query exceeds the configured timeout. + QueryError + If the API returns an error. + """ + _args: list[Arg] = [] + return await self._ctx.execute_sync(self, "display", _args) + async def end(self, *, error: Error | None = None) -> Void | None: """Mark the status as complete, with an optional error. diff --git a/sdk/rust/crates/dagger-sdk/src/gen.rs b/sdk/rust/crates/dagger-sdk/src/gen.rs index b9483d1ac54..3cc6d33cdda 100644 --- a/sdk/rust/crates/dagger-sdk/src/gen.rs +++ b/sdk/rust/crates/dagger-sdk/src/gen.rs @@ -10046,6 +10046,11 @@ pub struct StatusEndOpts { pub error: Option, } impl Status { + /// Start and immediately finish the status, so that it just gets displayed to the user. + pub async fn display(&self) -> Result { + let query = self.selection.select("display"); + query.execute(self.graphql_client.clone()).await + } /// Mark the status as complete, with an optional error. /// /// # Arguments diff --git a/sdk/typescript/src/api/client.gen.ts b/sdk/typescript/src/api/client.gen.ts index de9fc60c622..fde4f75bef0 100644 --- a/sdk/typescript/src/api/client.gen.ts +++ b/sdk/typescript/src/api/client.gen.ts @@ -9036,6 +9036,7 @@ export class SourceMap extends BaseClient { */ export class Status extends BaseClient { private readonly _id?: StatusID = undefined + private readonly _display?: StatusID = undefined private readonly _end?: Void = undefined private readonly _internalId?: string = undefined private readonly _name?: string = undefined @@ -9047,6 +9048,7 @@ export class Status extends BaseClient { constructor( ctx?: Context, _id?: StatusID, + _display?: StatusID, _end?: Void, _internalId?: string, _name?: string, @@ -9055,6 +9057,7 @@ export class Status extends BaseClient { super(ctx) this._id = _id + this._display = _display this._end = _end this._internalId = _internalId this._name = _name @@ -9076,6 +9079,17 @@ export class Status extends BaseClient { return response } + /** + * Start and immediately finish the status, so that it just gets displayed to the user. + */ + display = async (): Promise => { + const ctx = this._ctx.select("display") + + const response: Awaited = await ctx.execute() + + return new Client(ctx.copy()).loadStatusFromID(response) + } + /** * Mark the status as complete, with an optional error. */ From 0718ba9760ab7d46cb6c5cba4b091d28a164841c Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Fri, 27 Jun 2025 00:57:52 -0400 Subject: [PATCH 34/36] viztest: use new Display API Signed-off-by: Alex Suraci --- dagql/idtui/viztest/dagger.json | 2 +- dagql/idtui/viztest/dep/go.mod | 39 +++++++------- dagql/idtui/viztest/dep/go.sum | 64 ++++++++++++----------- dagql/idtui/viztest/dep/nested-dep/go.mod | 39 +++++++------- dagql/idtui/viztest/dep/nested-dep/go.sum | 64 ++++++++++++----------- dagql/idtui/viztest/main.go | 15 ++---- 6 files changed, 112 insertions(+), 111 deletions(-) diff --git a/dagql/idtui/viztest/dagger.json b/dagql/idtui/viztest/dagger.json index f42bd5d3da8..c580bf3b433 100644 --- a/dagql/idtui/viztest/dagger.json +++ b/dagql/idtui/viztest/dagger.json @@ -1,6 +1,6 @@ { "name": "viztest", - "engineVersion": "v0.18.12-010101000000-dev-b7aafcc48109", + "engineVersion": "v0.18.11", "sdk": { "source": "go" }, diff --git a/dagql/idtui/viztest/dep/go.mod b/dagql/idtui/viztest/dep/go.mod index 3e800bebd76..18770f535dc 100644 --- a/dagql/idtui/viztest/dep/go.mod +++ b/dagql/idtui/viztest/dep/go.mod @@ -3,48 +3,49 @@ module dagger/dep go 1.24.3 require ( - github.com/99designs/gqlgen v0.17.74 + github.com/99designs/gqlgen v0.17.75 github.com/Khan/genqlient v0.8.1 - github.com/vektah/gqlparser/v2 v2.5.27 - go.opentelemetry.io/otel v1.35.0 - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0 - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 + github.com/vektah/gqlparser/v2 v2.5.28 + go.opentelemetry.io/otel v1.36.0 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.12.2 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.12.2 go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 - go.opentelemetry.io/otel/log v0.8.0 - go.opentelemetry.io/otel/metric v1.35.0 - go.opentelemetry.io/otel/sdk v1.35.0 - go.opentelemetry.io/otel/sdk/log v0.8.0 - go.opentelemetry.io/otel/sdk/metric v1.35.0 - go.opentelemetry.io/otel/trace v1.35.0 - go.opentelemetry.io/proto/otlp v1.3.1 + go.opentelemetry.io/otel/log v0.12.2 + go.opentelemetry.io/otel/metric v1.36.0 + go.opentelemetry.io/otel/sdk v1.36.0 + go.opentelemetry.io/otel/sdk/log v0.12.2 + go.opentelemetry.io/otel/sdk/metric v1.36.0 + go.opentelemetry.io/otel/trace v1.36.0 + go.opentelemetry.io/proto/otlp v1.6.0 golang.org/x/sync v0.15.0 google.golang.org/grpc v1.73.0 ) require ( github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/cenkalti/backoff/v5 v5.0.2 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 // indirect github.com/sosodev/duration v1.3.1 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 // indirect golang.org/x/net v0.41.0 // indirect golang.org/x/sys v0.33.0 // indirect golang.org/x/text v0.26.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237 // indirect google.golang.org/protobuf v1.36.6 // indirect ) -replace go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc => go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0 +replace go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc => go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.12.2 -replace go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp => go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 +replace go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp => go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.12.2 -replace go.opentelemetry.io/otel/log => go.opentelemetry.io/otel/log v0.8.0 +replace go.opentelemetry.io/otel/log => go.opentelemetry.io/otel/log v0.12.2 -replace go.opentelemetry.io/otel/sdk/log => go.opentelemetry.io/otel/sdk/log v0.8.0 +replace go.opentelemetry.io/otel/sdk/log => go.opentelemetry.io/otel/sdk/log v0.12.2 diff --git a/dagql/idtui/viztest/dep/go.sum b/dagql/idtui/viztest/dep/go.sum index c6aa99a439e..74758957c6a 100644 --- a/dagql/idtui/viztest/dep/go.sum +++ b/dagql/idtui/viztest/dep/go.sum @@ -1,11 +1,13 @@ -github.com/99designs/gqlgen v0.17.74 h1:1FuVtkXxOc87xpKio3f6sohREmec+Jvy86PcYOuwgWo= -github.com/99designs/gqlgen v0.17.74/go.mod h1:a+iR6mfRLNRp++kDpooFHiPWYiWX3Yu1BIilQRHgh10= +github.com/99designs/gqlgen v0.17.75 h1:GwHJsptXWLHeY7JO8b7YueUI4w9Pom6wJTICosDtQuI= +github.com/99designs/gqlgen v0.17.75/go.mod h1:p7gbTpdnHyl70hmSpM8XG8GiKwmCv+T5zkdY8U8bLog= github.com/Khan/genqlient v0.8.1 h1:wtOCc8N9rNynRLXN3k3CnfzheCUNKBcvXmVv5zt6WCs= github.com/Khan/genqlient v0.8.1/go.mod h1:R2G6DzjBvCbhjsEajfRjbWdVglSH/73kSivC9TLWVjU= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v5 v5.0.2 h1:rIfFVxEf1QsI7E1ZHfp/B4DF/6QBAUhmgkxc0H7Zss8= +github.com/cenkalti/backoff/v5 v5.0.2/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -19,8 +21,8 @@ github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 h1:5ZPtiqj0JL5oKWmcsq4VMaAW5ukBEgSGXEN89zeH1Jo= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= @@ -29,16 +31,16 @@ github.com/sosodev/duration v1.3.1 h1:qtHBDMQ6lvMQsL15g4aopM4HEfOaYuhWBw3NPTtlqq github.com/sosodev/duration v1.3.1/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/vektah/gqlparser/v2 v2.5.27 h1:RHPD3JOplpk5mP5JGX8RKZkt2/Vwj/PZv0HxTdwFp0s= -github.com/vektah/gqlparser/v2 v2.5.27/go.mod h1:D1/VCZtV3LPnQrcPBeR/q5jkSQIPti0uYCP/RI0gIeo= +github.com/vektah/gqlparser/v2 v2.5.28 h1:bIulcl3LF69ba6EiZVGD88y4MkM+Jxrf3P2MX8xLRkY= +github.com/vektah/gqlparser/v2 v2.5.28/go.mod h1:D1/VCZtV3LPnQrcPBeR/q5jkSQIPti0uYCP/RI0gIeo= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= -go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0 h1:WzNab7hOOLzdDF/EoWCt4glhrbMPVMOO5JYTmpz36Ls= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0/go.mod h1:hKvJwTzJdp90Vh7p6q/9PAOd55dI6WA6sWj62a/JvSs= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 h1:S+LdBGiQXtJdowoJoQPEtI52syEP/JYBUpjO49EQhV8= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0/go.mod h1:5KXybFvPGds3QinJWQT7pmXf+TN5YIa7CNYObWRkj50= +go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg= +go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.12.2 h1:06ZeJRe5BnYXceSM9Vya83XXVaNGe3H1QqsvqRANQq8= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.12.2/go.mod h1:DvPtKE63knkDVP88qpatBj81JxN+w1bqfVbsbCbj1WY= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.12.2 h1:tPLwQlXbJ8NSOfZc4OkgU5h2A38M4c9kfHSVc4PFQGs= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.12.2/go.mod h1:QTnxBwT/1rBIgAG1goq6xMydfYOBKU6KTiYF4fp5zL8= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 h1:j7ZSD+5yn+lo3sGV69nW04rRR0jhYnBwjuX3r0HvnK0= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0/go.mod h1:WXbYJTUaZXAbYd8lbgGuvih0yuCfOFC5RJoYnoLcGz8= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 h1:t/Qur3vKSkUCcDVaSumWF2PKHt85pc7fRvFuoVT8qFU= @@ -49,20 +51,22 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 h1:9kV11 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0/go.mod h1:JyA0FHXe22E1NeNiHmVp7kFHglnexDQ7uRWDiiJ1hKQ= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 h1:cMyu9O88joYEaI47CnQkxO1XZdpoTF9fEnW2duIddhw= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0/go.mod h1:6Am3rn7P9TVVeXYG+wtcGE7IE1tsQ+bP3AuWcKt/gOI= -go.opentelemetry.io/otel/log v0.8.0 h1:egZ8vV5atrUWUbnSsHn6vB8R21G2wrKqNiDt3iWertk= -go.opentelemetry.io/otel/log v0.8.0/go.mod h1:M9qvDdUTRCopJcGRKg57+JSQ9LgLBrwwfC32epk5NX8= -go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M= -go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE= -go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY= -go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg= -go.opentelemetry.io/otel/sdk/log v0.8.0 h1:zg7GUYXqxk1jnGF/dTdLPrK06xJdrXgqgFLnI4Crxvs= -go.opentelemetry.io/otel/sdk/log v0.8.0/go.mod h1:50iXr0UVwQrYS45KbruFrEt4LvAdCaWWgIrsN3ZQggo= -go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o= -go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w= -go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= -go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= -go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= -go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.opentelemetry.io/otel/log v0.12.2 h1:yob9JVHn2ZY24byZeaXpTVoPS6l+UrrxmxmPKohXTwc= +go.opentelemetry.io/otel/log v0.12.2/go.mod h1:ShIItIxSYxufUMt+1H5a2wbckGli3/iCfuEbVZi/98E= +go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE= +go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs= +go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs= +go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY= +go.opentelemetry.io/otel/sdk/log v0.12.2 h1:yNoETvTByVKi7wHvYS6HMcZrN5hFLD7I++1xIZ/k6W0= +go.opentelemetry.io/otel/sdk/log v0.12.2/go.mod h1:DcpdmUXHJgSqN/dh+XMWa7Vf89u9ap0/AAk/XGLnEzY= +go.opentelemetry.io/otel/sdk/log/logtest v0.0.0-20250521073539-a85ae98dcedc h1:uqxdywfHqqCl6LmZzI3pUnXT1RGFYyUgxj0AkWPFxi0= +go.opentelemetry.io/otel/sdk/log/logtest v0.0.0-20250521073539-a85ae98dcedc/go.mod h1:TY/N/FT7dmFrP/r5ym3g0yysP1DefqGpAZr4f82P0dE= +go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis= +go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4= +go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w= +go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA= +go.opentelemetry.io/proto/otlp v1.6.0 h1:jQjP+AQyTf+Fe7OKj/MfkDrmK4MNVtw2NpXsf9fefDI= +go.opentelemetry.io/proto/otlp v1.6.0/go.mod h1:cicgGehlFuNdgZkcALOCh3VE6K/u2tAjzlRhDwmVpZc= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= @@ -73,10 +77,10 @@ golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= -google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463 h1:hE3bRWtU6uceqlh4fhrSnUyjKHMKB9KrTLLG+bc0ddM= -google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463/go.mod h1:U90ffi8eUL9MwPcrJylN5+Mk2v3vuPDptd5yyNUiRR8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463 h1:e0AIkUUhxyBKh6ssZNrAMeqhA7RKUj42346d1y02i2g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237 h1:Kog3KlB4xevJlAcbbbzPfRG0+X9fdoGM+UBRKVz6Wr0= +google.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237/go.mod h1:ezi0AVyMKDWy5xAncvjLWH7UcLBB5n7y2fQ8MzjJcto= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237 h1:cJfm9zPbe1e873mHJzmQ1nwVEeRDU/T1wXDK2kUSU34= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok= google.golang.org/grpc v1.73.0/go.mod h1:50sbHOUqWoCQGI8V2HQLJM0B+LMlIUjNSZmow7EVBQc= google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= diff --git a/dagql/idtui/viztest/dep/nested-dep/go.mod b/dagql/idtui/viztest/dep/nested-dep/go.mod index 4ace64a3c91..01c80ba5acb 100644 --- a/dagql/idtui/viztest/dep/nested-dep/go.mod +++ b/dagql/idtui/viztest/dep/nested-dep/go.mod @@ -3,48 +3,49 @@ module dagger/nested-dep go 1.24.4 require ( - github.com/99designs/gqlgen v0.17.74 + github.com/99designs/gqlgen v0.17.75 github.com/Khan/genqlient v0.8.1 - github.com/vektah/gqlparser/v2 v2.5.27 - go.opentelemetry.io/otel v1.35.0 - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0 - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 + github.com/vektah/gqlparser/v2 v2.5.28 + go.opentelemetry.io/otel v1.36.0 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.12.2 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.12.2 go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 - go.opentelemetry.io/otel/log v0.8.0 - go.opentelemetry.io/otel/metric v1.35.0 - go.opentelemetry.io/otel/sdk v1.35.0 - go.opentelemetry.io/otel/sdk/log v0.8.0 - go.opentelemetry.io/otel/sdk/metric v1.35.0 - go.opentelemetry.io/otel/trace v1.35.0 - go.opentelemetry.io/proto/otlp v1.3.1 + go.opentelemetry.io/otel/log v0.12.2 + go.opentelemetry.io/otel/metric v1.36.0 + go.opentelemetry.io/otel/sdk v1.36.0 + go.opentelemetry.io/otel/sdk/log v0.12.2 + go.opentelemetry.io/otel/sdk/metric v1.36.0 + go.opentelemetry.io/otel/trace v1.36.0 + go.opentelemetry.io/proto/otlp v1.6.0 golang.org/x/sync v0.15.0 google.golang.org/grpc v1.73.0 ) require ( github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/cenkalti/backoff/v5 v5.0.2 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 // indirect github.com/sosodev/duration v1.3.1 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 // indirect golang.org/x/net v0.41.0 // indirect golang.org/x/sys v0.33.0 // indirect golang.org/x/text v0.26.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237 // indirect google.golang.org/protobuf v1.36.6 // indirect ) -replace go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc => go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0 +replace go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc => go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.12.2 -replace go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp => go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 +replace go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp => go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.12.2 -replace go.opentelemetry.io/otel/log => go.opentelemetry.io/otel/log v0.8.0 +replace go.opentelemetry.io/otel/log => go.opentelemetry.io/otel/log v0.12.2 -replace go.opentelemetry.io/otel/sdk/log => go.opentelemetry.io/otel/sdk/log v0.8.0 +replace go.opentelemetry.io/otel/sdk/log => go.opentelemetry.io/otel/sdk/log v0.12.2 diff --git a/dagql/idtui/viztest/dep/nested-dep/go.sum b/dagql/idtui/viztest/dep/nested-dep/go.sum index c6aa99a439e..74758957c6a 100644 --- a/dagql/idtui/viztest/dep/nested-dep/go.sum +++ b/dagql/idtui/viztest/dep/nested-dep/go.sum @@ -1,11 +1,13 @@ -github.com/99designs/gqlgen v0.17.74 h1:1FuVtkXxOc87xpKio3f6sohREmec+Jvy86PcYOuwgWo= -github.com/99designs/gqlgen v0.17.74/go.mod h1:a+iR6mfRLNRp++kDpooFHiPWYiWX3Yu1BIilQRHgh10= +github.com/99designs/gqlgen v0.17.75 h1:GwHJsptXWLHeY7JO8b7YueUI4w9Pom6wJTICosDtQuI= +github.com/99designs/gqlgen v0.17.75/go.mod h1:p7gbTpdnHyl70hmSpM8XG8GiKwmCv+T5zkdY8U8bLog= github.com/Khan/genqlient v0.8.1 h1:wtOCc8N9rNynRLXN3k3CnfzheCUNKBcvXmVv5zt6WCs= github.com/Khan/genqlient v0.8.1/go.mod h1:R2G6DzjBvCbhjsEajfRjbWdVglSH/73kSivC9TLWVjU= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v5 v5.0.2 h1:rIfFVxEf1QsI7E1ZHfp/B4DF/6QBAUhmgkxc0H7Zss8= +github.com/cenkalti/backoff/v5 v5.0.2/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -19,8 +21,8 @@ github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 h1:5ZPtiqj0JL5oKWmcsq4VMaAW5ukBEgSGXEN89zeH1Jo= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= @@ -29,16 +31,16 @@ github.com/sosodev/duration v1.3.1 h1:qtHBDMQ6lvMQsL15g4aopM4HEfOaYuhWBw3NPTtlqq github.com/sosodev/duration v1.3.1/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/vektah/gqlparser/v2 v2.5.27 h1:RHPD3JOplpk5mP5JGX8RKZkt2/Vwj/PZv0HxTdwFp0s= -github.com/vektah/gqlparser/v2 v2.5.27/go.mod h1:D1/VCZtV3LPnQrcPBeR/q5jkSQIPti0uYCP/RI0gIeo= +github.com/vektah/gqlparser/v2 v2.5.28 h1:bIulcl3LF69ba6EiZVGD88y4MkM+Jxrf3P2MX8xLRkY= +github.com/vektah/gqlparser/v2 v2.5.28/go.mod h1:D1/VCZtV3LPnQrcPBeR/q5jkSQIPti0uYCP/RI0gIeo= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= -go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0 h1:WzNab7hOOLzdDF/EoWCt4glhrbMPVMOO5JYTmpz36Ls= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0/go.mod h1:hKvJwTzJdp90Vh7p6q/9PAOd55dI6WA6sWj62a/JvSs= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 h1:S+LdBGiQXtJdowoJoQPEtI52syEP/JYBUpjO49EQhV8= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0/go.mod h1:5KXybFvPGds3QinJWQT7pmXf+TN5YIa7CNYObWRkj50= +go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg= +go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.12.2 h1:06ZeJRe5BnYXceSM9Vya83XXVaNGe3H1QqsvqRANQq8= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.12.2/go.mod h1:DvPtKE63knkDVP88qpatBj81JxN+w1bqfVbsbCbj1WY= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.12.2 h1:tPLwQlXbJ8NSOfZc4OkgU5h2A38M4c9kfHSVc4PFQGs= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.12.2/go.mod h1:QTnxBwT/1rBIgAG1goq6xMydfYOBKU6KTiYF4fp5zL8= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 h1:j7ZSD+5yn+lo3sGV69nW04rRR0jhYnBwjuX3r0HvnK0= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0/go.mod h1:WXbYJTUaZXAbYd8lbgGuvih0yuCfOFC5RJoYnoLcGz8= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 h1:t/Qur3vKSkUCcDVaSumWF2PKHt85pc7fRvFuoVT8qFU= @@ -49,20 +51,22 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 h1:9kV11 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0/go.mod h1:JyA0FHXe22E1NeNiHmVp7kFHglnexDQ7uRWDiiJ1hKQ= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 h1:cMyu9O88joYEaI47CnQkxO1XZdpoTF9fEnW2duIddhw= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0/go.mod h1:6Am3rn7P9TVVeXYG+wtcGE7IE1tsQ+bP3AuWcKt/gOI= -go.opentelemetry.io/otel/log v0.8.0 h1:egZ8vV5atrUWUbnSsHn6vB8R21G2wrKqNiDt3iWertk= -go.opentelemetry.io/otel/log v0.8.0/go.mod h1:M9qvDdUTRCopJcGRKg57+JSQ9LgLBrwwfC32epk5NX8= -go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M= -go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE= -go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY= -go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg= -go.opentelemetry.io/otel/sdk/log v0.8.0 h1:zg7GUYXqxk1jnGF/dTdLPrK06xJdrXgqgFLnI4Crxvs= -go.opentelemetry.io/otel/sdk/log v0.8.0/go.mod h1:50iXr0UVwQrYS45KbruFrEt4LvAdCaWWgIrsN3ZQggo= -go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o= -go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w= -go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= -go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= -go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= -go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.opentelemetry.io/otel/log v0.12.2 h1:yob9JVHn2ZY24byZeaXpTVoPS6l+UrrxmxmPKohXTwc= +go.opentelemetry.io/otel/log v0.12.2/go.mod h1:ShIItIxSYxufUMt+1H5a2wbckGli3/iCfuEbVZi/98E= +go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE= +go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs= +go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs= +go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY= +go.opentelemetry.io/otel/sdk/log v0.12.2 h1:yNoETvTByVKi7wHvYS6HMcZrN5hFLD7I++1xIZ/k6W0= +go.opentelemetry.io/otel/sdk/log v0.12.2/go.mod h1:DcpdmUXHJgSqN/dh+XMWa7Vf89u9ap0/AAk/XGLnEzY= +go.opentelemetry.io/otel/sdk/log/logtest v0.0.0-20250521073539-a85ae98dcedc h1:uqxdywfHqqCl6LmZzI3pUnXT1RGFYyUgxj0AkWPFxi0= +go.opentelemetry.io/otel/sdk/log/logtest v0.0.0-20250521073539-a85ae98dcedc/go.mod h1:TY/N/FT7dmFrP/r5ym3g0yysP1DefqGpAZr4f82P0dE= +go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis= +go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4= +go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w= +go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA= +go.opentelemetry.io/proto/otlp v1.6.0 h1:jQjP+AQyTf+Fe7OKj/MfkDrmK4MNVtw2NpXsf9fefDI= +go.opentelemetry.io/proto/otlp v1.6.0/go.mod h1:cicgGehlFuNdgZkcALOCh3VE6K/u2tAjzlRhDwmVpZc= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= @@ -73,10 +77,10 @@ golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= -google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463 h1:hE3bRWtU6uceqlh4fhrSnUyjKHMKB9KrTLLG+bc0ddM= -google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463/go.mod h1:U90ffi8eUL9MwPcrJylN5+Mk2v3vuPDptd5yyNUiRR8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463 h1:e0AIkUUhxyBKh6ssZNrAMeqhA7RKUj42346d1y02i2g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237 h1:Kog3KlB4xevJlAcbbbzPfRG0+X9fdoGM+UBRKVz6Wr0= +google.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237/go.mod h1:ezi0AVyMKDWy5xAncvjLWH7UcLBB5n7y2fQ8MzjJcto= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237 h1:cJfm9zPbe1e873mHJzmQ1nwVEeRDU/T1wXDK2kUSU34= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok= google.golang.org/grpc v1.73.0/go.mod h1:50sbHOUqWoCQGI8V2HQLJM0B+LMlIUjNSZmow7EVBQc= google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= diff --git a/dagql/idtui/viztest/main.go b/dagql/idtui/viztest/main.go index 2cb19b13d45..5fe4b2f0d1d 100644 --- a/dagql/idtui/viztest/main.go +++ b/dagql/idtui/viztest/main.go @@ -110,14 +110,8 @@ func (v *Viztest) CustomStatus(ctx context.Context) (res string, rerr error) { } func (v *Viztest) RevealedStatuses(ctx context.Context) (res string, rerr error) { - func() { - ctx, status := dag.Status("custom status").Context(ctx) - status.End(ctx) - }() - func() { - ctx, status := dag.Status("revealed status").WithReveal().Context(ctx) - status.End(ctx) - }() + dag.Status("custom status").Display(ctx) + dag.Status("revealed status").WithReveal().Display(ctx) func() { ctx, status := dag.Status("revealed message"). WithReveal(). @@ -129,10 +123,7 @@ func (v *Viztest) RevealedStatuses(ctx context.Context) (res string, rerr error) defer stdio.Close() fmt.Fprintln(stdio.Stdout, "sometimes you gotta be **bold**") }() - func() { - _, status := dag.Status("revealed status").Context(ctx) - status.End(ctx) - }() + dag.Status("not revealed status").Display(ctx) return v.Echo(ctx, "hello from Go! it is currently "+time.Now().String()) } From 49ccb4d0ad16d3dd8242785617c6f0949e28d8bb Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Fri, 27 Jun 2025 10:34:21 -0400 Subject: [PATCH 35/36] lint Signed-off-by: Alex Suraci --- core/schema/query.go | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/core/schema/query.go b/core/schema/query.go index 511f879dc42..686078329ff 100644 --- a/core/schema/query.go +++ b/core/schema/query.go @@ -220,23 +220,14 @@ func (s *querySchema) reveal(ctx context.Context, parent *core.Query, args struc } func (s *querySchema) statusStart(ctx context.Context, parent dagql.Instance[*core.Status], args struct{}) (dagql.ID[*core.Status], error) { - started := parent.Self.Start(ctx) - var inst dagql.Instance[*core.Status] - err := s.srv.Select(ctx, s.srv.Root(), &inst, dagql.Selector{ - Field: "status", - Args: []dagql.NamedInput{ - {Name: "name", Value: dagql.NewString(started.Name)}, - {Name: "key", Value: dagql.NewString(started.InternalID())}, - }, - }) - if err != nil { - return dagql.ID[*core.Status]{}, err - } - return dagql.NewID[*core.Status](inst.ID()), nil + return s.selectStatus(ctx, parent.Self.Start(ctx)) } func (s *querySchema) statusDisplay(ctx context.Context, parent dagql.Instance[*core.Status], args struct{}) (dagql.ID[*core.Status], error) { - started := parent.Self.Display(ctx) + return s.selectStatus(ctx, parent.Self.Display(ctx)) +} + +func (s *querySchema) selectStatus(ctx context.Context, started *core.Status) (dagql.ID[*core.Status], error) { var inst dagql.Instance[*core.Status] err := s.srv.Select(ctx, s.srv.Root(), &inst, dagql.Selector{ Field: "status", From 70fce0fc5312f6749624600114788d6290f0b05b Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Fri, 27 Jun 2025 11:01:45 -0400 Subject: [PATCH 36/36] regen (why do i have to do this twice?) Signed-off-by: Alex Suraci --- docs/static/reference/php/Dagger/Status.html | 60 +++++++++++++++++--- docs/static/reference/php/doc-index.html | 4 +- docs/static/reference/php/doctum-search.json | 6 ++ 3 files changed, 60 insertions(+), 10 deletions(-) diff --git a/docs/static/reference/php/Dagger/Status.html b/docs/static/reference/php/Dagger/Status.html index 8cf6f0723eb..46f0e12b6b6 100644 --- a/docs/static/reference/php/Dagger/Status.html +++ b/docs/static/reference/php/Dagger/Status.html @@ -140,6 +140,16 @@

    Methods

    +
    +
    +
    + StatusId +
    +
    + display() + +

    Start and immediately finish the status, so that it just gets displayed to the user.

    +
    @@ -327,8 +337,40 @@

    Return Value

    -

    +

    at line 19
    + StatusId + display() + +

    +
    + + + +
    +

    Start and immediately finish the status, so that it just gets displayed to the user.

    +
    +
    + +

    Return Value

    + + + + + + +
    StatusId
    + + + + +
    +
    + +
    +
    +

    +
    at line 28
    void end(Error|null $error = null) @@ -370,7 +412,7 @@

    Return Value

    -
    at line 31
    +
    at line 40
    AbstractId id() @@ -402,7 +444,7 @@

    Return Value

    -
    at line 40
    +
    at line 49
    string internalId() @@ -434,7 +476,7 @@

    Return Value

    -
    at line 49
    +
    at line 58
    string name() @@ -466,7 +508,7 @@

    Return Value

    -
    at line 58
    +
    at line 67
    StatusId start() @@ -498,7 +540,7 @@

    Return Value

    -
    at line 67
    +
    at line 76
    Status withActorEmoji(string $actor) @@ -540,7 +582,7 @@

    Return Value

    -
    at line 77
    +
    at line 86
    Status withPassthrough() @@ -572,7 +614,7 @@

    Return Value

    -
    at line 88
    +
    at line 97
    Status withReceivedMessage() @@ -604,7 +646,7 @@

    Return Value

    -
    at line 97
    +
    at line 106
    Status withReveal() diff --git a/docs/static/reference/php/doc-index.html b/docs/static/reference/php/doc-index.html index 49f00c38765..6e48d9ed1a3 100644 --- a/docs/static/reference/php/doc-index.html +++ b/docs/static/reference/php/doc-index.html @@ -322,7 +322,9 @@

    A

    Port::description() — Method in class Port

    The port description.

    ScalarTypeDef::description() — Method in class ScalarTypeDef
    -

    A doc string for the scalar, if any.

    E

    +

    A doc string for the scalar, if any.

    +Status::display() — Method in class Status
    +

    Start and immediately finish the status, so that it just gets displayed to the user.

    E

    Client::engine() — Method in class Client

    The Dagger engine container configuration and state

    diff --git a/docs/static/reference/php/doctum-search.json b/docs/static/reference/php/doctum-search.json index bb2ee4729dd..2c6a4a0037d 100644 --- a/docs/static/reference/php/doctum-search.json +++ b/docs/static/reference/php/doctum-search.json @@ -4219,6 +4219,12 @@ "p": "Dagger/SourceMap.html#method_module", "d": "

    The module dependency this was declared in.

    " }, + { + "t": "M", + "n": "Dagger\\Status::display", + "p": "Dagger/Status.html#method_display", + "d": "

    Start and immediately finish the status, so that it just gets displayed to the user.

    " + }, { "t": "M", "n": "Dagger\\Status::end",