This is an automated email from the ASF dual-hosted git repository.

wusheng pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/skywalking-rover.git


The following commit(s) were added to refs/heads/main by this push:
     new aa05b04  Fix the protocol logs may be missing if the process is 
short-lived (#135)
aa05b04 is described below

commit aa05b04dcc84275534066894334dff290c715de9
Author: mrproliu <[email protected]>
AuthorDate: Tue Jul 30 18:43:26 2024 +0800

    Fix the protocol logs may be missing if the process is short-lived (#135)
---
 CHANGES.md                         |  1 +
 pkg/accesslog/common/connection.go | 12 ++++++++----
 pkg/accesslog/runner.go            | 23 +++++++++++++++++++++--
 3 files changed, 30 insertions(+), 6 deletions(-)

diff --git a/CHANGES.md b/CHANGES.md
index 9df9eb7..3b22bba 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -16,6 +16,7 @@ Release Notes.
 * Fix concurrent map operation in the access log module.
 * Fix the profiling cannot found process issue.
 * Fix cannot translate peer address in some UDP scenarios.
+* Fix the protocol logs may be missing if the process is short-lived.
 
 #### Documentation
 
diff --git a/pkg/accesslog/common/connection.go 
b/pkg/accesslog/common/connection.go
index e339a02..72fbce4 100644
--- a/pkg/accesslog/common/connection.go
+++ b/pkg/accesslog/common/connection.go
@@ -570,7 +570,7 @@ func (c *ConnectionManager) 
updateMonitorStatusForProcess(pid int32, monitor boo
 func (c *ConnectionManager) OnBuildConnectionLogFinished() {
        // delete all connections which marked as deletable
        // all deletable connection events been sent
-       deletableConnections := make([]string, 0)
+       deletableConnections := make(map[string]bool, 0)
        c.connections.IterCb(func(key string, v interface{}) {
                con, ok := v.(*ConnectionInfo)
                if !ok || con == nil {
@@ -580,22 +580,26 @@ func (c *ConnectionManager) 
OnBuildConnectionLogFinished() {
                shouldDelete := con.MarkDeletable || 
!c.ProcessIsMonitor(con.PID)
 
                if shouldDelete {
-                       deletableConnections = append(deletableConnections, key)
+                       deletableConnections[key] = true
                }
        })
 
        deleteFromUnfinished := make([]string, 0)
        for conKey, processorFinished := range c.allUnfinishedConnections {
                if *processorFinished {
-                       deletableConnections = append(deletableConnections, 
conKey)
+                       deletableConnections[conKey] = true
                        deleteFromUnfinished = append(deleteFromUnfinished, 
conKey)
+               } else {
+                       // if the processor not finished, then ignore it from 
deletable connections
+                       delete(deletableConnections, conKey)
                }
        }
        for _, key := range deleteFromUnfinished {
                delete(c.allUnfinishedConnections, key)
        }
 
-       for _, key := range deletableConnections {
+       for key := range deletableConnections {
+               log.Debugf("deleting the connection in manager: %s", key)
                c.connections.Remove(key)
        }
 }
diff --git a/pkg/accesslog/runner.go b/pkg/accesslog/runner.go
index befac3a..8164e81 100644
--- a/pkg/accesslog/runner.go
+++ b/pkg/accesslog/runner.go
@@ -22,6 +22,8 @@ import (
        "fmt"
        "time"
 
+       process2 "github.com/shirou/gopsutil/process"
+
        "github.com/sirupsen/logrus"
 
        "github.com/apache/skywalking-rover/pkg/accesslog/bpf"
@@ -284,6 +286,23 @@ func (r *Runner) convertTimeToInstant(t time.Time) 
*v32.Instant {
        }
 }
 
+func (r *Runner) shouldReportProcessLog(pid uint32) bool {
+       // if the process not monitoring, then check the process is existed or 
not
+       if r.context.ConnectionMgr.ProcessIsMonitor(pid) {
+               return true
+       }
+       exists, err := process2.PidExists(int32(pid))
+       if err != nil {
+               log.Warnf("check pid exists error, pid: %d, error: %v", pid, 
err)
+               return false
+       }
+       if exists {
+               return false
+       }
+       log.Debugf("the log should be also uploaded because the process quick 
shutdown but the log exist, pid: %d", pid)
+       return true
+}
+
 func (r *Runner) buildProtocolLog(protocolLog *common.ProtocolLog) 
(*common.ConnectionInfo,
        []*v3.AccessLogKernelLog, *v3.AccessLogProtocolLogs, bool) {
        if len(protocolLog.KernelLogs) == 0 {
@@ -292,7 +311,7 @@ func (r *Runner) buildProtocolLog(protocolLog 
*common.ProtocolLog) (*common.Conn
        firstKernelLog := protocolLog.KernelLogs[0]
        pid, _ := events.ParseConnectionID(firstKernelLog.GetConnectionID())
        // if the process not monitoring, then ignore it
-       if !r.context.ConnectionMgr.ProcessIsMonitor(pid) {
+       if !r.shouldReportProcessLog(pid) {
                return nil, nil, nil, false
        }
        connection := r.context.ConnectionMgr.Find(firstKernelLog)
@@ -319,7 +338,7 @@ func (r *Runner) buildProtocolLog(protocolLog 
*common.ProtocolLog) (*common.Conn
 func (r *Runner) buildKernelLog(kernelLog *common.KernelLog) 
(*common.ConnectionInfo, *v3.AccessLogKernelLog, bool) {
        pid, _ := events.ParseConnectionID(kernelLog.Event.GetConnectionID())
        // if the process not monitoring, then ignore it
-       if !r.context.ConnectionMgr.ProcessIsMonitor(pid) {
+       if !r.shouldReportProcessLog(pid) {
                return nil, nil, false
        }
        connection := r.context.ConnectionMgr.Find(kernelLog.Event)

Reply via email to