Skip to content

Commit

Permalink
[componentstatus] Add Reporter interface (#10852)
Browse files Browse the repository at this point in the history
#### Description
Adds a `Reporter` interface that represents how a `component.Host`
implementation could expose the ability to report a status.

You can see how this interface will be used by looking at Related to
#10777

<!-- Issue number if applicable -->
#### Link to tracking issue
Related to
#10777
Related to
#10413

<!--Describe what testing was performed and which tests were added.-->
#### Testing
Added unit test
  • Loading branch information
TylerHelmuth authored Aug 13, 2024
1 parent 33247bb commit 23236b4
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 0 deletions.
25 changes: 25 additions & 0 deletions .chloggen/componentstatus-add-reporter-interface.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Use this changelog template to create an entry for release notes.

# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
change_type: enhancement

# The name of the component, or a single word describing the area of concern, (e.g. otlpreceiver)
component: componentstatus

# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
note: Add new Reporter interface to define how to report a status via a `component.Host` implementation

# One or more tracking issues or pull requests related to the change
issues: [10852]

# (Optional) One or more lines of additional information to render under the primary note.
# These lines will be padded with 2 spaces and then inserted directly into the document.
# Use pipe (|) for multiline entries.
subtext:

# Optional: The change log or logs in which this entry should be included.
# e.g. '[user]' or '[user, api]'
# Include 'user' if the change is relevant to end users.
# Include 'api' if there is a change to a library API.
# Default: '[user]'
change_logs: []
21 changes: 21 additions & 0 deletions component/componentstatus/status.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,20 @@ package componentstatus // import "go.opentelemetry.io/collector/component/compo

import (
"time"

"go.opentelemetry.io/collector/component"
)

// Reporter is an extra interface for `component.Host` implementations.
// A Reporter defines how to report a `componentstatus.Event`.
type Reporter interface {
// Report allows a component to report runtime changes in status. The service
// will automatically report status for a component during startup and shutdown. Components can
// use this method to report status after start and before shutdown. For more details about
// component status reporting see: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-status.md
Report(*Event)
}

// Watcher is an extra interface for Extension hosted by the OpenTelemetry
// Collector that is to be implemented by extensions interested in changes to component
// status.
Expand Down Expand Up @@ -137,3 +149,12 @@ func StatusIsError(status Status) bool {
status == StatusPermanentError ||
status == StatusFatalError
}

// ReportStatus is a helper function that handles checking if the component.Host has implemented Reporter.
// If it has, the Event is reported. Otherwise, nothing happens.
func ReportStatus(host component.Host, e *Event) {
statusReporter, ok := host.(Reporter)
if ok {
statusReporter.Report(e)
}
}
41 changes: 41 additions & 0 deletions component/componentstatus/status_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import (

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"

"go.opentelemetry.io/collector/component"
)

func TestNewStatusEvent(t *testing.T) {
Expand Down Expand Up @@ -88,3 +90,42 @@ func TestStatusIsError(t *testing.T) {
})
}
}

func Test_ReportStatus(t *testing.T) {
t.Run("Reporter implemented", func(t *testing.T) {
r := &reporter{}
ReportStatus(r, NewEvent(StatusOK))
require.True(t, r.reportStatusCalled)
})

t.Run("Reporter not implemented", func(t *testing.T) {
h := &host{}
ReportStatus(h, NewEvent(StatusOK))
require.False(t, h.reportStatusCalled)
})
}

var _ = (component.Host)(nil)
var _ = (Reporter)(nil)

type reporter struct {
reportStatusCalled bool
}

func (r *reporter) GetExtensions() map[component.ID]component.Component {
return nil
}

func (r *reporter) Report(_ *Event) {
r.reportStatusCalled = true
}

var _ = (component.Host)(nil)

type host struct {
reportStatusCalled bool
}

func (h *host) GetExtensions() map[component.ID]component.Component {
return nil
}

0 comments on commit 23236b4

Please sign in to comment.