今日已办
当在Docker容器中运行程序时,可能会遇到使用os.Getpid()
函数时出现异常的情况。这是因为Docker容器中的进程隔离机制与宿主机器不同,容器内部的进程可能无法访问宿主机器的进程信息。
要解决这个问题,可以尝试:
使用docker run
命令启动容器时,添加--pid=host
选项,将容器与宿主机器共享进程命名空间。这样,容器内部的进程就可以访问宿主机器的进程信息。
需要注意的是,使用这种方法可能会破坏容器的隔离性,可能导致容器内部的进程与宿主机器的进程产生冲突。此外,该选项需要在启动容器时指定,无法在程序运行时动态设置。
sh
docker run --pid=host <image-name>
go
// createMemoryPercentObserver
// @Description createMemoryPercentObserver
// @Author xzx 2023-07-21 16:24:51
// @Param err
// @Param periodicMeter
func createMemoryPercentObserver(err error, periodicMeter metric.Meter) {
_, err = periodicMeter.Float64ObservableGauge(
"profile/memory_percent",
metric.WithFloat64Callback(func(ctx context.Context, observer metric.Float64Observer) error {
p, err2 := process.NewProcess(int32(os.Getpid()))
if err2 != nil {
return err2
}
memoryPercent, err2 := p.MemoryPercent()
if err2 != nil {
return err2
}
memoryPercent *= 100.0
log.Logger.Info(fmt.Sprintf("profile memory percentage: %f%%", memoryPercent))
observer.Observe(float64(memoryPercent))
return nil
}),
metric.WithDescription("the memory percentage of profile server"),
)
}
// createCpuPercentObserver
// @Description createCpuPercentObserver
// @Author xzx 2023-07-21 16:19:59
// @Param err
// @Param periodicMeter
// @Return error
func createCpuPercentObserver(err error, periodicMeter metric.Meter) error {
_, err = periodicMeter.Float64ObservableGauge(
"profile/cpu_percent",
metric.WithFloat64Callback(func(ctx context.Context, observer metric.Float64Observer) error {
p, err2 := process.NewProcess(int32(os.Getpid()))
if err2 != nil {
return err2
}
cpuPercent, err2 := p.CPUPercent()
if err2 != nil {
return err2
}
cpuPercent *= 100.0
log.Logger.Info(fmt.Sprintf("profile cpu percentage: %f%%", cpuPercent))
observer.Observe(cpuPercent)
return nil
}),
metric.WithDescription("the cpu percentage of profile server"),
)
return err
}