hanahmily commented on code in PR #919:
URL: 
https://github.com/apache/skywalking-banyandb/pull/919#discussion_r2689065159


##########
fodc/agent/internal/cmd/root.go:
##########
@@ -242,19 +320,92 @@ func runFODC(_ *cobra.Command, _ []string) error {
        // Graceful shutdown
        wd.GracefulStop()
 
+       if stopKTM != nil {
+               stopKTM()
+       }
+
        if proxyClient != nil {
                if disconnectErr := proxyClient.Disconnect(); disconnectErr != 
nil {
                        log.Warn().Err(disconnectErr).Msg("Error disconnecting 
proxy client")
                }
        }
 
-       if shutdownErr := metricsServer.Stop(); shutdownErr != nil {
+       if shutdownErr := metricsServer.Stop(ctx); shutdownErr != nil {
                log.Warn().Err(shutdownErr).Msg("Error shutting down metrics 
server")
        }
 
        return nil
 }
 
+func startKTM(ctx context.Context, log zerolog.Logger, fr 
*flightrecorder.FlightRecorder) (func(), error) {
+       if ktmInterval <= 0 {
+               return nil, fmt.Errorf("ktm-interval must be positive, got %v", 
ktmInterval)
+       }
+
+       ktmCfg := ktm.Config{
+               Enabled:  true,
+               Interval: ktmInterval,
+               Modules:  ktmModules,
+               EBPF:     iomonitor.EBPFConfig{},
+       }
+
+       zapLog, zapErr := zap.NewProduction()
+       if zapErr != nil {
+               return nil, fmt.Errorf("failed to create zap logger: %w", 
zapErr)
+       }
+
+       ktmSvc, createErr := ktm.NewKTM(ktmCfg, zapLog)
+       if createErr != nil {
+               return nil, fmt.Errorf("failed to create KTM: %w", createErr)
+       }
+
+       if startErr := ktmSvc.Start(ctx); startErr != nil {
+               return nil, fmt.Errorf("failed to start KTM: %w", startErr)
+       }
+
+       stopBridgeCh := make(chan struct{})
+       go func() {
+               ticker := time.NewTicker(ktmInterval)
+               defer ticker.Stop()
+
+               for {
+                       select {
+                       case <-ctx.Done():
+                               return
+                       case <-stopBridgeCh:
+                               return
+                       case <-ticker.C:
+                               store := ktmSvc.GetMetrics()
+                               if store == nil {
+                                       continue
+                               }
+                               rawMetrics := ktm.ToRawMetrics(store)
+                               // Add ktm_status metric: 2=Full, 1=Degraded
+                               ktmStatus := 2.0 // Full mode (cgroup+comm)
+                               if ktmSvc.IsDegraded() {
+                                       ktmStatus = 1.0 // Degraded mode 
(comm-only)
+                               }
+                               rawMetrics = append(rawMetrics, 
fodcmetrics.RawMetric{
+                                       Name:  "ktm_status",
+                                       Value: ktmStatus,
+                                       Desc:  "KTM status: 0=Disabled, 
1=Degraded (comm-only), 2=Full (cgroup+comm)",

Review Comment:
   ```suggestion
                                        Desc:  "KTM status: 1=Degraded 
(comm-only), 2=Full (cgroup+comm)",
   ```



##########
fodc/agent/internal/cmd/root.go:
##########
@@ -242,19 +320,92 @@ func runFODC(_ *cobra.Command, _ []string) error {
        // Graceful shutdown
        wd.GracefulStop()
 
+       if stopKTM != nil {
+               stopKTM()
+       }
+
        if proxyClient != nil {
                if disconnectErr := proxyClient.Disconnect(); disconnectErr != 
nil {
                        log.Warn().Err(disconnectErr).Msg("Error disconnecting 
proxy client")
                }
        }
 
-       if shutdownErr := metricsServer.Stop(); shutdownErr != nil {
+       if shutdownErr := metricsServer.Stop(ctx); shutdownErr != nil {
                log.Warn().Err(shutdownErr).Msg("Error shutting down metrics 
server")
        }
 
        return nil
 }
 
+func startKTM(ctx context.Context, log zerolog.Logger, fr 
*flightrecorder.FlightRecorder) (func(), error) {
+       if ktmInterval <= 0 {
+               return nil, fmt.Errorf("ktm-interval must be positive, got %v", 
ktmInterval)
+       }
+
+       ktmCfg := ktm.Config{
+               Enabled:  true,
+               Interval: ktmInterval,
+               Modules:  ktmModules,
+               EBPF:     iomonitor.EBPFConfig{},
+       }
+
+       zapLog, zapErr := zap.NewProduction()
+       if zapErr != nil {
+               return nil, fmt.Errorf("failed to create zap logger: %w", 
zapErr)
+       }
+
+       ktmSvc, createErr := ktm.NewKTM(ktmCfg, zapLog)
+       if createErr != nil {
+               return nil, fmt.Errorf("failed to create KTM: %w", createErr)
+       }
+
+       if startErr := ktmSvc.Start(ctx); startErr != nil {
+               return nil, fmt.Errorf("failed to start KTM: %w", startErr)
+       }
+
+       stopBridgeCh := make(chan struct{})
+       go func() {
+               ticker := time.NewTicker(ktmInterval)
+               defer ticker.Stop()
+
+               for {
+                       select {
+                       case <-ctx.Done():
+                               return
+                       case <-stopBridgeCh:
+                               return
+                       case <-ticker.C:
+                               store := ktmSvc.GetMetrics()
+                               if store == nil {
+                                       continue
+                               }
+                               rawMetrics := ktm.ToRawMetrics(store)
+                               // Add ktm_status metric: 2=Full, 1=Degraded
+                               ktmStatus := 2.0 // Full mode (cgroup+comm)
+                               if ktmSvc.IsDegraded() {
+                                       ktmStatus = 1.0 // Degraded mode 
(comm-only)
+                               }
+                               rawMetrics = append(rawMetrics, 
fodcmetrics.RawMetric{
+                                       Name:  "ktm_status",
+                                       Value: ktmStatus,
+                                       Desc:  "KTM status: 0=Disabled, 
1=Degraded (comm-only), 2=Full (cgroup+comm)",
+                               })
+                               if len(rawMetrics) == 0 {
+                                       continue
+                               }

Review Comment:
   ```suggestion
   ```



##########
fodc/agent/internal/cmd/root.go:
##########
@@ -242,19 +320,92 @@ func runFODC(_ *cobra.Command, _ []string) error {
        // Graceful shutdown
        wd.GracefulStop()
 
+       if stopKTM != nil {
+               stopKTM()
+       }
+
        if proxyClient != nil {
                if disconnectErr := proxyClient.Disconnect(); disconnectErr != 
nil {
                        log.Warn().Err(disconnectErr).Msg("Error disconnecting 
proxy client")
                }
        }
 
-       if shutdownErr := metricsServer.Stop(); shutdownErr != nil {
+       if shutdownErr := metricsServer.Stop(ctx); shutdownErr != nil {
                log.Warn().Err(shutdownErr).Msg("Error shutting down metrics 
server")
        }
 
        return nil
 }
 
+func startKTM(ctx context.Context, log zerolog.Logger, fr 
*flightrecorder.FlightRecorder) (func(), error) {
+       if ktmInterval <= 0 {
+               return nil, fmt.Errorf("ktm-interval must be positive, got %v", 
ktmInterval)
+       }
+
+       ktmCfg := ktm.Config{
+               Enabled:  true,
+               Interval: ktmInterval,
+               Modules:  ktmModules,
+               EBPF:     iomonitor.EBPFConfig{},

Review Comment:
   ```suggestion
   ```
   
   It can be initialized implicitly. 



##########
fodc/agent/internal/cmd/root.go:
##########
@@ -242,19 +320,92 @@ func runFODC(_ *cobra.Command, _ []string) error {
        // Graceful shutdown
        wd.GracefulStop()
 
+       if stopKTM != nil {
+               stopKTM()
+       }
+
        if proxyClient != nil {
                if disconnectErr := proxyClient.Disconnect(); disconnectErr != 
nil {
                        log.Warn().Err(disconnectErr).Msg("Error disconnecting 
proxy client")
                }
        }
 
-       if shutdownErr := metricsServer.Stop(); shutdownErr != nil {
+       if shutdownErr := metricsServer.Stop(ctx); shutdownErr != nil {
                log.Warn().Err(shutdownErr).Msg("Error shutting down metrics 
server")
        }
 
        return nil
 }
 
+func startKTM(ctx context.Context, log zerolog.Logger, fr 
*flightrecorder.FlightRecorder) (func(), error) {
+       if ktmInterval <= 0 {
+               return nil, fmt.Errorf("ktm-interval must be positive, got %v", 
ktmInterval)
+       }
+
+       ktmCfg := ktm.Config{
+               Enabled:  true,

Review Comment:
   typo? 
   
   ```suggestion
                Enabled:  ktmEnabled,
   ```



##########
fodc/agent/internal/cmd/root.go:
##########
@@ -242,19 +320,92 @@ func runFODC(_ *cobra.Command, _ []string) error {
        // Graceful shutdown
        wd.GracefulStop()
 
+       if stopKTM != nil {
+               stopKTM()
+       }
+
        if proxyClient != nil {
                if disconnectErr := proxyClient.Disconnect(); disconnectErr != 
nil {
                        log.Warn().Err(disconnectErr).Msg("Error disconnecting 
proxy client")
                }
        }
 
-       if shutdownErr := metricsServer.Stop(); shutdownErr != nil {
+       if shutdownErr := metricsServer.Stop(ctx); shutdownErr != nil {
                log.Warn().Err(shutdownErr).Msg("Error shutting down metrics 
server")
        }
 
        return nil
 }
 
+func startKTM(ctx context.Context, log zerolog.Logger, fr 
*flightrecorder.FlightRecorder) (func(), error) {
+       if ktmInterval <= 0 {
+               return nil, fmt.Errorf("ktm-interval must be positive, got %v", 
ktmInterval)
+       }
+
+       ktmCfg := ktm.Config{
+               Enabled:  true,
+               Interval: ktmInterval,
+               Modules:  ktmModules,
+               EBPF:     iomonitor.EBPFConfig{},
+       }
+
+       zapLog, zapErr := zap.NewProduction()

Review Comment:
   Please stick to "zerolog" so we don't have to maintain two separate log 
systems.



##########
fodc/agent/internal/cmd/root.go:
##########
@@ -242,19 +320,92 @@ func runFODC(_ *cobra.Command, _ []string) error {
        // Graceful shutdown
        wd.GracefulStop()
 
+       if stopKTM != nil {
+               stopKTM()
+       }
+
        if proxyClient != nil {
                if disconnectErr := proxyClient.Disconnect(); disconnectErr != 
nil {
                        log.Warn().Err(disconnectErr).Msg("Error disconnecting 
proxy client")
                }
        }
 
-       if shutdownErr := metricsServer.Stop(); shutdownErr != nil {
+       if shutdownErr := metricsServer.Stop(ctx); shutdownErr != nil {
                log.Warn().Err(shutdownErr).Msg("Error shutting down metrics 
server")
        }
 
        return nil
 }
 
+func startKTM(ctx context.Context, log zerolog.Logger, fr 
*flightrecorder.FlightRecorder) (func(), error) {
+       if ktmInterval <= 0 {
+               return nil, fmt.Errorf("ktm-interval must be positive, got %v", 
ktmInterval)
+       }
+
+       ktmCfg := ktm.Config{
+               Enabled:  true,
+               Interval: ktmInterval,
+               Modules:  ktmModules,
+               EBPF:     iomonitor.EBPFConfig{},
+       }
+
+       zapLog, zapErr := zap.NewProduction()
+       if zapErr != nil {
+               return nil, fmt.Errorf("failed to create zap logger: %w", 
zapErr)
+       }
+
+       ktmSvc, createErr := ktm.NewKTM(ktmCfg, zapLog)
+       if createErr != nil {
+               return nil, fmt.Errorf("failed to create KTM: %w", createErr)
+       }
+
+       if startErr := ktmSvc.Start(ctx); startErr != nil {
+               return nil, fmt.Errorf("failed to start KTM: %w", startErr)
+       }
+
+       stopBridgeCh := make(chan struct{})
+       go func() {
+               ticker := time.NewTicker(ktmInterval)
+               defer ticker.Stop()
+
+               for {
+                       select {
+                       case <-ctx.Done():
+                               return
+                       case <-stopBridgeCh:
+                               return
+                       case <-ticker.C:
+                               store := ktmSvc.GetMetrics()
+                               if store == nil {
+                                       continue
+                               }
+                               rawMetrics := ktm.ToRawMetrics(store)

Review Comment:
   ```suggestion
                                rawMetrics := ktm.ToRawMetrics(store)
                                if len(rawMetrics) == 0 {
                                        continue
                                }
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to