Skip to content

Commit df65122

Browse files
authored
Add otel instrumentation to proxyless dials (#1502)
* Add otel instrumentation to proxyless dials
1 parent b928823 commit df65122

File tree

2 files changed

+27
-21
lines changed

2 files changed

+27
-21
lines changed

dialer/proxyless.go

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010

1111
"github.com/Jigsaw-Code/outline-sdk/transport"
1212
"github.com/Jigsaw-Code/outline-sdk/x/smart"
13+
"github.com/getlantern/flashlight/v7/ops"
1314
)
1415

1516
type proxyless interface {
@@ -53,6 +54,8 @@ func NewProxylessDialer() Dialer {
5354

5455
// DialContext dials out to the domain or IP address representing a destination site.
5556
func (d *proxylessDialer) DialContext(ctx context.Context, network, address string) (net.Conn, error) {
57+
op := ops.Begin("proxyless_dialer")
58+
defer op.End()
5659
deadline, _ := ctx.Deadline()
5760
log.Debugf("Time remaining: %v for ctx: %v", time.Until(deadline), ctx.Err())
5861

@@ -67,46 +70,51 @@ func (d *proxylessDialer) DialContext(ctx context.Context, network, address stri
6770
// The smart dialer requires the port to be specified, so we add it if it's
6871
// missing. We can't do this in the dialer itself because the scheme
6972
// is stripped by the time the dialer is called.
70-
addr, host, err := normalizeAddrHost(address)
73+
addr, domain, err := normalizeAddrHost(address)
7174
if err != nil {
7275
log.Errorf("Failed to normalize address: %v", err)
76+
op.FailIf(err)
7377
return nil, err
7478
}
75-
dialer, err := d.getOrCreateDialer(ctx, host, addr)
79+
dialer, err := d.getOrCreateDialer(ctx, domain, op)
7680
if err != nil {
77-
d.onFailure(host, err)
81+
d.onFailure(domain, err)
82+
op.FailIf(err)
7883
return nil, fmt.Errorf("failed to create smart dialer: %v", err)
7984
}
8085

8186
// Store the dialer in the map right away so that we can use it for future requests.
8287
// If the dialer fails, we'll store a failing dialer in the map.
83-
d.onSuccess(host, dialer)
88+
d.onSuccess(domain, dialer)
8489
streamConn, err := dialer.DialStream(ctx, addr)
8590
if err != nil {
8691
log.Errorf("❌ Failed to dial stream for %s: %v", address, err)
87-
d.onFailure(host, err)
88-
return nil, fmt.Errorf("failed to dial stream with new dialer: %v", err)
92+
dialErr := fmt.Errorf("failed to dial stream with proxyless dialer: %v", err)
93+
d.onFailure(domain, dialErr)
94+
op.FailIf(dialErr)
95+
return nil, dialErr
8996
}
9097
log.Debugf("✅ Successfully dialed proxyless to %s", address)
9198
return streamConn, nil
9299
}
93100

94101
// getOrCreateDialer gets or creates a dialer for the given host.
95102
// If a dialer already exists, it returns the existing one.
96-
func (d *proxylessDialer) getOrCreateDialer(ctx context.Context, host, addr string) (transport.StreamDialer, error) {
103+
func (d *proxylessDialer) getOrCreateDialer(ctx context.Context, domain string, op *ops.Op) (transport.StreamDialer, error) {
97104
// Check if we already have a dialer for this host
98-
if dialer, ok := successfulDialers.Load(host); ok {
99-
log.Debugf("Using existing dialer for host: %s", host)
105+
if dialer, ok := successfulDialers.Load(domain); ok {
106+
log.Debugf("Using existing dialer for domain: %s", domain)
107+
op.Set("status", "existing")
100108
return dialer.(transport.StreamDialer), nil
101109
}
102110

103-
// Create a new dialer
104-
domains := []string{host}
105-
dialer, err := d.newDialer(ctx, domains, d.configBytes)
111+
op.Set("status", "new")
112+
dialer, err := d.newDialer(ctx, []string{domain}, d.configBytes)
106113
if err != nil {
107-
log.Errorf("❌ Failed to create smart dialer for %v: %v", host, err)
114+
log.Errorf("❌ Failed to create smart dialer for %v: %v", domain, err)
108115
return nil, err
109116
}
117+
log.Debugf("✅ Successfully created smart dialer to %s", domain)
110118
return dialer, nil
111119
}
112120

dialer/proxyless_test.go

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"testing"
99

1010
"github.com/Jigsaw-Code/outline-sdk/transport"
11+
"github.com/getlantern/flashlight/v7/ops"
1112
"github.com/stretchr/testify/assert"
1213
)
1314

@@ -22,7 +23,6 @@ func (m *mockStreamDialer) DialStream(ctx context.Context, addr string) (transpo
2223
func TestGetOrCreateDialer_ExistingDialer(t *testing.T) {
2324
// Arrange
2425
host := "example.com"
25-
addr := "example.com:443"
2626
mockDialer := &mockStreamDialer{
2727
dialStreamFunc: func(ctx context.Context, addr string) (transport.StreamConn, error) {
2828
return nil, nil
@@ -34,7 +34,7 @@ func TestGetOrCreateDialer_ExistingDialer(t *testing.T) {
3434
d := &proxylessDialer{}
3535

3636
// Act
37-
dialer, err := d.getOrCreateDialer(context.Background(), host, addr)
37+
dialer, err := d.getOrCreateDialer(context.Background(), host, ops.Begin("test_op"))
3838

3939
// Assert
4040
assert.NoError(t, err)
@@ -44,7 +44,6 @@ func TestGetOrCreateDialer_ExistingDialer(t *testing.T) {
4444
func TestGetOrCreateDialer_NewDialerSuccess(t *testing.T) {
4545
// Arrange
4646
host := "example.com"
47-
addr := "example.com:443"
4847
mockDialer := &mockStreamDialer{}
4948
d := &proxylessDialer{
5049
newDialer: func(ctx context.Context, testDomains []string, configBytes []byte) (transport.StreamDialer, error) {
@@ -54,7 +53,7 @@ func TestGetOrCreateDialer_NewDialerSuccess(t *testing.T) {
5453
}
5554

5655
// Act
57-
dialer, err := d.getOrCreateDialer(context.Background(), host, addr)
56+
dialer, err := d.getOrCreateDialer(context.Background(), host, ops.Begin("test_op"))
5857

5958
// Assert
6059
assert.NoError(t, err)
@@ -64,7 +63,6 @@ func TestGetOrCreateDialer_NewDialerSuccess(t *testing.T) {
6463
func TestGetOrCreateDialer_NewDialerFailure(t *testing.T) {
6564
// Arrange
6665
host := "example.com"
67-
addr := "example.com:443"
6866
expectedErr := errors.New("failed to create dialer")
6967
d := &proxylessDialer{
7068
newDialer: func(ctx context.Context, testDomains []string, configBytes []byte) (transport.StreamDialer, error) {
@@ -74,7 +72,7 @@ func TestGetOrCreateDialer_NewDialerFailure(t *testing.T) {
7472
}
7573

7674
// Act
77-
dialer, err := d.getOrCreateDialer(context.Background(), host, addr)
75+
dialer, err := d.getOrCreateDialer(context.Background(), host, ops.Begin("test_op"))
7876

7977
// Assert
8078
assert.Nil(t, dialer)
@@ -123,7 +121,7 @@ func TestDialContext_CreateDialerError(t *testing.T) {
123121

124122
// Assert
125123
assert.Nil(t, conn)
126-
assert.EqualError(t, err, "failed to create smart dialer: failed to create dialer")
124+
assert.Error(t, err)
127125
}
128126

129127
func TestDialContext_DialStreamError(t *testing.T) {
@@ -148,5 +146,5 @@ func TestDialContext_DialStreamError(t *testing.T) {
148146

149147
// Assert
150148
assert.Nil(t, conn)
151-
assert.EqualError(t, err, "failed to dial stream with new dialer: failed to dial stream")
149+
assert.Error(t, err)
152150
}

0 commit comments

Comments
 (0)