Skip to content

Commit

Permalink
[PIV-176] Bpfink metrics for logs/events caught (#34)
Browse files Browse the repository at this point in the history
  • Loading branch information
ramyahasini authored Jul 24, 2020
1 parent 4f78073 commit 699c0cb
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 5 deletions.
28 changes: 23 additions & 5 deletions cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,11 @@ type (
File string
IsDir bool
}

LogHook struct {
metric *pkg.Metrics
config Configuration
}
)

const (
Expand All @@ -68,6 +73,19 @@ const (
keySize = 16
)

// LogHook to send a graphite metric for each log entry
func (h LogHook) Run(e *zerolog.Event, level zerolog.Level, msg string) {
metrics, err := h.config.metrics()
if err != nil {
return
}
h.metric = metrics
h.metric.RecordByLogTypes(level.String())
if err = h.metric.Init(); err != nil {
return
}
}

func (c Configuration) logger() (logger zerolog.Logger) {
lvlMap := map[string]zerolog.Level{
"debug": zerolog.DebugLevel,
Expand All @@ -79,12 +97,12 @@ func (c Configuration) logger() (logger zerolog.Logger) {

if c.Debug {
logger = zerolog.New(zerolog.ConsoleWriter{Out: os.Stderr}).
With().Timestamp().Logger().Level(lvlMap["debug"])
With().Timestamp().Logger().Level(lvlMap["debug"]).Hook(LogHook{config: c})
} else {
// We can't use journald from rsyslog as it is way too complicated to find
// a good documentation on both of those projects
// logger = zerolog.New(journald.NewJournalDWriter()).Level(lvlMap[c.Level])
logger = zerolog.New(os.Stderr).Level(lvlMap[c.Level])
logger = zerolog.New(os.Stderr).Level(lvlMap[c.Level]).Hook(LogHook{config: c})
}
return logger
}
Expand Down Expand Up @@ -273,13 +291,11 @@ func (c Configuration) resolvePath(pathFull string) (string, os.FileInfo) {
}

func (c Configuration) metrics() (*pkg.Metrics, error) {
logger := c.logger()
metrics := &pkg.Metrics{
GraphiteHost: c.MetricsConfig.GraphiteHost,
Namespace: c.MetricsConfig.NameSpace,
GraphiteMode: c.MetricsConfig.GraphiteMode,
MetricsInterval: c.MetricsConfig.CollectionInterval,
Logger: logger,
}

hostname, err := os.Hostname()
Expand Down Expand Up @@ -308,7 +324,7 @@ func (c Configuration) metrics() (*pkg.Metrics, error) {
}
}
if err = file.Close(); err != nil {
logger.Error().Err(err)
return nil, err
}
}

Expand Down Expand Up @@ -392,6 +408,7 @@ func run() error {
Err(err).
Msgf("failed to init metrics: %v", err)
}
metrics.Logger = logger

if viper.GetInt("graphite-mode") != 0 {
metrics.GraphiteMode = viper.GetInt("graphite-mode")
Expand Down Expand Up @@ -421,6 +438,7 @@ func run() error {
if err != nil {
return err
}
watcher.Metrics = metrics
if err = metrics.Init(); err != nil {
return err
}
Expand Down
20 changes: 20 additions & 0 deletions pkg/graphite.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,26 @@ func (m *Metrics) Init() error {
return nil
}

// RecordByLogTypes sends count of different types of logs
func (m *Metrics) RecordByLogTypes(logType string) {
metricNameByHost := fmt.Sprintf("log_level.%s.by_host.%s.count.hourly", logType, quote(m.Hostname))
goMetrics.GetOrRegisterGauge(metricNameByHost, m.EveryHourRegister).Update(int64(1))
if m.RoleName != "" {
metricNameByRole := fmt.Sprintf("log_level.%s.by_role.%s.%s.count.hourly", logType, quote(m.RoleName), quote(m.Hostname))
goMetrics.GetOrRegisterGauge(metricNameByRole, m.EveryHourRegister).Update(int64(1))
}
}

// RecordByEventsCaught sends count of number of events caught by ebpf
func (m *Metrics) RecordByEventsCaught() {
metricNameByHost := fmt.Sprintf("bpf.events_caught.by_host.%s.count.hourly", quote(m.Hostname))
goMetrics.GetOrRegisterGauge(metricNameByHost, m.EveryHourRegister).Update(int64(1))
if m.RoleName != "" {
metricNameByRole := fmt.Sprintf("bpf.events_caught.by_role.%s.%s.count.hourly", quote(m.RoleName), quote(m.Hostname))
goMetrics.GetOrRegisterGauge(metricNameByRole, m.EveryHourRegister).Update(int64(1))
}
}

// RecordByInstalledHost graphite metric to show how manay host have bpfink installed
func (m *Metrics) RecordByInstalledHost() {
metricNameByHost := fmt.Sprintf("installed.by_host.%s.count.hourly", quote(m.Hostname))
Expand Down
3 changes: 3 additions & 0 deletions pkg/watcher.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ type (
CloseChannels chan struct{}
Excludes []string
Sudoers []string
Metrics *Metrics
}
// Register defines register interface for a watcher
Register interface {
Expand Down Expand Up @@ -232,6 +233,8 @@ func (w *Watcher) Start() error {
for {
select {
case event := <-w.Events:
// Send metric to graphite for every event caught, increement by 1
w.Metrics.RecordByEventsCaught()
switch event.Mode {
case dirCreate:
w.addInode(&event, true)
Expand Down

0 comments on commit 699c0cb

Please sign in to comment.