Files
Piaras Hoban bc5fd1a357 feat(events): add events extension (#3045)
* feat: add events config

Signed-off-by: Piaras Hoban <phoban01@gmail.com>

* feat: implement event support with log sink

Signed-off-by: Piaras Hoban <phoban01@gmail.com>

* feat: integrate events and update tests

Signed-off-by: Piaras Hoban <phoban01@gmail.com>

* refactor: update event config

Signed-off-by: Piaras Hoban <phoban01@gmail.com>

* feat: implement http and nats sinks. remove log sink

Signed-off-by: Piaras Hoban <phoban01@gmail.com>

* refactor: events extension setup

Signed-off-by: Piaras Hoban <phoban01@gmail.com>

* chore: cleanup tests to use nil event recorder

Signed-off-by: Piaras Hoban <phoban01@gmail.com>

* chore: update events config example and add more logging

Signed-off-by: Piaras Hoban <phoban01@gmail.com>

* refactor: better use of build tags for minimal binary

Signed-off-by: Piaras Hoban <phoban01@gmail.com>

* fix: missing store param in evelated privileges tests

Signed-off-by: Piaras Hoban <phoban01@gmail.com>

* fix: regression in config decoding

Signed-off-by: Piaras Hoban <phoban01@gmail.com>

* chore: update check logs script to enable cross-platform usage via GREP_BIN_PATH envvar

Signed-off-by: Piaras Hoban <phoban01@gmail.com>

* chore: fix log lint issue for events

Signed-off-by: Piaras Hoban <phoban01@gmail.com>

* chore: fix failing events disabled test

Signed-off-by: Piaras Hoban <phoban01@gmail.com>

* test: add blackbox tests for events

Signed-off-by: Piaras Hoban <phoban01@gmail.com>

* chore: specify architecture when downloading binaries in Makefile

Signed-off-by: Piaras Hoban <phoban01@gmail.com>

* chore: improve failure handling when no valid sinks are provided

Signed-off-by: Piaras Hoban <phoban01@gmail.com>

* test: fix data race in events test

Signed-off-by: Piaras Hoban <phoban01@gmail.com>

* chore: cleanup event decoding

Signed-off-by: Piaras Hoban <phoban01@gmail.com>

* test: fix logging tests

Signed-off-by: Piaras Hoban <phoban01@gmail.com>

* test: make nats server test more reliable

Signed-off-by: Piaras Hoban <phoban01@gmail.com>

* chore: go mod cleanup

Signed-off-by: Piaras Hoban <phoban01@gmail.com>

* test: add sleep when setting up nats client

Signed-off-by: Piaras Hoban <phoban01@gmail.com>

* fix: ensure event sink errors do not propogate

Signed-off-by: Piaras Hoban <phoban01@gmail.com>

* test: increase coverage for events

Signed-off-by: Piaras Hoban <phoban01@gmail.com>

* feat(events): Refactor events to be non-blocking from caller.

Signed-off-by: Asgeir Nilsen <asgeir.nilsen@bouvet.no>
Signed-off-by: Piaras Hoban <phoban01@gmail.com>

* chore: remove harded-coded linux

Co-authored-by: Andrei Aaron <andreifdaaron@gmail.com>
Signed-off-by: Piaras Hoban <phoban01@gmail.com>

* feat(events): fail to start if incorrect event sink is configured

Signed-off-by: Piaras Hoban <phoban01@gmail.com>

* test: allow cli tests to return errors instead of panic

Signed-off-by: Piaras Hoban <phoban01@gmail.com>

* chore: bump nats server to v2.11.3

Signed-off-by: Piaras Hoban <phoban01@gmail.com>

---------

Signed-off-by: Piaras Hoban <phoban01@gmail.com>
Signed-off-by: Asgeir Nilsen <asgeir.nilsen@bouvet.no>
Co-authored-by: Asgeir Nilsen <asgeir.nilsen@bouvet.no>
Co-authored-by: Andrei Aaron <andreifdaaron@gmail.com>
2025-05-02 12:30:06 -07:00

101 lines
3.3 KiB
Bash
Executable File

#!/bin/bash
GREP_BIN=grep
if [ ! -z "$GREP_BIN_PATH" ]; then
GREP_BIN=$GREP_BIN_PATH
fi
# Colors for terminal
if test -t 1; then
# check if it supports colors
ncolors=$(tput colors)
if test -n "$ncolors" && test $ncolors -ge 8; then
NC="$(tput sgr0)" # no color
RED="$(tput setaf 1)" # red
WHITE="$(tput setaf 7)" # white
fi
fi
exception="(HTTP|OpenID|OAuth|TLS|API|ID)"
# the "nolint: check-logs" comment should be places on the last line that the linter matches
exclude_linter="(?!.*//nolint: check-logs)"
function lintLogContainingUpperCase {
word_char="[\.-0-9a-z ]"
capital_word="([a-z]*[A-Z][a-zA-Z]*)"
$GREP_BIN --with-filename -n -P "Msg[f]?\(\"(($word_char|$exception)*)(?!$exception)($capital_word)($exclude_linter)" $1
}
# lintLogStartingWithUpperCase searched for log messages that start with an upper case letter
function lintLogStartingWithUpperCase {
$GREP_BIN --with-filename -n "Msg[f]\?(\"[A-Z]" $1 | $GREP_BIN -v -P "Msg[f]?\(\"$exception($exclude_linter)"
}
# lintLogStartingWithComponent searches for log messages that starts with a component "component:"
function lintLogStartingWithComponent {
# We'll check for different functions that can generate errors or logs. If they start with
# a number words followed by ":", it's considered as starting with a component.
# Examples: '.Msgf("component:")', '.Errorf("com ponent:")', '.Msg("com-ponent:")'
$GREP_BIN --with-filename -n -E "(Errorf|errors.New|Msg[f]?)\(\"[a-zA-Z-]+( [a-zA-Z-]+){0,1}:($exclude_linter)" $1
}
# lintErrorLogsBeggining searches for log messages that don't start with "failed to"
function lintErrorLogsBeggining {
$GREP_BIN --with-filename -n -P "Error\(\)(?:.*)\n?.(?:.*)Msg[f]?\(\"(?!(failed to|failed due|invalid|unexpected|unsupported))($exclude_linter)" $1
}
function printLintError {
errReason=$1
errPathAndContent=$2
IFS=':' read -r errPath errLine errLineContent <<< "$errPathAndContent"
errLocation="$errPath:$errLine"
if test -t 1; then
echo -e "${WHITE}$errLocation${NC}: ${RED}$errReason${NC}\n\t$errLineContent"
else
echo "$errLocation: $errReason: $errLineContent"
fi
}
files=$(find . -name '*.go' | $GREP_BIN -v '_test.go')
found_linting_error=false
for file in $files
do
lintOutput=$(lintLogStartingWithUpperCase "$file")
if [ $? -eq 0 ]; then
found_linting_error=true
while IFS= read -r line; do
printLintError "Log message should not start with a CAPITAL letter" "$(echo $line | tr -s [:space:])"
done <<< "$lintOutput"
fi
lintOutput=$(lintLogStartingWithComponent "$file")
if [ $? -eq 0 ]; then
found_linting_error=true
while IFS= read -r line; do
printLintError "Log message should not start with the component (ex: 'component:', 'mixed component-with-dash:')" \
"$(echo $line | tr -s [:space:])"
done <<< "$lintOutput"
fi
lintOutput=$(lintErrorLogsBeggining "$file")
if [ $? -eq 0 ]; then
found_linting_error=true
while IFS= read -r line; do
printLintError "Error messages should start with 'failed to'" \
"$(echo $line | tr -s [:space:])"
done <<< "$lintOutput"
fi
done
if [ $found_linting_error = true ]; then
exit 1
fi
exit 0