master
go 124 lines 3.77 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package functions
4
5 import "github.com/netdata/netdata/go/plugins/pkg/metrix"
6
7 const functionsRuntimeMetricPrefix = "netdata.go.plugin.framework.functions.manager"
8
9 type managerRuntimeMetrics struct {
10 invocationsActive metrix.StatefulGauge
11 invocationsAwaitingResult metrix.StatefulGauge
12 schedulerPending metrix.StatefulGauge
13
14 functionCallsTotal metrix.StatefulCounter
15 cancelFallbackTotal metrix.StatefulCounter
16 lateTerminalDropped metrix.StatefulCounter
17 duplicateUIDIgnored metrix.StatefulCounter
18 }
19
20 func newManagerRuntimeMetrics(store metrix.RuntimeStore) *managerRuntimeMetrics {
21 if store == nil {
22 return nil
23 }
24
25 meter := store.Write().StatefulMeter(functionsRuntimeMetricPrefix)
26 metrics := &managerRuntimeMetrics{
27 invocationsActive: metrix.SeededGauge(meter,
28 "invocations_active",
29 metrix.WithDescription("Current number of active function invocations tracked by UID"),
30 metrix.WithChartFamily("Framework/Functions/Invocations"),
31 metrix.WithUnit("invocations"),
32 ),
33 invocationsAwaitingResult: metrix.SeededGauge(meter,
34 "invocations_awaiting_result",
35 metrix.WithDescription("Current number of active invocations waiting for terminal response"),
36 metrix.WithChartFamily("Framework/Functions/Invocations"),
37 metrix.WithUnit("invocations"),
38 ),
39 schedulerPending: metrix.SeededGauge(meter,
40 "scheduler_pending",
41 metrix.WithDescription("Current number of invocations pending in scheduler"),
42 metrix.WithChartFamily("Framework/Functions/Scheduler"),
43 metrix.WithUnit("invocations"),
44 ),
45 functionCallsTotal: metrix.SeededCounter(meter,
46 "calls_total",
47 metrix.WithDescription("Total number of parsed function call requests"),
48 metrix.WithChartFamily("Framework/Functions/Calls"),
49 metrix.WithUnit("calls"),
50 ),
51 cancelFallbackTotal: metrix.SeededCounter(meter,
52 "cancel_fallback_total",
53 metrix.WithDescription("Total number of function requests finalized by cancel fallback timer"),
54 metrix.WithChartFamily("Framework/Functions/Cancellation"),
55 metrix.WithUnit("requests"),
56 ),
57 lateTerminalDropped: metrix.SeededCounter(meter,
58 "late_terminal_dropped_total",
59 metrix.WithDescription("Total number of late terminal responses dropped by tombstone guard"),
60 metrix.WithChartFamily("Framework/Functions/Finalization"),
61 metrix.WithUnit("responses"),
62 ),
63 duplicateUIDIgnored: metrix.SeededCounter(meter,
64 "duplicate_uid_ignored_total",
65 metrix.WithDescription("Total number of duplicate transaction IDs ignored at admission"),
66 metrix.WithChartFamily("Framework/Functions/Admission"),
67 metrix.WithUnit("requests"),
68 ),
69 }
70
71 return metrics
72 }
73
74 func (m *Manager) observeInvocationsLocked() {
75 if m == nil || m.runtimeMetrics == nil {
76 return
77 }
78
79 active := len(m.invState)
80 awaiting := 0
81 for _, rec := range m.invState {
82 if rec != nil && rec.state == stateAwaitingResult {
83 awaiting++
84 }
85 }
86
87 m.runtimeMetrics.invocationsActive.Set(float64(active))
88 m.runtimeMetrics.invocationsAwaitingResult.Set(float64(awaiting))
89 }
90
91 func (m *Manager) observeSchedulerPending() {
92 if m == nil || m.runtimeMetrics == nil || m.scheduler == nil {
93 return
94 }
95 m.runtimeMetrics.schedulerPending.Set(float64(m.scheduler.pendingCount()))
96 }
97
98 func (m *Manager) observeFunctionCall() {
99 if m == nil || m.runtimeMetrics == nil {
100 return
101 }
102 m.runtimeMetrics.functionCallsTotal.Add(1)
103 }
104
105 func (m *Manager) observeCancelFallback() {
106 if m == nil || m.runtimeMetrics == nil {
107 return
108 }
109 m.runtimeMetrics.cancelFallbackTotal.Add(1)
110 }
111
112 func (m *Manager) observeLateTerminalDropped() {
113 if m == nil || m.runtimeMetrics == nil {
114 return
115 }
116 m.runtimeMetrics.lateTerminalDropped.Add(1)
117 }
118
119 func (m *Manager) observeDuplicateUIDIgnored() {
120 if m == nil || m.runtimeMetrics == nil {
121 return
122 }
123 m.runtimeMetrics.duplicateUIDIgnored.Add(1)
124 }