metrics: fix build on other platforms
Some checks failed
Build / Goreleaser (push) Has been cancelled
Build / Upload artifacts-${{ matrix.os }}-${{ matrix.arch }} (amd64_v3, darwin) (push) Has been cancelled
Build / Upload artifacts-${{ matrix.os }}-${{ matrix.arch }} (amd64_v3, linux) (push) Has been cancelled
Build / Upload artifacts-${{ matrix.os }}-${{ matrix.arch }} (amd64_v3, windows) (push) Has been cancelled
Build / Upload artifacts-${{ matrix.os }}-${{ matrix.arch }} (arm64_v8.0, darwin) (push) Has been cancelled
Build / Upload artifacts-${{ matrix.os }}-${{ matrix.arch }} (arm64_v8.0, linux) (push) Has been cancelled
Build / Upload artifacts-${{ matrix.os }}-${{ matrix.arch }} (arm64_v8.0, windows) (push) Has been cancelled

This commit is contained in:
criyle 2025-04-03 21:39:01 -04:00
parent 052a482697
commit e7228aefbe
5 changed files with 126 additions and 111 deletions

View File

@ -2,16 +2,12 @@ package main
import (
"os"
"path"
"sync"
"time"
"github.com/criyle/go-judge/cmd/go-judge/config"
"github.com/criyle/go-judge/env/pool"
"github.com/criyle/go-judge/envexec"
"github.com/criyle/go-judge/filestore"
"github.com/criyle/go-judge/worker"
"github.com/criyle/go-sandbox/pkg/cgroup"
"github.com/prometheus/client_golang/prometheus"
)
@ -21,7 +17,6 @@ const (
filestoreSubsystem = "file"
environmentSubsystem = "environment"
workerSubsystem = "worker"
cgroupSubsystem = "cgroup"
)
var (
@ -269,106 +264,3 @@ func newMetricsWorker(w worker.Worker) worker.Worker {
prometheus.MustRegister(rt)
return rt
}
var _ prometheus.Collector = &cgroupMetrics{}
type cgroupMetrics struct {
cgroup cgroup.Cgroup
cgroupCPU *prometheus.Desc
cgroupMemory *prometheus.Desc
cgroupMaxMemory *prometheus.Desc
}
// Collect implements prometheus.Collector.
func (c *cgroupMetrics) Collect(ch chan<- prometheus.Metric) {
if u, err := c.cgroup.CPUUsage(); err == nil {
ch <- prometheus.MustNewConstMetric(
c.cgroupCPU, prometheus.CounterValue, time.Duration(u).Seconds(),
)
}
if m, err := c.cgroup.MemoryUsage(); err == nil {
ch <- prometheus.MustNewConstMetric(
c.cgroupMemory, prometheus.GaugeValue, float64(m),
)
}
if m, err := c.cgroup.MemoryMaxUsage(); err == nil {
ch <- prometheus.MustNewConstMetric(
c.cgroupMaxMemory, prometheus.GaugeValue, float64(m),
)
}
}
// Describe implements prometheus.Collector.
func (c *cgroupMetrics) Describe(ch chan<- *prometheus.Desc) {
prometheus.DescribeByCollect(c, ch)
}
func newCgroupMetrics(cg cgroup.Cgroup, label string) *cgroupMetrics {
cgroupCPU := prometheus.NewDesc(
prometheus.BuildFQName(metricsNamespace, cgroupSubsystem, "cpu_seconds"),
"CPU usage of the cgroup", nil, prometheus.Labels{"type": label},
)
cgroupMemory := prometheus.NewDesc(
prometheus.BuildFQName(metricsNamespace, cgroupSubsystem, "memory_bytes"),
"Memory usage of the cgroup", nil, prometheus.Labels{"type": label},
)
cgroupMaxMemory := prometheus.NewDesc(
prometheus.BuildFQName(metricsNamespace, cgroupSubsystem, "memory_max_bytes"),
"Maximum memory usage of the cgroup", nil, prometheus.Labels{"type": label},
)
rt := &cgroupMetrics{
cgroup: cg,
cgroupCPU: cgroupCPU,
cgroupMemory: cgroupMemory,
cgroupMaxMemory: cgroupMaxMemory,
}
prometheus.MustRegister(rt)
return rt
}
func initCgroupMetrics(conf *config.Config, param map[string]any) {
if !conf.EnableMetrics {
return
}
t, ok := param["cgroupType"]
if !ok {
return
}
ct, ok := t.(int)
if !ok {
return
}
if ct != cgroup.TypeV1 && ct != cgroup.TypeV2 {
return
}
prefix, err := cgroup.GetCurrentCgroupPrefix()
if err != nil {
return
}
// current cgroup is xxx/api, get the dir
prefix = path.Dir(prefix)
control, err := cgroup.GetAvailableControllerWithPrefix(prefix)
if err != nil {
return
}
cg, err := cgroup.New(prefix, control)
if err != nil {
return
}
newCgroupMetrics(cg, "all")
apiCg, err := cg.New("api")
if err != nil {
return
}
newCgroupMetrics(apiCg, "controller")
containersCg, err := cgroup.New(path.Join(prefix, "containers"), control)
if err != nil {
return
}
newCgroupMetrics(containersCg, "containers")
}

View File

@ -0,0 +1,115 @@
package main
import (
"path"
"time"
"github.com/criyle/go-judge/cmd/go-judge/config"
"github.com/criyle/go-sandbox/pkg/cgroup"
"github.com/prometheus/client_golang/prometheus"
)
const cgroupSubsystem = "cgroup"
var _ prometheus.Collector = &cgroupMetrics{}
type cgroupMetrics struct {
cgroup cgroup.Cgroup
cgroupCPU *prometheus.Desc
cgroupMemory *prometheus.Desc
cgroupMaxMemory *prometheus.Desc
}
// Collect implements prometheus.Collector.
func (c *cgroupMetrics) Collect(ch chan<- prometheus.Metric) {
if u, err := c.cgroup.CPUUsage(); err == nil {
ch <- prometheus.MustNewConstMetric(
c.cgroupCPU, prometheus.CounterValue, time.Duration(u).Seconds(),
)
}
if m, err := c.cgroup.MemoryUsage(); err == nil {
ch <- prometheus.MustNewConstMetric(
c.cgroupMemory, prometheus.GaugeValue, float64(m),
)
}
if m, err := c.cgroup.MemoryMaxUsage(); err == nil {
ch <- prometheus.MustNewConstMetric(
c.cgroupMaxMemory, prometheus.GaugeValue, float64(m),
)
}
}
// Describe implements prometheus.Collector.
func (c *cgroupMetrics) Describe(ch chan<- *prometheus.Desc) {
prometheus.DescribeByCollect(c, ch)
}
func newCgroupMetrics(cg cgroup.Cgroup, label string) *cgroupMetrics {
cgroupCPU := prometheus.NewDesc(
prometheus.BuildFQName(metricsNamespace, cgroupSubsystem, "cpu_seconds"),
"CPU usage of the cgroup", nil, prometheus.Labels{"type": label},
)
cgroupMemory := prometheus.NewDesc(
prometheus.BuildFQName(metricsNamespace, cgroupSubsystem, "memory_bytes"),
"Memory usage of the cgroup", nil, prometheus.Labels{"type": label},
)
cgroupMaxMemory := prometheus.NewDesc(
prometheus.BuildFQName(metricsNamespace, cgroupSubsystem, "memory_max_bytes"),
"Maximum memory usage of the cgroup", nil, prometheus.Labels{"type": label},
)
rt := &cgroupMetrics{
cgroup: cg,
cgroupCPU: cgroupCPU,
cgroupMemory: cgroupMemory,
cgroupMaxMemory: cgroupMaxMemory,
}
prometheus.MustRegister(rt)
return rt
}
func initCgroupMetrics(conf *config.Config, param map[string]any) {
if !conf.EnableMetrics {
return
}
t, ok := param["cgroupType"]
if !ok {
return
}
ct, ok := t.(int)
if !ok {
return
}
if ct != cgroup.TypeV1 && ct != cgroup.TypeV2 {
return
}
prefix, err := cgroup.GetCurrentCgroupPrefix()
if err != nil {
return
}
// current cgroup is xxx/api, get the dir
prefix = path.Dir(prefix)
control, err := cgroup.GetAvailableControllerWithPrefix(prefix)
if err != nil {
return
}
cg, err := cgroup.New(prefix, control)
if err != nil {
return
}
newCgroupMetrics(cg, "all")
apiCg, err := cg.New("api")
if err != nil {
return
}
newCgroupMetrics(apiCg, "controller")
containersCg, err := cgroup.New(path.Join(prefix, "containers"), control)
if err != nil {
return
}
newCgroupMetrics(containersCg, "containers")
}

View File

@ -0,0 +1,8 @@
//go:build !linux
package main
import "github.com/criyle/go-judge/cmd/go-judge/config"
func initCgroupMetrics(conf *config.Config, param map[string]any) {
}

2
go.mod
View File

@ -30,7 +30,7 @@ require (
)
require (
github.com/BurntSushi/toml v1.4.0 // indirect
github.com/BurntSushi/toml v1.5.0 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/bytedance/sonic v1.13.2 // indirect
github.com/bytedance/sonic/loader v0.2.4 // indirect

4
go.sum
View File

@ -1,7 +1,7 @@
cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I=
cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg=
github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0=
github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg=
github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/bytedance/sonic v1.13.2 h1:8/H1FempDZqC4VqjptGo14QQlJx8VdZJegxs6wwfqpQ=