Skip to content

Commit 80690aa

Browse files
feat: feature flag to clean inventory cache on start
1 parent defe0d3 commit 80690aa

File tree

4 files changed

+32
-6
lines changed

4 files changed

+32
-6
lines changed

internal/agent/agent.go

+18
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package agent
55
import (
66
context2 "context"
77
"fmt"
8+
"github.com/newrelic/infrastructure-agent/internal/agent/cmdchannel/fflag"
89
"net/http"
910
"os"
1011
"path/filepath"
@@ -95,6 +96,7 @@ type Agent struct {
9596
agentID *entity.ID // pointer as it's referred from several points
9697
mtx sync.Mutex // Protect plugins
9798
notificationHandler *ctl.NotificationHandlerWithCancellation // Handle ipc messaging.
99+
ffRetriever feature_flags.Retriever
98100
}
99101

100102
type inventoryState struct {
@@ -393,6 +395,7 @@ func NewAgent(
393395
cloudHarvester,
394396
fpHarvester,
395397
notificationHandler,
398+
ffRetriever,
396399
)
397400
}
398401

@@ -410,6 +413,7 @@ func New(
410413
cloudHarvester cloud.Harvester,
411414
fpHarvester fingerprint.Harvester,
412415
notificationHandler *ctl.NotificationHandlerWithCancellation,
416+
ffRetriever feature_flags.Retriever,
413417
) (*Agent, error) {
414418
a := &Agent{
415419
Context: ctx,
@@ -422,6 +426,7 @@ func New(
422426
connectSrv: connectSrv,
423427
provideIDs: provideIDs,
424428
notificationHandler: notificationHandler,
429+
ffRetriever: ffRetriever,
425430
}
426431

427432
a.plugins = make([]Plugin, 0)
@@ -820,6 +825,19 @@ func (a *Agent) Run() (err error) {
820825
close(exit)
821826
}()
822827

828+
// We check FF to delete the whole inventory and trigger the whoel inventory send
829+
// This will bypass the deltas cache and force the inventory to be sent after restarting the Agent
830+
if a.ffRetriever != nil {
831+
alog.Debug("readding FlagFullInventoryDeletion feature flag")
832+
ffFullInventoryDeletionEnabled, ffExists := a.ffRetriever.GetFeatureFlag(fflag.FlagFullInventoryDeletion)
833+
if ffExists && ffFullInventoryDeletionEnabled {
834+
alog.Info("Cleaning inventory cache and forcing full inventory report")
835+
a.store.ResetAllDeltas(a.Context.EntityKey())
836+
}
837+
} else {
838+
alog.Warn("Feature flags retriever is not available")
839+
}
840+
823841
if a.inventoryHandler != nil {
824842
if a.shouldSendInventory() {
825843
a.inventoryHandler.Start()

internal/agent/agent_test.go

+3
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ func newTesting(cfg *config.Config) *Agent {
8080
connectSrv := NewIdentityConnectService(&MockIdentityConnectClient{}, fpHarvester, metadataHarvester)
8181
provideIDs := NewProvideIDs(registerClient, state.NewRegisterSM())
8282

83+
ffRetriever := &feature_flags.FeatureFlagRetrieverMock{}
84+
8385
a, err := New(
8486
cfg,
8587
ctx,
@@ -93,6 +95,7 @@ func newTesting(cfg *config.Config) *Agent {
9395
cloudDetector,
9496
fpHarvester,
9597
ctl.NewNotificationHandlerWithCancellation(nil),
98+
ffRetriever,
9699
)
97100
if err != nil {
98101
panic(err)

internal/agent/cmdchannel/fflag/ffhandler.go

+7-5
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,11 @@ const (
2323
FlagParallelizeInventory = "parallelize_inventory_enabled"
2424
FlagAsyncInventoryHandler = "async_inventory_handler_enabled"
2525

26-
FlagProtocolV4 = "protocol_v4_enabled"
27-
FlagFullProcess = "full_process_sampling"
28-
FlagDmRegisterDeprecated = "dm_register_deprecated"
29-
FlagFluentBit19 = "fluent_bit_19_win"
26+
FlagProtocolV4 = "protocol_v4_enabled"
27+
FlagFullProcess = "full_process_sampling"
28+
FlagDmRegisterDeprecated = "dm_register_deprecated"
29+
FlagFluentBit19 = "fluent_bit_19_win"
30+
FlagFullInventoryDeletion = "full_inventory_deletion"
3031
// Config
3132
CfgYmlRegisterEnabled = "register_enabled"
3233
CfgYmlParallelizeInventory = "inventory_queue_len"
@@ -183,7 +184,8 @@ func (h *handler) Handle(ctx context.Context, c commandapi.Command, isInitialFet
183184
func isBasicFeatureFlag(flag string) bool {
184185
return flag == FlagProtocolV4 ||
185186
flag == FlagFullProcess ||
186-
flag == FlagDmRegisterDeprecated
187+
flag == FlagDmRegisterDeprecated ||
188+
flag == FlagFullInventoryDeletion
187189
}
188190

189191
func (h *handler) setFFConfig(ff string, enabled bool) {

test/infra/agent.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ package infra
44

55
import (
66
"compress/gzip"
7+
78
"io/ioutil"
89
"net/http"
910
"path/filepath"
@@ -17,6 +18,7 @@ import (
1718

1819
"github.com/newrelic/infrastructure-agent/internal/agent"
1920
"github.com/newrelic/infrastructure-agent/internal/agent/delta"
21+
"github.com/newrelic/infrastructure-agent/internal/feature_flags"
2022
"github.com/newrelic/infrastructure-agent/internal/testhelpers"
2123
backendhttp "github.com/newrelic/infrastructure-agent/pkg/backend/http"
2224
"github.com/newrelic/infrastructure-agent/pkg/backend/identityapi"
@@ -112,7 +114,8 @@ func NewAgentWithConnectClientAndConfig(connectClient *http.Client, dataClient b
112114
transport := backendhttp.BuildTransport(cfg, backendhttp.ClientTimeout)
113115
transport = backendhttp.NewRequestDecoratorTransport(cfg, transport)
114116
dataClient = backendhttp.NewRequestDecoratorTransport(cfg, infra.ToRoundTripper(dataClient)).RoundTrip
115-
a, err := agent.New(cfg, ctx, "user-agent", lookups, st, connectSrv, provideIDs, dataClient, transport, cloudDetector, fingerprintHarvester, ctl.NewNotificationHandlerWithCancellation(nil))
117+
ffRetriever := feature_flags.NewManager(map[string]bool{})
118+
a, err := agent.New(cfg, ctx, "user-agent", lookups, st, connectSrv, provideIDs, dataClient, transport, cloudDetector, fingerprintHarvester, ctl.NewNotificationHandlerWithCancellation(nil), ffRetriever)
116119
if err != nil {
117120
panic(err)
118121
}

0 commit comments

Comments
 (0)