observability(events): Adding telemetry flag and and telemetry sink event type with tests

This commit is contained in:
Sepehr authored and Jim committed 2023-09-22 11:31:42 -04:00
1 parent 16d86d601a
commit e278964422
12 files changed
+137 -1

No files matched your search

+8
View File
@@ -18,6 +18,7 @@ type EventFlags struct {
AuditEnabled *bool
ObservationsEnabled *bool
SysEventsEnabled *bool
TelemetryEnabled *bool
AllowFilters []string
DenyFilters []string
}
@@ -50,6 +51,7 @@ type ComposedOfEventArgs struct {
Observations string
Audit string
SysEvents string
Telemetry string
Allow []string
Deny []string
}
@@ -75,6 +77,12 @@ func NewEventFlags(defaultFormat event.SinkFormat, c ComposedOfEventArgs) (*Even
case "false":
f.ObservationsEnabled = &setFalse
}
switch strings.ToLower(c.Telemetry) {
case "true":
f.TelemetryEnabled = &setTrue
case "false":
f.TelemetryEnabled = &setFalse
}
switch strings.ToLower(c.Audit) {
case "true":
f.AuditEnabled = &setTrue
+18
View File
@@ -160,6 +160,24 @@ func Test_NewEventFlags(t *testing.T) {
SysEventsEnabled: &setFalse,
},
},
{
name: "telemetry-true",
defaultFormat: "cloudevents-json",
composedOf: ComposedOfEventArgs{Format: "cloudevents-json", Telemetry: "true"},
wantFlags: &EventFlags{
Format: "cloudevents-json",
TelemetryEnabled: &setTrue,
},
},
{
name: "telemetry-false",
defaultFormat: "cloudevents-json",
composedOf: ComposedOfEventArgs{Format: "cloudevents-json", Telemetry: "false"},
wantFlags: &EventFlags{
Format: "cloudevents-json",
TelemetryEnabled: &setFalse,
},
},
{
name: "valid-allow",
defaultFormat: "cloudevents-json",
+40
View File
@@ -301,12 +301,14 @@ func TestServer_SetupEventing(t *testing.T) {
AuditEnabled: &setTrue,
ObservationsEnabled: &setFalse,
SysEventsEnabled: &setFalse,
TelemetryEnabled: &setFalse,
})},
want: func() event.EventerConfig {
c := event.DefaultEventerConfig()
c.AuditEnabled = true
c.ObservationsEnabled = false
c.SysEventsEnabled = false
c.TelemetryEnabled = false
return *c
}(),
},
@@ -330,12 +332,14 @@ func TestServer_SetupEventing(t *testing.T) {
ObservationsEnabled: false,
SysEventsEnabled: false,
AuditEnabled: true,
TelemetryEnabled: false,
})},
want: func() event.EventerConfig {
c := event.DefaultEventerConfig()
c.AuditEnabled = true
c.ObservationsEnabled = false
c.SysEventsEnabled = false
c.TelemetryEnabled = false
return *c
}(),
},
@@ -354,6 +358,42 @@ func TestServer_SetupEventing(t *testing.T) {
wantErrIs: event.ErrInvalidParameter,
wantErrContains: "sink 0 is invalid",
},
{
name: "opts-eventer-config-observation-telemetry-invalid",
s: &Server{},
logger: testLogger,
lock: testLock,
opt: []Option{WithEventFlags(&EventFlags{
Format: event.JSONSinkFormat,
AuditEnabled: &setTrue,
ObservationsEnabled: &setFalse,
SysEventsEnabled: &setFalse,
TelemetryEnabled: &setTrue,
})},
wantErrIs: event.ErrInvalidParameter,
wantErrContains: "telemetry events require observation event to be enabled",
},
{
name: "opts-eventer-config-observation-on-telemetry-off",
s: &Server{},
logger: testLogger,
lock: testLock,
opt: []Option{WithEventFlags(&EventFlags{
Format: event.JSONSinkFormat,
AuditEnabled: &setFalse,
ObservationsEnabled: &setTrue,
SysEventsEnabled: &setFalse,
TelemetryEnabled: &setFalse,
})},
want: func() event.EventerConfig {
c := event.DefaultEventerConfig()
c.AuditEnabled = false
c.ObservationsEnabled = true
c.SysEventsEnabled = false
c.TelemetryEnabled = false
return *c
}(),
},
}
for _, tt := range tests {
+3
View File
@@ -200,6 +200,9 @@ func (b *Server) SetupEventing(ctx context.Context, logger hclog.Logger, seriali
if opts.withEventFlags.SysEventsEnabled != nil {
opts.withEventerConfig.SysEventsEnabled = *opts.withEventFlags.SysEventsEnabled
}
if opts.withEventFlags.TelemetryEnabled != nil {
opts.withEventerConfig.TelemetryEnabled = *opts.withEventFlags.TelemetryEnabled
}
if len(opts.withEventFlags.AllowFilters) > 0 {
for i := 0; i < len(opts.withEventerConfig.Sinks); i++ {
opts.withEventerConfig.Sinks[i].AllowFilters = opts.withEventFlags.AllowFilters
+8
View File
@@ -95,6 +95,7 @@ type Command struct {
flagEventFormat string
flagAudit string
flagObservations string
flagTelemetry string
flagSysEvents string
flagEveryEventAllowFilters []string
flagEveryEventDenyFilters []string
@@ -337,6 +338,12 @@ func (c *Command) Flags() *base.FlagSets {
Completion: complete.PredictSet("true", "false"),
Usage: `Emit observation events. Supported values are "true" and "false".`,
})
f.StringVar(&base.StringVar{
Name: "telemetry-events",
Target: &c.flagTelemetry,
Completion: complete.PredictSet("true", "false"),
Usage: `Emit telemetry events. Supported values are "true" and "false".`,
})
f.StringVar(&base.StringVar{
Name: "audit-events",
Target: &c.flagAudit,
@@ -646,6 +653,7 @@ func (c *Command) Run(args []string) int {
Format: c.flagEventFormat,
Audit: c.flagAudit,
Observations: c.flagObservations,
Telemetry: c.flagTelemetry,
SysEvents: c.flagSysEvents,
Allow: c.flagEveryEventAllowFilters,
Deny: c.flagEveryEventDenyFilters,
+1
View File
@@ -61,6 +61,7 @@ func TestCommand_Flags(t *testing.T) {
assert.Contains(completions, "-container-image")
assert.Contains(completions, "-event-format")
assert.Contains(completions, "-observation-events")
assert.Contains(completions, "-telemetry-events")
assert.Contains(completions, "-audit-events")
assert.Contains(completions, "-system-events")
assert.Contains(completions, "-audit-events")
+2 -1
View File
@@ -17,12 +17,13 @@ const (
ErrorType Type = "error" // ErrorType represents error events
SystemType Type = "system" // SysType represents system events
StorageType Type = "storage" // StorageType represents storage events
TelemetryType Type = "telemetry" // TelemetryType represents telemetry events
)
func (et Type) Validate() error {
const op = "event.(Type).Validate"
switch et {
case EveryType, ObservationType, AuditType, ErrorType, SystemType, StorageType:
case EveryType, ObservationType, AuditType, ErrorType, SystemType, StorageType, TelemetryType:
return nil
default:
return fmt.Errorf("%s: '%s' is not a valid event type: %w", op, et, ErrInvalidParameter)
+1
View File
@@ -601,6 +601,7 @@ func newFmtFilterNode(serverName string, c SinkConfig, opt ...Option) (eventlogg
func DefaultEventerConfig() *EventerConfig {
return &EventerConfig{
AuditEnabled: false,
TelemetryEnabled: false,
ObservationsEnabled: true,
SysEventsEnabled: true,
Sinks: []*SinkConfig{DefaultSink()},
+4
View File
@@ -12,6 +12,7 @@ type EventerConfig struct {
AuditEnabled bool `hcl:"audit_enabled"` // AuditEnabled specifies if audit events should be emitted.
ObservationsEnabled bool `hcl:"observations_enabled"` // ObservationsEnabled specifies if observation events should be emitted.
SysEventsEnabled bool `hcl:"sysevents_enabled"` // SysEventsEnabled specifies if sysevents should be emitted.
TelemetryEnabled bool `hcl:"telemetry_enabled"` // TelemetryEnabled specifies if telemetry events should be emitted.
Sinks []*SinkConfig `hcl:"-"` // Sinks are all the configured sinks
ErrorEventsDisabled bool `hcl:"-"` // ErrorEventsDisabled will disable error events from being emitted. This should only be used to turn off error events in tests.
}
@@ -25,5 +26,8 @@ func (c *EventerConfig) Validate() error {
return fmt.Errorf("%s: sink %d is invalid: %w", op, i, err)
}
}
if !c.ObservationsEnabled && c.TelemetryEnabled {
return fmt.Errorf("%s: telemetry events require observation event to be enabled: %w", op, ErrInvalidParameter)
}
return nil
}
+20
View File
@@ -33,6 +33,26 @@ func TestEventerConfig_Validate(t *testing.T) {
name: "valid-with-all-defaults",
c: EventerConfig{},
},
{
name: "valid-observation-telemetry-flag",
c: EventerConfig{
AuditEnabled: false,
ObservationsEnabled: true,
SysEventsEnabled: false,
TelemetryEnabled: true,
},
},
{
name: "invalid-observation-telemetry-flag",
c: EventerConfig{
AuditEnabled: false,
ObservationsEnabled: false,
SysEventsEnabled: false,
TelemetryEnabled: true,
},
wantErrIs: ErrInvalidParameter,
wantErrContains: "telemetry events require observation event to be enabled",
},
}
for _, tt := range tests {
+6
View File
@@ -6,6 +6,7 @@ package event
import (
"fmt"
"io"
"slices"
"time"
)
@@ -79,6 +80,11 @@ func (sc *SinkConfig) Validate() error {
return fmt.Errorf("%s: missing event types: %w", op, ErrInvalidParameter)
}
// This checks if the telemetry event is specified in the sink but the observation event is not specified.
if !slices.Contains(sc.EventTypes, ObservationType) && slices.Contains(sc.EventTypes, TelemetryType) {
return fmt.Errorf("%s: telemetry event type requires observation event type to be specified: %w", op, ErrInvalidParameter)
}
for _, et := range sc.EventTypes {
if err := et.Validate(); err != nil {
return fmt.Errorf("%s: %w", op, err)
+26
View File
@@ -207,6 +207,32 @@ func TestSinkConfig_Validate(t *testing.T) {
wantErrIs: ErrInvalidParameter,
wantErrContains: `too many sink type config blocks`,
},
{
name: "invalid observation, telemetry type",
sc: SinkConfig{
Name: "invalid observation, telemetry type",
EventTypes: []Type{TelemetryType, AuditType},
Type: FileSink,
Format: JSONSinkFormat,
FileConfig: &FileSinkTypeConfig{
FileName: "tmp.file",
},
},
wantErrIs: ErrInvalidParameter,
wantErrContains: `telemetry event type requires observation event type to be specified`,
},
{
name: "valid-observation-telemetry-type",
sc: SinkConfig{
Name: "valid",
EventTypes: []Type{ObservationType, TelemetryType, AuditType},
Type: FileSink,
FileConfig: &FileSinkTypeConfig{
FileName: "tmp.file",
},
Format: JSONSinkFormat,
},
},
{
name: "valid",
sc: SinkConfig{