返回 DeepSeek-Reasonix
metrics.go
根目录 / internal / extension / metrics.go
1 package extension
2
3 import (
4 "sync/atomic"
5 "time"
6 )
7
8 // LifecycleMetrics is a process-wide counter set for activation, drain,
9 // publish, and stale drops. Values are anonymous tallies only — no content.
10 type LifecycleMetrics struct {
11 Publishes atomic.Uint64
12 Drains atomic.Uint64
13 StaleDrops atomic.Uint64
14 AdmissionRejected atomic.Uint64
15 NoOpRebuilds atomic.Uint64
16 FullRebuilds atomic.Uint64
17 SubgraphRebuilds atomic.Uint64
18 SidecarAdopts atomic.Uint64
19 SidecarStarts atomic.Uint64
20 ActivateNanos atomic.Uint64 // cumulative activation duration
21 ActivateCount atomic.Uint64
22 DrainNanos atomic.Uint64
23 DrainCount atomic.Uint64
24 GraphBuildNanos atomic.Uint64
25 GraphBuildCount atomic.Uint64
26 PlanDiffNanos atomic.Uint64
27 PlanDiffCount atomic.Uint64
28 }
29
30 // DefaultLifecycleMetrics is the process-wide metrics instance.
31 var DefaultLifecycleMetrics = &LifecycleMetrics{}
32
33 // Snapshot returns a plain copy for doctor/diagnostics.
34 type LifecycleMetricsSnapshot struct {
35 Publishes uint64 `json:"publishes"`
36 Drains uint64 `json:"drains"`
37 StaleDrops uint64 `json:"staleDrops"`
38 AdmissionRejected uint64 `json:"admissionRejected"`
39 NoOpRebuilds uint64 `json:"noOpRebuilds"`
40 FullRebuilds uint64 `json:"fullRebuilds"`
41 SubgraphRebuilds uint64 `json:"subgraphRebuilds"`
42 SidecarAdopts uint64 `json:"sidecarAdopts"`
43 SidecarStarts uint64 `json:"sidecarStarts"`
44 ActivateAvgNanos uint64 `json:"activateAvgNanos"`
45 DrainAvgNanos uint64 `json:"drainAvgNanos"`
46 GraphBuildAvgNs uint64 `json:"graphBuildAvgNanos"`
47 PlanDiffAvgNanos uint64 `json:"planDiffAvgNanos"`
48 }
49
50 // Snapshot returns current counters with averaged timings.
51 func (m *LifecycleMetrics) Snapshot() LifecycleMetricsSnapshot {
52 if m == nil {
53 return LifecycleMetricsSnapshot{}
54 }
55 avg := func(total, count uint64) uint64 {
56 if count == 0 {
57 return 0
58 }
59 return total / count
60 }
61 return LifecycleMetricsSnapshot{
62 Publishes: m.Publishes.Load(),
63 Drains: m.Drains.Load(),
64 StaleDrops: m.StaleDrops.Load(),
65 AdmissionRejected: m.AdmissionRejected.Load(),
66 NoOpRebuilds: m.NoOpRebuilds.Load(),
67 FullRebuilds: m.FullRebuilds.Load(),
68 SubgraphRebuilds: m.SubgraphRebuilds.Load(),
69 SidecarAdopts: m.SidecarAdopts.Load(),
70 SidecarStarts: m.SidecarStarts.Load(),
71 ActivateAvgNanos: avg(m.ActivateNanos.Load(), m.ActivateCount.Load()),
72 DrainAvgNanos: avg(m.DrainNanos.Load(), m.DrainCount.Load()),
73 GraphBuildAvgNs: avg(m.GraphBuildNanos.Load(), m.GraphBuildCount.Load()),
74 PlanDiffAvgNanos: avg(m.PlanDiffNanos.Load(), m.PlanDiffCount.Load()),
75 }
76 }
77
78 // Observe records an elapsed duration into the named cumulative timer.
79 func (m *LifecycleMetrics) ObserveActivate(d time.Duration) {
80 if m == nil {
81 return
82 }
83 m.ActivateNanos.Add(uint64(d.Nanoseconds()))
84 m.ActivateCount.Add(1)
85 }
86
87 // ObserveDrain records drain duration.
88 func (m *LifecycleMetrics) ObserveDrain(d time.Duration) {
89 if m == nil {
90 return
91 }
92 m.DrainNanos.Add(uint64(d.Nanoseconds()))
93 m.DrainCount.Add(1)
94 }
95
96 // ObserveGraphBuild records dependency graph build duration.
97 func (m *LifecycleMetrics) ObserveGraphBuild(d time.Duration) {
98 if m == nil {
99 return
100 }
101 m.GraphBuildNanos.Add(uint64(d.Nanoseconds()))
102 m.GraphBuildCount.Add(1)
103 }
104
105 // ObservePlanDiff records plan diff duration.
106 func (m *LifecycleMetrics) ObservePlanDiff(d time.Duration) {
107 if m == nil {
108 return
109 }
110 m.PlanDiffNanos.Add(uint64(d.Nanoseconds()))
111 m.PlanDiffCount.Add(1)
112 }
113
113 lines GO