Skip to content

Commit d1c5d60

Browse files
authored
Merge branch 'main' into feat/adk_backend_v2
2 parents d00cc03 + 8f11ae8 commit d1c5d60

File tree

5 files changed

+65
-9
lines changed

5 files changed

+65
-9
lines changed

adk/backend/local/local.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -464,9 +464,10 @@ func (s *Backend) ExecuteStreaming(ctx context.Context, input *filesystem.Execut
464464
}()
465465

466466
scanner := bufio.NewScanner(stdout)
467+
hasOutput := false
467468
for scanner.Scan() {
469+
hasOutput = true
468470
line := scanner.Text() + "\n"
469-
470471
select {
471472
case <-ctx.Done():
472473
_ = cmd.Process.Kill()
@@ -500,6 +501,11 @@ func (s *Backend) ExecuteStreaming(ctx context.Context, input *filesystem.Execut
500501
}
501502
return
502503
}
504+
505+
if !hasOutput {
506+
w.Send(&filesystem.ExecuteResponse{ExitCode: new(int)}, nil)
507+
}
508+
503509
}()
504510

505511
return sr, nil

adk/backend/local/local_test.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -661,4 +661,29 @@ func TestExecuteStreaming(t *testing.T) {
661661

662662
assert.Error(t, lastErr, "should receive error for invalid command")
663663
})
664+
665+
t.Run("ExecuteStreaming with no stdout output", func(t *testing.T) {
666+
req := &filesystem.ExecuteRequest{Command: "true"}
667+
sr, err := s.(*backend).ExecuteStreaming(ctx, req)
668+
assert.NoError(t, err)
669+
670+
var receivedResponse bool
671+
var exitCode *int
672+
for {
673+
resp, err := sr.Recv()
674+
if err != nil {
675+
break
676+
}
677+
if resp != nil {
678+
receivedResponse = true
679+
if resp.ExitCode != nil {
680+
exitCode = resp.ExitCode
681+
}
682+
}
683+
}
684+
685+
assert.True(t, receivedResponse, "should receive at least one response even with no stdout")
686+
assert.NotNil(t, exitCode, "should receive exit code in response")
687+
assert.Equal(t, 0, *exitCode, "exit code should be 0 for successful command")
688+
})
664689
}

callbacks/apmplus/apmplus.go

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,16 +59,36 @@ type Config struct {
5959
// Default: ""
6060
// Example: "v1.2.3"
6161
Release string
62+
63+
// ResourceAttributes is custom resource attributes (Optional)
64+
ResourceAttributes map[string]string
6265
}
6366

6467
func NewApmplusHandler(cfg *Config) (handler callbacks.Handler, shutdown func(ctx context.Context) error, err error) {
65-
p, err := opentelemetry.NewOpenTelemetryProvider(
68+
resourceAttributes := []attribute.KeyValue{
69+
attribute.String("apmplus.business_type", "gen_ai"),
70+
}
71+
if len(cfg.ResourceAttributes) > 0 {
72+
for k, v := range cfg.ResourceAttributes {
73+
resourceAttributes = append(resourceAttributes, attribute.String(k, v))
74+
}
75+
}
76+
var resourceOpts []opentelemetry.Option
77+
for _, attr := range resourceAttributes {
78+
resourceOpts = append(resourceOpts,
79+
opentelemetry.WithResourceAttribute(attr),
80+
)
81+
}
82+
83+
providerOpts := []opentelemetry.Option{
6684
opentelemetry.WithServiceName(cfg.ServiceName),
6785
opentelemetry.WithExportEndpoint(cfg.Host),
6886
opentelemetry.WithInsecure(),
6987
opentelemetry.WithHeaders(map[string]string{"x-byteapm-appkey": cfg.AppKey}),
70-
opentelemetry.WithResourceAttribute(attribute.String("apmplus.business_type", "gen_ai")),
71-
)
88+
}
89+
providerOpts = append(providerOpts, resourceOpts...)
90+
91+
p, err := opentelemetry.NewOpenTelemetryProvider(providerOpts...)
7292
if p == nil || err != nil {
7393
return nil, nil, errors.New("init opentelemetry provider failed")
7494
}

callbacks/apmplus/apmplus_test.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,16 @@ import (
3131
)
3232

3333
func TestApmplusCallback(t *testing.T) {
34+
// optional: add custom resource attributes
35+
resourceAttributes := make(map[string]string)
36+
resourceAttributes["attr-key"] = "attr-value"
37+
3438
cbh, _, _ := NewApmplusHandler(&Config{
35-
Host: "apmplus host",
36-
AppKey: "app key",
37-
ServiceName: "MyService",
38-
Release: "release",
39+
Host: "apmplus host",
40+
AppKey: "app key",
41+
ServiceName: "MyService",
42+
Release: "release",
43+
ResourceAttributes: resourceAttributes,
3944
})
4045
callbacks.AppendGlobalHandlers(cbh)
4146
ctx := context.Background()

callbacks/apmplus/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ require (
1111
go.opentelemetry.io/contrib/instrumentation/runtime v0.59.0
1212
go.opentelemetry.io/otel v1.34.0
1313
go.opentelemetry.io/otel/metric v1.34.0
14+
go.opentelemetry.io/otel/sdk v1.34.0
1415
go.opentelemetry.io/otel/trace v1.34.0
1516
)
1617

@@ -50,7 +51,6 @@ require (
5051
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 // indirect
5152
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect
5253
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 // indirect
53-
go.opentelemetry.io/otel/sdk v1.34.0 // indirect
5454
go.opentelemetry.io/otel/sdk/metric v1.34.0 // indirect
5555
go.opentelemetry.io/proto/otlp v1.5.0 // indirect
5656
golang.org/x/arch v0.12.0 // indirect

0 commit comments

Comments
 (0)