Skip to content

Commit 6f88da9

Browse files
authored
feat(healthplatform): add issue reporting via AgentSecure gRPC and IssueAwareCheck interface (#50950)
### What does this PR do? Adds two mechanisms for sub-agents and Go integrations to forward health issues into the core agent's health platform store. **1. `ReportHealthIssue` / `ResolveHealthIssue` gRPC RPCs on `AgentSecure`** Cross-process callers report or resolve issues over the existing mTLS connection. The issue payload is `google.protobuf.Any` wrapping a `healthplatform.Issue`. - **Registered remote agents** (ADP, OTel collector, …) supply `remote_agent_session_id`; the server validates liveness via `RefreshRemoteAgent` and rejects unknown/stale sessions with `UNAUTHENTICATED`. - **Unregistered sub-agents** (system-probe, process-agent, security-agent) leave `remote_agent_session_id` empty; authentication is provided by the `AgentSecure` mTLS connection. Both RPCs validate that `issue.id` and `issue.issue_name` are non-empty. `ResolveHealthIssue` is idempotent. Changed files: - `pkg/proto/datadog/api/v1/api.proto` — `ReportHealthIssueRequest` / `ResolveHealthIssueRequest` messages and two new RPCs on `AgentSecure` - `pkg/proto/pbgo/core/api.pb.go` / `api_grpc.pb.go` / `api_mockgen.pb.go` — regenerated stubs - `comp/api/grpcserver/impl-agent/server.go` — `ReportHealthIssue` / `ResolveHealthIssue` handlers + `validateSessionID` helper - `comp/api/grpcserver/impl-agent/grpc.go` — wires `HealthPlatformStore` into the `Requires` struct and passes it to `serverSecure` - `comp/api/grpcserver/impl-agent/health_platform_test.go` — unit tests **2. `IssueAwareCheck` interface for in-process Go integrations** Go checks opt in by implementing `SetIssueReporter(healthplatformstore.Component)`. `CheckWrapper` detects the interface at construction time and injects the store — no serialization, no auth setup, no new endpoint. Changed files: - `pkg/collector/check/check.go` — `IssueAwareCheck` optional interface - `comp/collector/collector/impl/internal/middleware/check_wrapper.go` — detects `IssueAwareCheck` and injects the store - `comp/collector/collector/impl/collector.go` — passes the health platform store to `NewCheckWrapper` ### Motivation Sub-agents detect runtime failures (eBPF load errors, kernel incompatibility, capability issues) that currently cannot reach the health platform. The gRPC path reuses the existing `AgentSecure` mTLS connection — no new IPC surface. Registered remote agents additionally prove liveness via session ID. Go integrations run in-process and call the store directly. ### Describe how you validated your changes - Unit tests for `ReportHealthIssue` / `ResolveHealthIssue`: happy path, valid/invalid/empty session, registry unavailable, sub-agent without session, nil/empty `id` rejection, empty `issue_name` rejection, unavailable store, invalid `Any` payload, idempotent resolve - Unit tests for `IssueAwareCheck` injection: store injected on aware checks, no-op on non-aware checks ### Additional Notes - `google.protobuf.Any` is used for the issue payload because `agent-payload`'s `healthplatform.proto` cannot be imported into `api.proto` directly (different module boundary); type safety is enforced in the handler via `anypb.UnmarshalTo` - Auto-resolving a remote agent's issues when its session expires is not yet implemented — requires an on-deregister callback in the Remote Agent Registry, tracked as a follow-up Co-authored-by: louis.coquerelle <louis.coquerelle@datadoghq.com>
1 parent b8c38bb commit 6f88da9

68 files changed

Lines changed: 846 additions & 139 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

BUILD.bazel

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -679,6 +679,8 @@ exports_files(["go.mod"])
679679
# gazelle:resolve go github.com/DataDog/datadog-agent/pkg/proto/pbgo/privateactionrunner/errorcode //pkg/proto/pbgo/privateactionrunner/errorcode
680680
# gazelle:resolve go github.com/DataDog/datadog-agent/pkg/proto/pbgo/privateactionrunner/privateactions //pkg/proto/pbgo/privateactionrunner/privateactions
681681
# gazelle:resolve go github.com/DataDog/datadog-agent/pkg/proto/pbgo/trace/idx //pkg/proto/pbgo/trace/idx
682+
# gazelle:resolve proto datadog/healthplatform/healthplatform.proto @com_github_datadog_agent_payload_v5//proto/healthplatform:healthplatform_proto
683+
# gazelle:resolve proto go datadog/healthplatform/healthplatform.proto @com_github_datadog_agent_payload_v5//healthplatform
682684
# GAZELLE_BUILD_TAGS is the source-of-truth tag list from
683685
# tasks/build_tags.bzl, shared with the dda inv build-tag code.
684686
gazelle(

comp/api/grpcserver/impl-agent/BUILD.bazel

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ go_library(
3434
"//comp/dogstatsd/pidmap/def",
3535
"//comp/dogstatsd/replay/def",
3636
"//comp/dogstatsd/server/def",
37+
"//comp/healthplatform/store/def",
3738
"//comp/metadata/host/impl/hosttags",
3839
"//comp/remote-config/rcservice/def",
3940
"//comp/remote-config/rcservicemrf/def",
@@ -54,6 +55,7 @@ go_library(
5455
go_test(
5556
name = "impl-agent_test",
5657
srcs = [
58+
"health_platform_test.go",
5759
"interceptors_test.go",
5860
"server_test.go",
5961
],
@@ -63,7 +65,10 @@ go_test(
6365
"//comp/core/remoteagentregistry/def",
6466
"//comp/core/telemetry/def",
6567
"//comp/core/telemetry/mock",
68+
"//comp/healthplatform/store/def",
69+
"//comp/healthplatform/store/mock",
6670
"//pkg/proto/pbgo/core",
71+
"@com_github_datadog_agent_payload_v5//healthplatform",
6772
"@com_github_stretchr_testify//assert",
6873
"@com_github_stretchr_testify//require",
6974
"@org_golang_google_grpc//:grpc",

comp/api/grpcserver/impl-agent/grpc.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
pidmap "github.com/DataDog/datadog-agent/comp/dogstatsd/pidmap/def"
3131
replay "github.com/DataDog/datadog-agent/comp/dogstatsd/replay/def"
3232
dogstatsdServer "github.com/DataDog/datadog-agent/comp/dogstatsd/server/def"
33+
healthplatformstore "github.com/DataDog/datadog-agent/comp/healthplatform/store/def"
3334
rcservice "github.com/DataDog/datadog-agent/comp/remote-config/rcservice/def"
3435
rcservicemrf "github.com/DataDog/datadog-agent/comp/remote-config/rcservicemrf/def"
3536
pb "github.com/DataDog/datadog-agent/pkg/proto/pbgo/core"
@@ -62,6 +63,7 @@ type Requires struct {
6263
Telemetry telemetry.Component
6364
Hostname hostnameinterface.Component
6465
ConfigStream configstream.Component
66+
HealthPlatformStore healthplatformstore.Component
6567
}
6668

6769
type server struct {
@@ -81,6 +83,7 @@ type server struct {
8183
telemetry telemetry.Component
8284
hostname hostnameinterface.Component
8385
configStream configstream.Component
86+
healthPlatformStore healthplatformstore.Component
8487
}
8588

8689
func (s *server) BuildServer() http.Handler {
@@ -137,6 +140,7 @@ func (s *server) BuildServer() http.Handler {
137140
autodiscovery: s.autodiscovery,
138141
configComp: s.configComp,
139142
configStreamServer: configstreamServer.NewServer(s.configComp, s.configStream, s.remoteAgentRegistry),
143+
healthPlatformStore: s.healthPlatformStore,
140144
})
141145
pb.RegisterRemoteAgentServer(grpcServer, &remoteAgentServer{
142146
remoteAgentRegistry: s.remoteAgentRegistry,
@@ -170,6 +174,7 @@ func NewComponent(reqs Requires) (Provides, error) {
170174
telemetry: reqs.Telemetry,
171175
hostname: reqs.Hostname,
172176
configStream: reqs.ConfigStream,
177+
healthPlatformStore: reqs.HealthPlatformStore,
173178
},
174179
}
175180
return provides, nil
Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
1+
// Unless explicitly stated otherwise all files in this repository are licensed
2+
// under the Apache License Version 2.0.
3+
// This product includes software developed at Datadog (https://www.datadoghq.com/).
4+
// Copyright 2025-present Datadog, Inc.
5+
6+
//go:build test
7+
8+
package agentimpl
9+
10+
import (
11+
"context"
12+
"testing"
13+
14+
healthplatformpayload "github.com/DataDog/agent-payload/v5/healthplatform"
15+
"github.com/stretchr/testify/assert"
16+
"github.com/stretchr/testify/require"
17+
"google.golang.org/grpc/codes"
18+
"google.golang.org/grpc/status"
19+
20+
remoteagentregistry "github.com/DataDog/datadog-agent/comp/core/remoteagentregistry/def"
21+
healthplatformstore "github.com/DataDog/datadog-agent/comp/healthplatform/store/def"
22+
healthplatformmock "github.com/DataDog/datadog-agent/comp/healthplatform/store/mock"
23+
pb "github.com/DataDog/datadog-agent/pkg/proto/pbgo/core"
24+
)
25+
26+
// stubRegistry is a minimal remoteagentregistry.Component for testing session validation.
27+
type stubRegistry struct {
28+
validSessions map[string]bool
29+
}
30+
31+
func (r *stubRegistry) RegisterRemoteAgent(_ *remoteagentregistry.RegistrationData) (string, uint32, error) {
32+
return "", 0, nil
33+
}
34+
35+
func (r *stubRegistry) RefreshRemoteAgent(sessionID string) bool {
36+
return r.validSessions[sessionID]
37+
}
38+
39+
func (r *stubRegistry) ReportRemoteAgentEvent(_ string, _ []remoteagentregistry.RemoteAgentEvent) error {
40+
return nil
41+
}
42+
43+
func (r *stubRegistry) GetRegisteredAgents() []remoteagentregistry.RegisteredAgent { return nil }
44+
45+
func (r *stubRegistry) GetRegisteredAgentStatuses() []remoteagentregistry.StatusData { return nil }
46+
47+
func serverWithStore(store healthplatformstore.Component) *serverSecure {
48+
return &serverSecure{healthPlatformStore: store}
49+
}
50+
51+
func serverWithStoreAndRegistry(store healthplatformstore.Component, reg remoteagentregistry.Component) *serverSecure {
52+
return &serverSecure{
53+
healthPlatformStore: store,
54+
remoteAgentRegistry: reg,
55+
}
56+
}
57+
58+
// ── ReportHealthIssue ────────────────────────────────────────────────────────
59+
60+
func TestReportHealthIssue_StoresIssue(t *testing.T) {
61+
storeMock := healthplatformmock.Mock(t)
62+
srv := serverWithStore(storeMock)
63+
64+
issue := &healthplatformpayload.Issue{Id: "test-issue", IssueName: "test-issue", Title: "Test Issue", Severity: healthplatformpayload.IssueSeverity_ISSUE_SEVERITY_HIGH}
65+
_, err := srv.ReportHealthIssue(context.Background(), &pb.ReportHealthIssueRequest{Issue: issue})
66+
require.NoError(t, err)
67+
68+
got := storeMock.GetIssue("test-issue")
69+
require.NotNil(t, got)
70+
assert.Equal(t, "Test Issue", got.Title)
71+
assert.Equal(t, healthplatformpayload.IssueSeverity_ISSUE_SEVERITY_HIGH, got.Severity)
72+
}
73+
74+
func TestReportHealthIssue_NilIssue(t *testing.T) {
75+
srv := serverWithStore(healthplatformmock.Mock(t))
76+
77+
_, err := srv.ReportHealthIssue(context.Background(), &pb.ReportHealthIssueRequest{})
78+
require.Error(t, err)
79+
assert.Equal(t, codes.InvalidArgument, status.Code(err))
80+
}
81+
82+
func TestReportHealthIssue_EmptyIssueID(t *testing.T) {
83+
srv := serverWithStore(healthplatformmock.Mock(t))
84+
85+
_, err := srv.ReportHealthIssue(context.Background(), &pb.ReportHealthIssueRequest{Issue: &healthplatformpayload.Issue{Title: "no id"}})
86+
require.Error(t, err)
87+
assert.Equal(t, codes.InvalidArgument, status.Code(err))
88+
}
89+
90+
func TestReportHealthIssue_EmptyIssueName(t *testing.T) {
91+
srv := serverWithStore(healthplatformmock.Mock(t))
92+
93+
_, err := srv.ReportHealthIssue(context.Background(), &pb.ReportHealthIssueRequest{Issue: &healthplatformpayload.Issue{Id: "has-id-no-name"}})
94+
require.Error(t, err)
95+
assert.Equal(t, codes.InvalidArgument, status.Code(err))
96+
}
97+
98+
// TestReportHealthIssue_ValidSession verifies that a registered remote agent with a
99+
// valid session ID can report issues successfully.
100+
func TestReportHealthIssue_ValidSession(t *testing.T) {
101+
storeMock := healthplatformmock.Mock(t)
102+
reg := &stubRegistry{validSessions: map[string]bool{"sess-123": true}}
103+
srv := serverWithStoreAndRegistry(storeMock, reg)
104+
105+
issue := &healthplatformpayload.Issue{Id: "adp-issue", IssueName: "adp-issue", Title: "ADP issue"}
106+
_, err := srv.ReportHealthIssue(context.Background(), &pb.ReportHealthIssueRequest{
107+
RemoteAgentSessionId: "sess-123",
108+
Issue: issue,
109+
})
110+
require.NoError(t, err)
111+
assert.NotNil(t, storeMock.GetIssue("adp-issue"))
112+
}
113+
114+
// TestReportHealthIssue_InvalidSession verifies that a stale or unknown session ID
115+
// is rejected with UNAUTHENTICATED.
116+
func TestReportHealthIssue_InvalidSession(t *testing.T) {
117+
reg := &stubRegistry{validSessions: map[string]bool{}}
118+
srv := serverWithStoreAndRegistry(healthplatformmock.Mock(t), reg)
119+
120+
_, err := srv.ReportHealthIssue(context.Background(), &pb.ReportHealthIssueRequest{
121+
RemoteAgentSessionId: "stale-session",
122+
Issue: &healthplatformpayload.Issue{Id: "x", IssueName: "x"},
123+
})
124+
require.Error(t, err)
125+
assert.Equal(t, codes.Unauthenticated, status.Code(err))
126+
}
127+
128+
// TestReportHealthIssue_SessionWithoutRegistry verifies that supplying a session ID
129+
// when the registry is not wired returns Unavailable.
130+
func TestReportHealthIssue_SessionWithoutRegistry(t *testing.T) {
131+
srv := serverWithStore(healthplatformmock.Mock(t)) // no registry
132+
133+
_, err := srv.ReportHealthIssue(context.Background(), &pb.ReportHealthIssueRequest{
134+
RemoteAgentSessionId: "some-session",
135+
Issue: &healthplatformpayload.Issue{Id: "x"},
136+
})
137+
require.Error(t, err)
138+
assert.Equal(t, codes.Unavailable, status.Code(err))
139+
}
140+
141+
// TestReportHealthIssue_NoSessionSubAgent verifies that sub-agents (no session ID)
142+
// can report issues without a registry.
143+
func TestReportHealthIssue_NoSessionSubAgent(t *testing.T) {
144+
storeMock := healthplatformmock.Mock(t)
145+
srv := serverWithStore(storeMock) // no registry — fine for sub-agents
146+
147+
_, err := srv.ReportHealthIssue(context.Background(), &pb.ReportHealthIssueRequest{
148+
Issue: &healthplatformpayload.Issue{Id: "sysprobe-issue", IssueName: "sysprobe-issue"},
149+
})
150+
require.NoError(t, err)
151+
assert.NotNil(t, storeMock.GetIssue("sysprobe-issue"))
152+
}
153+
154+
// ── ResolveHealthIssue ───────────────────────────────────────────────────────
155+
156+
func TestResolveHealthIssue_ClearsIssue(t *testing.T) {
157+
storeMock := healthplatformmock.Mock(t)
158+
srv := serverWithStore(storeMock)
159+
160+
require.NoError(t, storeMock.ReportIssue(&healthplatformpayload.Issue{Id: "to-resolve", IssueName: "to-resolve", Title: "active"}))
161+
require.NotNil(t, storeMock.GetIssue("to-resolve"))
162+
163+
_, err := srv.ResolveHealthIssue(context.Background(), &pb.ResolveHealthIssueRequest{IssueId: "to-resolve"})
164+
require.NoError(t, err)
165+
assert.Nil(t, storeMock.GetIssue("to-resolve"))
166+
}
167+
168+
func TestResolveHealthIssue_EmptyIssueID(t *testing.T) {
169+
srv := serverWithStore(healthplatformmock.Mock(t))
170+
171+
_, err := srv.ResolveHealthIssue(context.Background(), &pb.ResolveHealthIssueRequest{})
172+
require.Error(t, err)
173+
assert.Equal(t, codes.InvalidArgument, status.Code(err))
174+
}
175+
176+
// TestResolveHealthIssue_ValidSession verifies that a registered remote agent with a
177+
// valid session can resolve its own issues.
178+
func TestResolveHealthIssue_ValidSession(t *testing.T) {
179+
storeMock := healthplatformmock.Mock(t)
180+
reg := &stubRegistry{validSessions: map[string]bool{"sess-abc": true}}
181+
srv := serverWithStoreAndRegistry(storeMock, reg)
182+
183+
require.NoError(t, storeMock.ReportIssue(&healthplatformpayload.Issue{Id: "adp-resolved", IssueName: "adp-resolved"}))
184+
185+
_, err := srv.ResolveHealthIssue(context.Background(), &pb.ResolveHealthIssueRequest{
186+
RemoteAgentSessionId: "sess-abc",
187+
IssueId: "adp-resolved",
188+
})
189+
require.NoError(t, err)
190+
assert.Nil(t, storeMock.GetIssue("adp-resolved"))
191+
}
192+
193+
// TestResolveHealthIssue_InvalidSession verifies that a stale session is rejected.
194+
func TestResolveHealthIssue_InvalidSession(t *testing.T) {
195+
reg := &stubRegistry{validSessions: map[string]bool{}}
196+
srv := serverWithStoreAndRegistry(healthplatformmock.Mock(t), reg)
197+
198+
_, err := srv.ResolveHealthIssue(context.Background(), &pb.ResolveHealthIssueRequest{
199+
RemoteAgentSessionId: "stale",
200+
IssueId: "x",
201+
})
202+
require.Error(t, err)
203+
assert.Equal(t, codes.Unauthenticated, status.Code(err))
204+
}

comp/api/grpcserver/impl-agent/server.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
pidmap "github.com/DataDog/datadog-agent/comp/dogstatsd/pidmap/def"
3131
dsdReplay "github.com/DataDog/datadog-agent/comp/dogstatsd/replay/def"
3232
dogstatsdServer "github.com/DataDog/datadog-agent/comp/dogstatsd/server/def"
33+
healthplatformstore "github.com/DataDog/datadog-agent/comp/healthplatform/store/def"
3334
"github.com/DataDog/datadog-agent/comp/metadata/host/impl/hosttags"
3435
rcservice "github.com/DataDog/datadog-agent/comp/remote-config/rcservice/def"
3536
rcservicemrf "github.com/DataDog/datadog-agent/comp/remote-config/rcservicemrf/def"
@@ -60,6 +61,7 @@ type serverSecure struct {
6061
autodiscovery autodiscovery.Component
6162
configComp config.Component
6263
configStreamServer *configstreamServer.Server
64+
healthPlatformStore healthplatformstore.Component
6365
}
6466

6567
// remoteAgentServer implements the dedicated RemoteAgent gRPC service, which owns the remote agent lifecycle
@@ -303,6 +305,53 @@ func refreshRemoteAgent(registry remoteagentregistry.Component, in *pb.RefreshRe
303305
return &pb.RefreshRemoteAgentResponse{}, nil
304306
}
305307

308+
func (s *serverSecure) validateSessionID(sessionID string) error {
309+
if sessionID == "" {
310+
return nil
311+
}
312+
if s.remoteAgentRegistry == nil {
313+
return status.Error(codes.Unavailable, "remote agent registry not available")
314+
}
315+
if found := s.remoteAgentRegistry.RefreshRemoteAgent(sessionID); !found {
316+
return status.Error(codes.Unauthenticated, "invalid or expired remote agent session")
317+
}
318+
return nil
319+
}
320+
321+
func (s *serverSecure) ReportHealthIssue(_ context.Context, in *pb.ReportHealthIssueRequest) (*emptypb.Empty, error) {
322+
if err := s.validateSessionID(in.GetRemoteAgentSessionId()); err != nil {
323+
return nil, err
324+
}
325+
326+
issue := in.GetIssue()
327+
if issue == nil {
328+
return nil, status.Error(codes.InvalidArgument, "issue cannot be nil")
329+
}
330+
if issue.GetId() == "" {
331+
return nil, status.Error(codes.InvalidArgument, "issue id cannot be empty")
332+
}
333+
if issue.GetIssueName() == "" {
334+
return nil, status.Error(codes.InvalidArgument, "issue_name cannot be empty")
335+
}
336+
337+
if err := s.healthPlatformStore.ReportIssue(issue); err != nil {
338+
return nil, status.Errorf(codes.Internal, "failed to store issue: %v", err)
339+
}
340+
return &emptypb.Empty{}, nil
341+
}
342+
343+
func (s *serverSecure) ResolveHealthIssue(_ context.Context, in *pb.ResolveHealthIssueRequest) (*emptypb.Empty, error) {
344+
if err := s.validateSessionID(in.GetRemoteAgentSessionId()); err != nil {
345+
return nil, err
346+
}
347+
if in.GetIssueId() == "" {
348+
return nil, status.Error(codes.InvalidArgument, "issue_id cannot be empty")
349+
}
350+
351+
s.healthPlatformStore.ResolveIssue(in.GetIssueId())
352+
return &emptypb.Empty{}, nil
353+
}
354+
306355
func (s *serverSecure) AutodiscoveryStreamConfig(_ *emptypb.Empty, out pb.AgentSecure_AutodiscoveryStreamConfigServer) error {
307356
return autodiscoverystream.Config(s.autodiscovery, out)
308357
}

comp/collector/collector/impl/collector.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ func (c *collectorImpl) RunCheck(inner check.Check) (checkid.ID, error) {
211211
c.m.Lock()
212212
defer c.m.Unlock()
213213

214-
ch := middleware.NewCheckWrapper(inner, c.senderManager, c.agentTelemetry)
214+
ch := middleware.NewCheckWrapper(inner, c.senderManager, c.agentTelemetry, option.New[healthplatform.Component](c.healthPlatform))
215215

216216
var emptyID checkid.ID
217217

comp/collector/collector/impl/collector_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
logmock "github.com/DataDog/datadog-agent/comp/core/log/mock"
2525
compdef "github.com/DataDog/datadog-agent/comp/def"
2626
haagentmock "github.com/DataDog/datadog-agent/comp/haagent/mock"
27+
healthplatform "github.com/DataDog/datadog-agent/comp/healthplatform/store/def"
2728
healthplatformnoopimpl "github.com/DataDog/datadog-agent/comp/healthplatform/store/noop-impl"
2829
"github.com/DataDog/datadog-agent/pkg/aggregator"
2930
"github.com/DataDog/datadog-agent/pkg/collector/check"
@@ -189,7 +190,7 @@ func (suite *CollectorTestSuite) TestGet() {
189190
_, found := suite.c.get("bar")
190191
assert.False(suite.T(), found)
191192

192-
suite.c.checks["bar"] = middleware.NewCheckWrapper(NewCheck(), aggregator.NewNoOpSenderManager(), option.None[agenttelemetry.Component]())
193+
suite.c.checks["bar"] = middleware.NewCheckWrapper(NewCheck(), aggregator.NewNoOpSenderManager(), option.None[agenttelemetry.Component](), option.None[healthplatform.Component]())
193194
_, found = suite.c.get("foo")
194195
assert.False(suite.T(), found)
195196
c, found := suite.c.get("bar")

comp/collector/collector/impl/internal/middleware/BUILD.bazel

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ go_library(
1212
"//comp/core/agenttelemetry/def",
1313
"//comp/core/autodiscovery/integration",
1414
"//comp/core/diagnose/def",
15+
"//comp/healthplatform/store/def",
1516
"//pkg/aggregator/sender",
1617
"//pkg/collector/check",
1718
"//pkg/collector/check/id",
@@ -27,6 +28,7 @@ go_test(
2728
gotags = ["test"],
2829
deps = [
2930
"//comp/core/agenttelemetry/def",
31+
"//comp/healthplatform/store/def",
3032
"//pkg/collector/check",
3133
"//pkg/fleet/installer/telemetry",
3234
"//pkg/util/option",

0 commit comments

Comments
 (0)