Skip to content

Commit

Permalink
feat: add diagnostic to grpc server
Browse files Browse the repository at this point in the history
  • Loading branch information
josedonizetti committed Aug 16, 2023
1 parent 74da521 commit 6f01cca
Show file tree
Hide file tree
Showing 7 changed files with 86 additions and 6 deletions.
2 changes: 2 additions & 0 deletions go.mod
Expand Up @@ -173,3 +173,5 @@ require (
)

replace github.com/kubernetes/cri-api => k8s.io/cri-api v0.23.5-rc.0

replace github.com/aquasecurity/tracee/types v0.0.0-20230816112254-7c722620761f => ./types
1 change: 1 addition & 0 deletions pkg/cmd/flags/logger.go
Expand Up @@ -291,6 +291,7 @@ func PrepareLogger(logOptions []string, newBinary bool) (logger.LoggingConfig, e
llogger := logger.NewLogger(loggerCfg)
return logger.LoggingConfig{
Logger: llogger,
LoggerConfig: loggerCfg,
Filter: filter,
Aggregate: agg,
FlushInterval: interval,
Expand Down
2 changes: 1 addition & 1 deletion pkg/cmd/tracee.go
Expand Up @@ -47,7 +47,7 @@ func (r Runner) Run(ctx context.Context) error {

// start server if one is configured
if r.GRPCServer != nil {
go r.GRPCServer.Start(ctx)
go r.GRPCServer.Start(ctx, t)
}
},
)
Expand Down
6 changes: 3 additions & 3 deletions pkg/logger/logger.go
Expand Up @@ -88,7 +88,7 @@ const (
// Tracee offers aggregation and filtering support on top of any logger implementation complying to it's interface.
type LoggingConfig struct {
Logger LoggerInterface
loggerConfig LoggerConfig
LoggerConfig LoggerConfig
Filter LoggerFilter
Aggregate bool
FlushInterval time.Duration
Expand All @@ -105,7 +105,7 @@ type LoggerConfig struct {
// SetLevel sets the logging level of the package level logger.
// It is thread safe.
func (lc LoggingConfig) SetLevel(lvl Level) {
lc.loggerConfig.Level.SetLevel(lvl)
lc.LoggerConfig.Level.SetLevel(lvl)
}

func defaultEncoder() Encoder {
Expand All @@ -124,7 +124,7 @@ func NewDefaultLoggingConfig() LoggingConfig {
loggerConfig := NewDefaultLoggerConfig()
return LoggingConfig{
Logger: NewLogger(loggerConfig),
loggerConfig: loggerConfig,
LoggerConfig: loggerConfig,
Filter: NewLoggerFilter(),
Aggregate: false,
FlushInterval: DefaultFlushInterval,
Expand Down
75 changes: 75 additions & 0 deletions pkg/server/grpc/diagnostic.go
@@ -0,0 +1,75 @@
package grpc

import (
"context"
"runtime"

tracee "github.com/aquasecurity/tracee/pkg/ebpf"
"github.com/aquasecurity/tracee/pkg/logger"
pb "github.com/aquasecurity/tracee/types/api/v1beta1"
)

type DiagnosticService struct {
pb.UnimplementedDiagnosticServiceServer
tracee *tracee.Tracee
}

func (s *DiagnosticService) GetMetrics(ctx context.Context, in *pb.GetMetricsRequest) (*pb.GetMetricsResponse, error) {
stats := s.tracee.Stats()
metrics := &pb.GetMetricsResponse{
EventCount: stats.EventCount.Get(),
EventsFiltered: stats.EventsFiltered.Get(),
NetCapCount: stats.NetCapCount.Get(),
BPFLogsCount: stats.BPFLogsCount.Get(),
ErrorCount: stats.ErrorCount.Get(),
LostEvCount: stats.LostEvCount.Get(),
LostWrCount: stats.LostWrCount.Get(),
LostNtCapCount: stats.LostNtCapCount.Get(),
LostBPFLogsCount: stats.LostBPFLogsCount.Get(),
}

return metrics, nil
}

func (s *DiagnosticService) ChangeLogLevel(ctx context.Context, in *pb.ChangeLogLevelRequest) (*pb.ChangeLogLevelResponse, error) {
// default level
level := logger.InfoLevel

switch in.Level {
case pb.LogLevel_Debug:
level = logger.DebugLevel
case pb.LogLevel_Warn:
level = logger.WarnLevel
case pb.LogLevel_Error:
level = logger.ErrorLevel
case pb.LogLevel_DPanic:
level = logger.DPanicLevel
case pb.LogLevel_Panic:
level = logger.PanicLevel
case pb.LogLevel_Fatal:
level = logger.FatalLevel
}

logger.SetLevel(level)

return &pb.ChangeLogLevelResponse{}, nil
}

func (s *DiagnosticService) GetStacktrace(ctx context.Context, in *pb.GetStacktraceRequest) (*pb.GetStacktraceResponse, error) {
return &pb.GetStacktraceResponse{
Stacktrace: stack(),
}, nil
}

// This func is based on runtime.Stack(),
// but instead if pass true to runtime.Stack in order to include all goroutines.
func stack() []byte {
buf := make([]byte, 1024)
for {
n := runtime.Stack(buf, true)
if n < len(buf) {
return buf[:n]
}
buf = make([]byte, 2*len(buf))
}
}
4 changes: 3 additions & 1 deletion pkg/server/grpc/server.go
Expand Up @@ -8,6 +8,7 @@ import (
"google.golang.org/grpc"
"google.golang.org/grpc/keepalive"

tracee "github.com/aquasecurity/tracee/pkg/ebpf"
"github.com/aquasecurity/tracee/pkg/logger"
pb "github.com/aquasecurity/tracee/types/api/v1beta1"
)
Expand All @@ -31,7 +32,7 @@ func New(protocol, listenAddr string) (*Server, error) {
return &Server{listener: lis, protocol: protocol, listenAddr: listenAddr}, nil
}

func (s *Server) Start(ctx context.Context) {
func (s *Server) Start(ctx context.Context, t *tracee.Tracee) {
srvCtx, srvCancel := context.WithCancel(ctx)
defer srvCancel()

Expand All @@ -43,6 +44,7 @@ func (s *Server) Start(ctx context.Context) {

grpcServer := grpc.NewServer(grpc.KeepaliveParams(keepaliveParams))
pb.RegisterTraceeServiceServer(grpcServer, &TraceeService{})
pb.RegisterDiagnosticServiceServer(grpcServer, &DiagnosticService{tracee: t})

go func() {
logger.Debugw("Starting grpc server", "protocol", s.protocol, "address", s.listenAddr)
Expand Down
2 changes: 1 addition & 1 deletion pkg/server/grpc/server_test.go
Expand Up @@ -31,7 +31,7 @@ func TestServer(t *testing.T) {
t.Fatal(err)
}

go grpcServer.Start(ctx)
go grpcServer.Start(ctx, nil)

c := grpcClient("unix", unixSock)

Expand Down

0 comments on commit 6f01cca

Please sign in to comment.