Skip to content

Commit eecb8db

Browse files
authored
Merge pull request #296 from coroot/async_profiler
add async-profiler support for Java applications (disabled by default)
2 parents 96f5277 + e5818fc commit eecb8db

File tree

17 files changed

+636
-116
lines changed

17 files changed

+636
-116
lines changed

.github/workflows/ci.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ jobs:
1313
- uses: actions/checkout@v4
1414
- uses: actions/setup-go@v5
1515
with:
16-
go-version: '1.23.8'
17-
- run: sudo apt install -y libsystemd-dev
16+
go-version: '1.24.9'
17+
- run: sudo apt update && sudo apt install -y libsystemd-dev
1818
- name: gofmt -l .
1919
run: files=$(gofmt -l .); if [[ -n "$files" ]]; then echo "$files"; exit 1; fi
2020
- name: goimports -l .

containers/container.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,8 @@ type Container struct {
139139
nodejsStats *ebpftracer.NodejsStats
140140
pythonStats *ebpftracer.PythonStats
141141

142+
jvmProfilingStats *JvmProfilingStats
143+
142144
mounts map[string]proc.MountInfo
143145
seenMounts map[uint64]struct{}
144146

@@ -373,7 +375,7 @@ func (c *Container) Collect(ch chan<- prometheus.Metric) {
373375
}
374376
switch {
375377
case proc.IsJvm(cmdline):
376-
jvm, jMetrics := jvmMetrics(pid)
378+
jvm, jMetrics := jvmMetrics(pid, c)
377379
if len(jMetrics) > 0 && !seenJvms[jvm] {
378380
seenJvms[jvm] = true
379381
for _, m := range jMetrics {
@@ -846,6 +848,18 @@ func (c *Container) updateDelays() {
846848
}
847849
}
848850

851+
func (c *Container) updateJvmProfilingStats(u *JvmProfilingUpdate) {
852+
c.lock.Lock()
853+
defer c.lock.Unlock()
854+
if c.jvmProfilingStats == nil {
855+
c.jvmProfilingStats = &JvmProfilingStats{}
856+
}
857+
c.jvmProfilingStats.AllocBytes += u.AllocBytes
858+
c.jvmProfilingStats.AllocObjects += u.AllocObjects
859+
c.jvmProfilingStats.LockContentions += u.LockContentions
860+
c.jvmProfilingStats.LockTimeNs += u.LockTimeNs
861+
}
862+
849863
func (c *Container) updateNodejsStats(s NodejsStatsUpdate) {
850864
c.lock.Lock()
851865
defer c.lock.Unlock()

containers/jvm.go

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@ import (
77
"time"
88

99
"github.com/coroot/coroot-node-agent/common"
10+
"github.com/coroot/coroot-node-agent/flags"
1011
"github.com/coroot/coroot-node-agent/proc"
1112
"github.com/prometheus/client_golang/prometheus"
1213
"github.com/xin053/hsperfdata"
1314
"k8s.io/klog/v2"
1415
)
1516

16-
func jvmMetrics(pid uint32) (string, []prometheus.Metric) {
17+
func jvmMetrics(pid uint32, c *Container) (string, []prometheus.Metric) {
1718
nsPid, err := proc.GetNsPid(pid)
1819
if err != nil {
1920
if !common.IsNotExist(err) {
@@ -42,15 +43,20 @@ func jvmMetrics(pid uint32) (string, []prometheus.Metric) {
4243
func() {
4344
size := float64(0)
4445
used := float64(0)
46+
maxSize := float64(0)
4547
for _, gen := range []int{0, 1} {
4648
spaces := pd.getInt64("sun.gc.generation.%d.spaces", gen)
4749
for s := 0; s < int(spaces); s++ {
4850
size += float64(pd.getInt64("sun.gc.generation.%d.space.%d.capacity", gen, s))
4951
used += float64(pd.getInt64("sun.gc.generation.%d.space.%d.used", gen, s))
52+
maxSize += float64(pd.getInt64("sun.gc.generation.%d.space.%d.maxCapacity", gen, s))
5053
}
5154
}
5255
res = append(res, gauge(metrics.JvmHeapSize, size, jvm))
5356
res = append(res, gauge(metrics.JvmHeapUsed, used, jvm))
57+
if maxSize > 0 {
58+
res = append(res, gauge(metrics.JvmHeapMaxSize, maxSize, jvm))
59+
}
5460
}()
5561

5662
gc := func(prefix string) {
@@ -66,6 +72,19 @@ func jvmMetrics(pid uint32) (string, []prometheus.Metric) {
6672

6773
res = append(res, counter(metrics.JvmSafepointTime, time.Duration(pd.getInt64("sun.rt.safepointTime")).Seconds(), jvm))
6874
res = append(res, counter(metrics.JvmSafepointSyncTime, time.Duration(pd.getInt64("sun.rt.safepointSyncTime")).Seconds(), jvm))
75+
76+
if *flags.EnableJavaAsyncProfiler {
77+
res = append(res, gauge(metrics.JvmProfilingStatus, 1, jvm))
78+
if s := c.jvmProfilingStats; s != nil {
79+
res = append(res, counter(metrics.JvmAllocBytes, float64(s.AllocBytes), jvm))
80+
res = append(res, counter(metrics.JvmAllocObjects, float64(s.AllocObjects), jvm))
81+
res = append(res, counter(metrics.JvmLockContentions, float64(s.LockContentions), jvm))
82+
res = append(res, counter(metrics.JvmLockTime, float64(s.LockTimeNs)/1e9, jvm))
83+
}
84+
} else {
85+
res = append(res, gauge(metrics.JvmProfilingStatus, 0, jvm))
86+
}
87+
6988
return jvm, res
7089
}
7190

containers/metrics.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,15 @@ var metrics = struct {
4949
JvmInfo *prometheus.Desc
5050
JvmHeapSize *prometheus.Desc
5151
JvmHeapUsed *prometheus.Desc
52+
JvmHeapMaxSize *prometheus.Desc
5253
JvmGCTime *prometheus.Desc
5354
JvmSafepointTime *prometheus.Desc
5455
JvmSafepointSyncTime *prometheus.Desc
56+
JvmAllocBytes *prometheus.Desc
57+
JvmAllocObjects *prometheus.Desc
58+
JvmLockContentions *prometheus.Desc
59+
JvmLockTime *prometheus.Desc
60+
JvmProfilingStatus *prometheus.Desc
5561

5662
PythonThreadLockWaitTime *prometheus.Desc
5763
NodejsEventLoopBlockedTime *prometheus.Desc
@@ -105,9 +111,15 @@ var metrics = struct {
105111
JvmInfo: metric("container_jvm_info", "Meta information about the JVM", "jvm", "java_version"),
106112
JvmHeapSize: metric("container_jvm_heap_size_bytes", "Total heap size in bytes", "jvm"),
107113
JvmHeapUsed: metric("container_jvm_heap_used_bytes", "Used heap size in bytes", "jvm"),
114+
JvmHeapMaxSize: metric("container_jvm_heap_max_size_bytes", "Maximum heap size in bytes (-Xmx)", "jvm"),
108115
JvmGCTime: metric("container_jvm_gc_time_seconds", "Time spent in the given JVM garbage collector in seconds", "jvm", "gc"),
109116
JvmSafepointTime: metric("container_jvm_safepoint_time_seconds", "Time the application has been stopped for safepoint operations in seconds", "jvm"),
110117
JvmSafepointSyncTime: metric("container_jvm_safepoint_sync_time_seconds", "Time spent getting to safepoints in seconds", "jvm"),
118+
JvmAllocBytes: metric("container_jvm_alloc_bytes_total", "Total bytes allocated observed by async-profiler", "jvm"),
119+
JvmAllocObjects: metric("container_jvm_alloc_objects_total", "Total objects allocated observed by async-profiler", "jvm"),
120+
JvmLockContentions: metric("container_jvm_lock_contentions_total", "Total number of lock contentions observed by async-profiler", "jvm"),
121+
JvmLockTime: metric("container_jvm_lock_time_seconds_total", "Total time spent waiting for locks observed by async-profiler", "jvm"),
122+
JvmProfilingStatus: metric("container_jvm_profiling_status", "1 if async-profiler is enabled, 0 if disabled", "jvm"),
111123

112124
Ip2Fqdn: metric("ip_to_fqdn", "Mapping IP addresses to FQDNs based on DNS requests initiated by containers", "ip", "fqdn"),
113125

containers/registry.go

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@ type Registry struct {
5656
ip2fqdn map[netaddr.IP]*common.Domain
5757
ip2fqdnLock sync.RWMutex
5858

59-
processInfoCh chan<- ProcessInfo
59+
processInfoCh chan<- ProcessInfo
60+
jvmProfilingUpdateCh chan *JvmProfilingUpdate
6061

6162
ebpfStatsLastUpdated time.Time
6263
ebpfStatsLock sync.Mutex
@@ -67,7 +68,7 @@ type Registry struct {
6768
gpuProcessUsageSampleChan chan gpu.ProcessUsageSample
6869
}
6970

70-
func NewRegistry(reg prometheus.Registerer, processInfoCh chan<- ProcessInfo, gpuProcessUsageSampleChan chan gpu.ProcessUsageSample) (*Registry, error) {
71+
func NewRegistry(reg prometheus.Registerer, processInfoCh chan<- ProcessInfo, jvmProfilingUpdateCh chan *JvmProfilingUpdate, gpuProcessUsageSampleChan chan gpu.ProcessUsageSample) (*Registry, error) {
7172
ns, err := proc.GetSelfNetNs()
7273
if err != nil {
7374
return nil, err
@@ -121,6 +122,7 @@ func NewRegistry(reg prometheus.Registerer, processInfoCh chan<- ProcessInfo, gp
121122
trafficStatsUpdateCh: make(chan *TrafficStatsUpdate),
122123
nodejsStatsUpdateCh: make(chan *NodejsStatsUpdate),
123124
pythonStatsUpdateCh: make(chan *PythonStatsUpdate),
125+
jvmProfilingUpdateCh: jvmProfilingUpdateCh,
124126

125127
gpuProcessUsageSampleChan: gpuProcessUsageSampleChan,
126128
}
@@ -229,6 +231,10 @@ func (r *Registry) handleEvents(ch <-chan ebpftracer.Event) {
229231
if c := r.containersByPid[u.Pid]; c != nil {
230232
c.updatePythonStats(*u)
231233
}
234+
case u := <-r.jvmProfilingUpdateCh:
235+
if c := r.containersByPid[u.Pid]; c != nil {
236+
c.updateJvmProfilingStats(u)
237+
}
232238
case sample := <-r.gpuProcessUsageSampleChan:
233239
if c := r.containersByPid[sample.Pid]; c != nil {
234240
if p := c.processes[sample.Pid]; p != nil {
@@ -597,3 +603,18 @@ type PythonStatsUpdate struct {
597603
Pid uint32
598604
Stats ebpftracer.PythonStats
599605
}
606+
607+
type JvmProfilingUpdate struct {
608+
Pid uint32
609+
AllocBytes int64
610+
AllocObjects int64
611+
LockContentions int64
612+
LockTimeNs int64
613+
}
614+
615+
type JvmProfilingStats struct {
616+
AllocBytes int64
617+
AllocObjects int64
618+
LockContentions int64
619+
LockTimeNs int64
620+
}

flags/flags.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,14 @@ import (
99
)
1010

1111
var (
12-
ListenAddress = kingpin.Flag("listen", "Listen address - ip:port or :port").Default("0.0.0.0:80").Envar("LISTEN").String()
13-
CgroupRoot = kingpin.Flag("cgroupfs-root", "The mount point of the host cgroupfs root").Default("/sys/fs/cgroup").Envar("CGROUPFS_ROOT").String()
14-
DisableLogParsing = kingpin.Flag("disable-log-parsing", "Disable container log parsing").Default("false").Envar("DISABLE_LOG_PARSING").Bool()
15-
DisablePinger = kingpin.Flag("disable-pinger", "Don't ping upstreams").Default("false").Envar("DISABLE_PINGER").Bool()
16-
DisableL7Tracing = kingpin.Flag("disable-l7-tracing", "Disable L7 tracing").Default("false").Envar("DISABLE_L7_TRACING").Bool()
17-
DisableGPUMonitoring = kingpin.Flag("disable-gpu-monitoring", "Disable GPU monitoring (NVML)").Default("false").Envar("DISABLE_GPU_MONITORING").Bool()
18-
EnableJavaTls = kingpin.Flag("enable-java-tls", "Enable Java TLS instrumentation via dynamic agent loading").Default("false").Envar("ENABLE_JAVA_TLS").Bool()
12+
ListenAddress = kingpin.Flag("listen", "Listen address - ip:port or :port").Default("0.0.0.0:80").Envar("LISTEN").String()
13+
CgroupRoot = kingpin.Flag("cgroupfs-root", "The mount point of the host cgroupfs root").Default("/sys/fs/cgroup").Envar("CGROUPFS_ROOT").String()
14+
DisableLogParsing = kingpin.Flag("disable-log-parsing", "Disable container log parsing").Default("false").Envar("DISABLE_LOG_PARSING").Bool()
15+
DisablePinger = kingpin.Flag("disable-pinger", "Don't ping upstreams").Default("false").Envar("DISABLE_PINGER").Bool()
16+
DisableL7Tracing = kingpin.Flag("disable-l7-tracing", "Disable L7 tracing").Default("false").Envar("DISABLE_L7_TRACING").Bool()
17+
DisableGPUMonitoring = kingpin.Flag("disable-gpu-monitoring", "Disable GPU monitoring (NVML)").Default("false").Envar("DISABLE_GPU_MONITORING").Bool()
18+
EnableJavaTls = kingpin.Flag("enable-java-tls", "Enable Java TLS instrumentation via dynamic agent loading").Default("false").Envar("ENABLE_JAVA_TLS").Bool()
19+
EnableJavaAsyncProfiler = kingpin.Flag("enable-java-async-profiler", "Enable Java profiling via async-profiler (CPU, memory allocations, lock contention)").Default("false").Envar("ENABLE_JAVA_ASYNC_PROFILER").Bool()
1920

2021
ContainerAllowlist = kingpin.Flag("container-allowlist", "List of allowed containers (regex patterns)").Envar("CONTAINER_ALLOWLIST").Strings()
2122
ContainerDenylist = kingpin.Flag("container-denylist", "List of denied containers (regex patterns)").Envar("CONTAINER_DENYLIST").Strings()

go.mod

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ require (
1818
github.com/gobwas/glob v0.2.3
1919
github.com/godbus/dbus/v5 v5.2.2
2020
github.com/golang/snappy v0.0.4
21+
github.com/google/pprof v0.0.0-20260202012954-cb029daf43ef
22+
github.com/grafana/jfr-parser v0.15.0
2123
github.com/grafana/pyroscope/ebpf v0.4.9
2224
github.com/jpillora/backoff v1.0.0
2325
github.com/mdlayher/taskstats v0.0.0-20230712191918-387b3d561d14
@@ -105,16 +107,15 @@ require (
105107
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect
106108
github.com/golang/protobuf v1.5.4 // indirect
107109
github.com/google/gnostic-models v0.6.8 // indirect
108-
github.com/google/go-cmp v0.6.0 // indirect
110+
github.com/google/go-cmp v0.7.0 // indirect
109111
github.com/google/gofuzz v1.2.0 // indirect
110-
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db // indirect
111112
github.com/google/uuid v1.6.0 // indirect
112113
github.com/gopacket/gopacket v1.3.1 // indirect
113114
github.com/grafana/regexp v0.0.0-20221123153739-15dc172cd2db // indirect
114115
github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect
115116
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
116117
github.com/hashicorp/hcl v1.0.1-vault-5 // indirect
117-
github.com/ianlancetaylor/demangle v0.0.0-20240312041847-bd984b5ce465 // indirect
118+
github.com/ianlancetaylor/demangle v0.0.0-20250417193237-f615e6bd150b // indirect
118119
github.com/inconshreveable/mousetrap v1.1.0 // indirect
119120
github.com/josharian/intern v1.0.0 // indirect
120121
github.com/josharian/native v1.1.0 // indirect
@@ -188,7 +189,7 @@ require (
188189
google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect
189190
google.golang.org/genproto/googleapis/rpc v0.0.0-20250102185135-69823020774d // indirect
190191
google.golang.org/grpc v1.69.2 // indirect
191-
google.golang.org/protobuf v1.36.5 // indirect
192+
google.golang.org/protobuf v1.36.11 // indirect
192193
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
193194
gopkg.in/inf.v0 v0.9.1 // indirect
194195
gopkg.in/ini.v1 v1.67.0 // indirect

go.sum

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -208,18 +208,20 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
208208
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
209209
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
210210
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
211-
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
212-
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
211+
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
212+
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
213213
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
214214
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
215215
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
216-
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo=
217-
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
216+
github.com/google/pprof v0.0.0-20260202012954-cb029daf43ef h1:xpF9fUHpoIrrjX24DURVKiwHcFpw19ndIs+FwTSMbno=
217+
github.com/google/pprof v0.0.0-20260202012954-cb029daf43ef/go.mod h1:MxpfABSjhmINe3F1It9d+8exIHFvUqtLIRCdOGNXqiI=
218218
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
219219
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
220220
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
221221
github.com/gopacket/gopacket v1.3.1 h1:ZppWyLrOJNZPe5XkdjLbtuTkfQoxQ0xyMJzQCqtqaPU=
222222
github.com/gopacket/gopacket v1.3.1/go.mod h1:3I13qcqSpB2R9fFQg866OOgzylYkZxLTmkvcXhvf6qg=
223+
github.com/grafana/jfr-parser v0.15.0 h1:CS78x/oV72Z+q17spr2N6AUFkucAWMKPwHYvj1uemWA=
224+
github.com/grafana/jfr-parser v0.15.0/go.mod h1:2vR91w+TYF6Jrw+WJMd/uyAiNxE2BUY5xOsvglXXe78=
223225
github.com/grafana/regexp v0.0.0-20221123153739-15dc172cd2db h1:7aN5cccjIqCLTzedH7MZzRZt5/lsAHch6Z3L2ZGn5FA=
224226
github.com/grafana/regexp v0.0.0-20221123153739-15dc172cd2db/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A=
225227
github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0=
@@ -228,8 +230,8 @@ github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs
228230
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
229231
github.com/hashicorp/hcl v1.0.1-vault-5 h1:kI3hhbbyzr4dldA8UdTb7ZlVVlI2DACdCfz31RPDgJM=
230232
github.com/hashicorp/hcl v1.0.1-vault-5/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM=
231-
github.com/ianlancetaylor/demangle v0.0.0-20240312041847-bd984b5ce465 h1:KwWnWVWCNtNq/ewIX7HIKnELmEx2nDP42yskD/pi7QE=
232-
github.com/ianlancetaylor/demangle v0.0.0-20240312041847-bd984b5ce465/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw=
233+
github.com/ianlancetaylor/demangle v0.0.0-20250417193237-f615e6bd150b h1:ogbOPx86mIhFy764gGkqnkFC8m5PJA7sPzlk9ppLVQA=
234+
github.com/ianlancetaylor/demangle v0.0.0-20250417193237-f615e6bd150b/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw=
233235
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
234236
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
235237
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
@@ -591,8 +593,8 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD
591593
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
592594
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
593595
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
594-
google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM=
595-
google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
596+
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
597+
google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
596598
gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc=
597599
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
598600
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
583 KB
Binary file not shown.
593 KB
Binary file not shown.

0 commit comments

Comments
 (0)