Skip to content

Commit 6ec6995

Browse files
committed
TUN-9511: Add metrics for virtual DNS origin
Closes TUN-9511
1 parent 242fcce commit 6ec6995

File tree

5 files changed

+65
-13
lines changed

5 files changed

+65
-13
lines changed

cmd/cloudflared/tunnel/configuration.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"time"
1212

1313
"github.com/pkg/errors"
14+
"github.com/prometheus/client_golang/prometheus"
1415
"github.com/rs/zerolog"
1516
"github.com/urfave/cli/v2"
1617
"github.com/urfave/cli/v2/altsrc"
@@ -229,14 +230,15 @@ func prepareTunnelConfig(
229230
}, log)
230231

231232
// Setup DNS Resolver Service
233+
originMetrics := origins.NewMetrics(prometheus.DefaultRegisterer)
232234
dnsResolverAddrs := c.StringSlice(flags.VirtualDNSServiceResolverAddresses)
233-
dnsService := origins.NewDNSResolverService(origins.NewDNSDialer(), log)
235+
dnsService := origins.NewDNSResolverService(origins.NewDNSDialer(), log, originMetrics)
234236
if len(dnsResolverAddrs) > 0 {
235237
addrs, err := parseResolverAddrPorts(dnsResolverAddrs)
236238
if err != nil {
237239
return nil, nil, fmt.Errorf("invalid %s provided: %w", flags.VirtualDNSServiceResolverAddresses, err)
238240
}
239-
dnsService = origins.NewStaticDNSResolverService(addrs, origins.NewDNSDialer(), log)
241+
dnsService = origins.NewStaticDNSResolverService(addrs, origins.NewDNSDialer(), log, originMetrics)
240242
}
241243
originDialerService.AddReservedService(dnsService, []netip.AddrPort{origins.VirtualDNSServiceAddr})
242244

ingress/origins/dns.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,31 +51,35 @@ type DNSResolverService struct {
5151
dialer ingress.OriginDialer
5252
resolver peekResolver
5353
logger *zerolog.Logger
54+
metrics Metrics
5455
}
5556

56-
func NewDNSResolverService(dialer ingress.OriginDialer, logger *zerolog.Logger) *DNSResolverService {
57+
func NewDNSResolverService(dialer ingress.OriginDialer, logger *zerolog.Logger, metrics Metrics) *DNSResolverService {
5758
return &DNSResolverService{
5859
addresses: []netip.AddrPort{defaultResolverAddr},
5960
dialer: dialer,
6061
resolver: &resolver{dialFunc: net.Dial},
6162
logger: logger,
63+
metrics: metrics,
6264
}
6365
}
6466

65-
func NewStaticDNSResolverService(resolverAddrs []netip.AddrPort, dialer ingress.OriginDialer, logger *zerolog.Logger) *DNSResolverService {
66-
s := NewDNSResolverService(dialer, logger)
67+
func NewStaticDNSResolverService(resolverAddrs []netip.AddrPort, dialer ingress.OriginDialer, logger *zerolog.Logger, metrics Metrics) *DNSResolverService {
68+
s := NewDNSResolverService(dialer, logger, metrics)
6769
s.addresses = resolverAddrs
6870
s.static = true
6971
return s
7072
}
7173

7274
func (s *DNSResolverService) DialTCP(ctx context.Context, _ netip.AddrPort) (net.Conn, error) {
75+
s.metrics.IncrementDNSTCPRequests()
7376
dest := s.getAddress()
7477
// The dialer ignores the provided address because the request will instead go to the local DNS resolver.
7578
return s.dialer.DialTCP(ctx, dest)
7679
}
7780

7881
func (s *DNSResolverService) DialUDP(_ netip.AddrPort) (net.Conn, error) {
82+
s.metrics.IncrementDNSUDPRequests()
7983
dest := s.getAddress()
8084
// The dialer ignores the provided address because the request will instead go to the local DNS resolver.
8185
return s.dialer.DialUDP(dest)

ingress/origins/dns_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import (
1414

1515
func TestDNSResolver_DefaultResolver(t *testing.T) {
1616
log := zerolog.Nop()
17-
service := NewDNSResolverService(NewDNSDialer(), &log)
17+
service := NewDNSResolverService(NewDNSDialer(), &log, &noopMetrics{})
1818
mockResolver := &mockPeekResolver{
1919
address: "127.0.0.2:53",
2020
}
@@ -25,7 +25,7 @@ func TestDNSResolver_DefaultResolver(t *testing.T) {
2525
func TestStaticDNSResolver_DefaultResolver(t *testing.T) {
2626
log := zerolog.Nop()
2727
addresses := []netip.AddrPort{netip.MustParseAddrPort("1.1.1.1:53"), netip.MustParseAddrPort("1.0.0.1:53")}
28-
service := NewStaticDNSResolverService(addresses, NewDNSDialer(), &log)
28+
service := NewStaticDNSResolverService(addresses, NewDNSDialer(), &log, &noopMetrics{})
2929
mockResolver := &mockPeekResolver{
3030
address: "127.0.0.2:53",
3131
}
@@ -35,7 +35,7 @@ func TestStaticDNSResolver_DefaultResolver(t *testing.T) {
3535

3636
func TestDNSResolver_UpdateResolverAddress(t *testing.T) {
3737
log := zerolog.Nop()
38-
service := NewDNSResolverService(NewDNSDialer(), &log)
38+
service := NewDNSResolverService(NewDNSDialer(), &log, &noopMetrics{})
3939

4040
mockResolver := &mockPeekResolver{}
4141
service.resolver = mockResolver
@@ -64,7 +64,7 @@ func TestDNSResolver_UpdateResolverAddress(t *testing.T) {
6464
func TestStaticDNSResolver_RefreshLoopExits(t *testing.T) {
6565
log := zerolog.Nop()
6666
addresses := []netip.AddrPort{netip.MustParseAddrPort("1.1.1.1:53"), netip.MustParseAddrPort("1.0.0.1:53")}
67-
service := NewStaticDNSResolverService(addresses, NewDNSDialer(), &log)
67+
service := NewStaticDNSResolverService(addresses, NewDNSDialer(), &log, &noopMetrics{})
6868

6969
mockResolver := &mockPeekResolver{
7070
address: "127.0.0.2:53",
@@ -85,7 +85,7 @@ func TestStaticDNSResolver_RefreshLoopExits(t *testing.T) {
8585

8686
func TestDNSResolver_UpdateResolverAddressInvalid(t *testing.T) {
8787
log := zerolog.Nop()
88-
service := NewDNSResolverService(NewDNSDialer(), &log)
88+
service := NewDNSResolverService(NewDNSDialer(), &log, &noopMetrics{})
8989
mockResolver := &mockPeekResolver{}
9090
service.resolver = mockResolver
9191

@@ -109,7 +109,7 @@ func TestDNSResolver_UpdateResolverAddressInvalid(t *testing.T) {
109109

110110
func TestDNSResolver_UpdateResolverErrorIgnored(t *testing.T) {
111111
log := zerolog.Nop()
112-
service := NewDNSResolverService(NewDNSDialer(), &log)
112+
service := NewDNSResolverService(NewDNSDialer(), &log, &noopMetrics{})
113113
resolverErr := errors.New("test resolver error")
114114
mockResolver := &mockPeekResolver{err: resolverErr}
115115
service.resolver = mockResolver
@@ -126,7 +126,7 @@ func TestDNSResolver_UpdateResolverErrorIgnored(t *testing.T) {
126126
func TestDNSResolver_DialUDPUsesResolvedAddress(t *testing.T) {
127127
log := zerolog.Nop()
128128
mockDialer := &mockDialer{expected: defaultResolverAddr}
129-
service := NewDNSResolverService(mockDialer, &log)
129+
service := NewDNSResolverService(mockDialer, &log, &noopMetrics{})
130130
mockResolver := &mockPeekResolver{}
131131
service.resolver = mockResolver
132132

@@ -140,7 +140,7 @@ func TestDNSResolver_DialUDPUsesResolvedAddress(t *testing.T) {
140140
func TestDNSResolver_DialTCPUsesResolvedAddress(t *testing.T) {
141141
log := zerolog.Nop()
142142
mockDialer := &mockDialer{expected: defaultResolverAddr}
143-
service := NewDNSResolverService(mockDialer, &log)
143+
service := NewDNSResolverService(mockDialer, &log, &noopMetrics{})
144144
mockResolver := &mockPeekResolver{}
145145
service.resolver = mockResolver
146146

ingress/origins/metrics.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package origins
2+
3+
import (
4+
"github.com/prometheus/client_golang/prometheus"
5+
)
6+
7+
const (
8+
namespace = "cloudflared"
9+
subsystem = "virtual_origins"
10+
)
11+
12+
type Metrics interface {
13+
IncrementDNSUDPRequests()
14+
IncrementDNSTCPRequests()
15+
}
16+
17+
type metrics struct {
18+
dnsResolverRequests *prometheus.CounterVec
19+
}
20+
21+
func (m *metrics) IncrementDNSUDPRequests() {
22+
m.dnsResolverRequests.WithLabelValues("udp").Inc()
23+
}
24+
25+
func (m *metrics) IncrementDNSTCPRequests() {
26+
m.dnsResolverRequests.WithLabelValues("tcp").Inc()
27+
}
28+
29+
func NewMetrics(registerer prometheus.Registerer) Metrics {
30+
m := &metrics{
31+
dnsResolverRequests: prometheus.NewCounterVec(prometheus.CounterOpts{
32+
Namespace: namespace,
33+
Subsystem: subsystem,
34+
Name: "dns_requests_total",
35+
Help: "Total count of DNS requests that have been proxied to the virtual DNS resolver origin",
36+
}, []string{"protocol"}),
37+
}
38+
registerer.MustRegister(m.dnsResolverRequests)
39+
return m
40+
}

ingress/origins/metrics_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package origins
2+
3+
type noopMetrics struct{}
4+
5+
func (noopMetrics) IncrementDNSUDPRequests() {}
6+
func (noopMetrics) IncrementDNSTCPRequests() {}

0 commit comments

Comments
 (0)