Skip to content

Commit 506439d

Browse files
authored
Merge pull request #1336 from snyk/feat/telemetry_iac_source_count
Add iac source count to telemetry
2 parents 66baef7 + f84b03f commit 506439d

File tree

10 files changed

+114
-19
lines changed

10 files changed

+114
-19
lines changed

pkg/driftctl.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ type ScanOptions struct {
3838

3939
type DriftCTL struct {
4040
remoteSupplier resource.Supplier
41-
iacSupplier resource.Supplier
41+
iacSupplier resource.IaCSupplier
4242
alerter alerter.AlerterInterface
4343
analyzer *analyser.Analyzer
4444
resourceFactory resource.ResourceFactory
@@ -50,7 +50,7 @@ type DriftCTL struct {
5050
}
5151

5252
func NewDriftCTL(remoteSupplier resource.Supplier,
53-
iacSupplier resource.Supplier,
53+
iacSupplier resource.IaCSupplier,
5454
alerter *alerter.Alerter,
5555
analyzer *analyser.Analyzer,
5656
resFactory resource.ResourceFactory,
@@ -189,6 +189,7 @@ func (d DriftCTL) scan() (remoteResources []*resource.Resource, resourcesFromSta
189189
if err != nil {
190190
return nil, nil, err
191191
}
192+
d.store.Bucket(memstore.TelemetryBucket).Set("iac_source_count", d.iacSupplier.SourceCount())
192193

193194
logrus.Info("Start scanning cloud provider")
194195
d.scanProgress.Start()

pkg/driftctl_test.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,9 @@ func runTest(t *testing.T, cases TestCases) {
6262
res.Sch = schema
6363
}
6464

65-
stateSupplier := &resource.MockSupplier{}
65+
stateSupplier := &resource.MockIaCSupplier{}
6666
stateSupplier.On("Resources").Return(c.stateResources, nil)
67+
stateSupplier.On("SourceCount").Return(uint(2))
6768

6869
if c.remoteResources == nil {
6970
c.remoteResources = []*resource.Resource{}
@@ -138,6 +139,7 @@ func TestDriftctlRun_BasicBehavior(t *testing.T) {
138139
assert.Equal(t, 0, store.Bucket(memstore.TelemetryBucket).Get("total_resources"))
139140
assert.Equal(t, 0, store.Bucket(memstore.TelemetryBucket).Get("total_managed"))
140141
assert.Equal(t, uint(0), store.Bucket(memstore.TelemetryBucket).Get("duration"))
142+
assert.Equal(t, uint(2), store.Bucket(memstore.TelemetryBucket).Get("iac_source_count"))
141143
},
142144
},
143145
{
@@ -155,6 +157,7 @@ func TestDriftctlRun_BasicBehavior(t *testing.T) {
155157
assert.Equal(t, 1, store.Bucket(memstore.TelemetryBucket).Get("total_resources"))
156158
assert.Equal(t, 1, store.Bucket(memstore.TelemetryBucket).Get("total_managed"))
157159
assert.Equal(t, uint(0), store.Bucket(memstore.TelemetryBucket).Get("duration"))
160+
assert.Equal(t, uint(2), store.Bucket(memstore.TelemetryBucket).Get("iac_source_count"))
158161
},
159162
options: func(t *testing.T) *pkg.ScanOptions {
160163
return &pkg.ScanOptions{Deep: true}
@@ -173,6 +176,7 @@ func TestDriftctlRun_BasicBehavior(t *testing.T) {
173176
assert.Equal(t, 1, store.Bucket(memstore.TelemetryBucket).Get("total_resources"))
174177
assert.Equal(t, 0, store.Bucket(memstore.TelemetryBucket).Get("total_managed"))
175178
assert.Equal(t, uint(0), store.Bucket(memstore.TelemetryBucket).Get("duration"))
179+
assert.Equal(t, uint(2), store.Bucket(memstore.TelemetryBucket).Get("iac_source_count"))
176180
},
177181
},
178182
{
@@ -226,6 +230,7 @@ func TestDriftctlRun_BasicBehavior(t *testing.T) {
226230
assert.Equal(t, 1, store.Bucket(memstore.TelemetryBucket).Get("total_resources"))
227231
assert.Equal(t, 1, store.Bucket(memstore.TelemetryBucket).Get("total_managed"))
228232
assert.Equal(t, uint(0), store.Bucket(memstore.TelemetryBucket).Get("duration"))
233+
assert.Equal(t, uint(2), store.Bucket(memstore.TelemetryBucket).Get("iac_source_count"))
229234
},
230235
},
231236
{
@@ -264,6 +269,7 @@ func TestDriftctlRun_BasicBehavior(t *testing.T) {
264269
assert.Equal(t, 1, store.Bucket(memstore.TelemetryBucket).Get("total_resources"))
265270
assert.Equal(t, 1, store.Bucket(memstore.TelemetryBucket).Get("total_managed"))
266271
assert.Equal(t, uint(0), store.Bucket(memstore.TelemetryBucket).Get("duration"))
272+
assert.Equal(t, uint(2), store.Bucket(memstore.TelemetryBucket).Get("iac_source_count"))
267273
},
268274
},
269275
{
@@ -304,6 +310,7 @@ func TestDriftctlRun_BasicBehavior(t *testing.T) {
304310
assert.Equal(t, 1, store.Bucket(memstore.TelemetryBucket).Get("total_resources"))
305311
assert.Equal(t, 1, store.Bucket(memstore.TelemetryBucket).Get("total_managed"))
306312
assert.Equal(t, uint(0), store.Bucket(memstore.TelemetryBucket).Get("duration"))
313+
assert.Equal(t, uint(2), store.Bucket(memstore.TelemetryBucket).Get("iac_source_count"))
307314
},
308315
},
309316
{
@@ -344,6 +351,7 @@ func TestDriftctlRun_BasicBehavior(t *testing.T) {
344351
assert.Equal(t, 1, store.Bucket(memstore.TelemetryBucket).Get("total_resources"))
345352
assert.Equal(t, 1, store.Bucket(memstore.TelemetryBucket).Get("total_managed"))
346353
assert.Equal(t, uint(0), store.Bucket(memstore.TelemetryBucket).Get("duration"))
354+
assert.Equal(t, uint(2), store.Bucket(memstore.TelemetryBucket).Get("iac_source_count"))
347355
},
348356
},
349357
{
@@ -434,6 +442,7 @@ func TestDriftctlRun_BasicBehavior(t *testing.T) {
434442
assert.Equal(t, 4, store.Bucket(memstore.TelemetryBucket).Get("total_resources"))
435443
assert.Equal(t, 2, store.Bucket(memstore.TelemetryBucket).Get("total_managed"))
436444
assert.Equal(t, uint(0), store.Bucket(memstore.TelemetryBucket).Get("duration"))
445+
assert.Equal(t, uint(2), store.Bucket(memstore.TelemetryBucket).Get("iac_source_count"))
437446
},
438447
options: func(t *testing.T) *pkg.ScanOptions {
439448
return &pkg.ScanOptions{
@@ -530,6 +539,7 @@ func TestDriftctlRun_BasicBehavior(t *testing.T) {
530539
assert.Equal(t, 6, store.Bucket(memstore.TelemetryBucket).Get("total_resources"))
531540
assert.Equal(t, 2, store.Bucket(memstore.TelemetryBucket).Get("total_managed"))
532541
assert.Equal(t, uint(0), store.Bucket(memstore.TelemetryBucket).Get("duration"))
542+
assert.Equal(t, uint(2), store.Bucket(memstore.TelemetryBucket).Get("iac_source_count"))
533543
},
534544
options: func(t *testing.T) *pkg.ScanOptions {
535545
return &pkg.ScanOptions{
@@ -628,6 +638,7 @@ func TestDriftctlRun_BasicBehavior(t *testing.T) {
628638
assert.Equal(t, 1, store.Bucket(memstore.TelemetryBucket).Get("total_resources"))
629639
assert.Equal(t, 0, store.Bucket(memstore.TelemetryBucket).Get("total_managed"))
630640
assert.Equal(t, uint(0), store.Bucket(memstore.TelemetryBucket).Get("duration"))
641+
assert.Equal(t, uint(2), store.Bucket(memstore.TelemetryBucket).Get("iac_source_count"))
631642
},
632643
options: func(t *testing.T) *pkg.ScanOptions {
633644
filterStr := "Id=='role-test-1'"

pkg/iac/supplier/IacChainSupplier.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
)
1111

1212
type IacChainSupplier struct {
13-
suppliers []resource.Supplier
13+
suppliers []resource.IaCSupplier
1414
runner *parallel.ParallelRunner
1515
}
1616

@@ -20,7 +20,15 @@ func NewIacChainSupplier() *IacChainSupplier {
2020
}
2121
}
2222

23-
func (r *IacChainSupplier) AddSupplier(supplier resource.Supplier) {
23+
func (r *IacChainSupplier) SourceCount() uint {
24+
count := uint(0)
25+
for _, supplier := range r.suppliers {
26+
count += supplier.SourceCount()
27+
}
28+
return count
29+
}
30+
31+
func (r *IacChainSupplier) AddSupplier(supplier resource.IaCSupplier) {
2432
r.suppliers = append(r.suppliers, supplier)
2533
}
2634

pkg/iac/supplier/IacChainSupplier_test.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,22 @@ import (
1111
func TestIacChainSupplier_Resources(t *testing.T) {
1212
tests := []struct {
1313
name string
14-
initSuppliers func(suppliers *[]resource.Supplier)
14+
initSuppliers func(suppliers *[]resource.IaCSupplier)
1515
want []*resource.Resource
1616
wantErr bool
1717
}{
1818
{
1919
name: "All failed",
20-
initSuppliers: func(suppliers *[]resource.Supplier) {
21-
sup := &resource.MockSupplier{}
20+
initSuppliers: func(suppliers *[]resource.IaCSupplier) {
21+
sup := &resource.MockIaCSupplier{}
2222
sup.On("Resources").Return(nil, errors.New("1"))
2323
*suppliers = append(*suppliers, sup)
2424

25-
sup = &resource.MockSupplier{}
25+
sup = &resource.MockIaCSupplier{}
2626
sup.On("Resources").Return(nil, errors.New("2"))
2727
*suppliers = append(*suppliers, sup)
2828

29-
sup = &resource.MockSupplier{}
29+
sup = &resource.MockIaCSupplier{}
3030
sup.On("Resources").Return(nil, errors.New("3"))
3131
*suppliers = append(*suppliers, sup)
3232
},
@@ -35,16 +35,16 @@ func TestIacChainSupplier_Resources(t *testing.T) {
3535
},
3636
{
3737
name: "Partial failed",
38-
initSuppliers: func(suppliers *[]resource.Supplier) {
39-
sup := &resource.MockSupplier{}
38+
initSuppliers: func(suppliers *[]resource.IaCSupplier) {
39+
sup := &resource.MockIaCSupplier{}
4040
sup.On("Resources").Return(nil, errors.New("1"))
4141
*suppliers = append(*suppliers, sup)
4242

43-
sup = &resource.MockSupplier{}
43+
sup = &resource.MockIaCSupplier{}
4444
sup.On("Resources").Return(nil, errors.New("2"))
4545
*suppliers = append(*suppliers, sup)
4646

47-
sup = &resource.MockSupplier{}
47+
sup = &resource.MockIaCSupplier{}
4848
sup.On("Resources").Return([]*resource.Resource{
4949
&resource.Resource{
5050
Id: "ID",
@@ -67,7 +67,7 @@ func TestIacChainSupplier_Resources(t *testing.T) {
6767
for _, tt := range tests {
6868
t.Run(tt.name, func(t *testing.T) {
6969
r := NewIacChainSupplier()
70-
suppliers := make([]resource.Supplier, 0)
70+
suppliers := make([]resource.IaCSupplier, 0)
7171
tt.initSuppliers(&suppliers)
7272

7373
for _, supplier := range suppliers {

pkg/iac/supplier/supplier.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ func GetIACSupplier(configs []config.SupplierConfig,
3737
progress output.Progress,
3838
alerter *alerter.Alerter,
3939
factory resource.ResourceFactory,
40-
filter filter.Filter) (resource.Supplier, error) {
40+
filter filter.Filter) (resource.IaCSupplier, error) {
4141

4242
chainSupplier := NewIacChainSupplier()
4343
for _, config := range configs {
@@ -47,7 +47,7 @@ func GetIACSupplier(configs []config.SupplierConfig,
4747

4848
deserializer := resource.NewDeserializer(factory)
4949

50-
var supplier resource.Supplier
50+
var supplier resource.IaCSupplier
5151
var err error
5252
switch config.Key {
5353
case state.TerraformStateReaderSupplier:

pkg/iac/terraform/state/terraform_state_reader.go

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ type TerraformStateReader struct {
4141
progress output.Progress
4242
filter filter.Filter
4343
alerter *alerter.Alerter
44+
sourceCount uint
4445
}
4546

4647
func (r *TerraformStateReader) initReader() error {
@@ -49,7 +50,16 @@ func (r *TerraformStateReader) initReader() error {
4950
}
5051

5152
func NewReader(config config.SupplierConfig, library *terraform.ProviderLibrary, backendOpts *backend.Options, progress output.Progress, alerter *alerter.Alerter, deserializer *resource.Deserializer, filter filter.Filter) (*TerraformStateReader, error) {
52-
reader := TerraformStateReader{library: library, config: config, deserializer: deserializer, backendOptions: backendOpts, progress: progress, alerter: alerter, filter: filter}
53+
reader := TerraformStateReader{
54+
library: library,
55+
config: config,
56+
deserializer: deserializer,
57+
backendOptions: backendOpts,
58+
progress: progress,
59+
alerter: alerter,
60+
filter: filter,
61+
sourceCount: 0,
62+
}
5363
err := reader.initReader()
5464
if err != nil {
5565
return nil, err
@@ -214,8 +224,13 @@ func (r *TerraformStateReader) Resources() ([]*resource.Resource, error) {
214224
return r.retrieveMultiplesStates()
215225
}
216226

227+
func (r *TerraformStateReader) SourceCount() uint {
228+
return r.sourceCount
229+
}
230+
217231
func (r *TerraformStateReader) retrieveForState(path string) ([]*resource.Resource, error) {
218232
r.config.Path = path
233+
r.sourceCount += 1
219234
logrus.WithFields(logrus.Fields{
220235
"path": r.config.Path,
221236
"backend": r.config.Backend,

pkg/resource/mock_IaCSupplier.go

Lines changed: 47 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/resource/supplier.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
package resource
22

3-
// Resource Supplier supply the list of resource.Resource, its the front to retrieve remote resources
3+
// Supplier supply the list of resource.Resource, it's the main interface to retrieve remote resources
44
type Supplier interface {
55
Resources() ([]*Resource, error)
66
}
77

8+
// IaCSupplier supply the list of resource.Resource, it's the main interface to retrieve state resources
9+
type IaCSupplier interface {
10+
Supplier
11+
SourceCount() uint
12+
}
13+
814
type StoppableSupplier interface {
915
Supplier
1016
Stop()

pkg/telemetry/telemetry.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ type telemetry struct {
2020
TotalManaged int `json:"total_managed"`
2121
Duration uint `json:"duration"`
2222
ProviderName string `json:"provider_name"`
23+
IaCSourceCount uint `json:"iac_source_count"`
2324
}
2425

2526
type Telemetry struct {
@@ -59,6 +60,10 @@ func (te Telemetry) SendTelemetry(store memstore.Bucket) {
5960
t.ProviderName = val
6061
}
6162

63+
if val, ok := store.Get("iac_source_count").(uint); ok {
64+
t.IaCSourceCount = val
65+
}
66+
6267
body, err := json.Marshal(t)
6368
if err != nil {
6469
logrus.Debug(err)

pkg/telemetry/telemetry_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,14 @@ func TestSendTelemetry(t *testing.T) {
4444
TotalManaged: 1,
4545
Duration: 123,
4646
ProviderName: "aws",
47+
IaCSourceCount: 2,
4748
},
4849
setStoreValues: func(s memstore.Bucket, a *analyser.Analysis) {
4950
s.Set("total_resources", a.Summary().TotalResources)
5051
s.Set("total_managed", a.Summary().TotalManaged)
5152
s.Set("duration", uint(a.Duration.Seconds()+0.5))
5253
s.Set("provider_name", "aws")
54+
s.Set("iac_source_count", uint(2))
5355
},
5456
},
5557
{

0 commit comments

Comments
 (0)