master
go 151 lines 4.23 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 //go:build linux
4
5 package dmcache
6
7 import (
8 "fmt"
9 "strings"
10
11 "github.com/netdata/netdata/go/plugins/plugin/framework/collectorapi"
12 )
13
14 const (
15 prioDeviceCacheSpaceUsage = collectorapi.Priority + iota
16 prioDeviceMetaSpaceUsage
17 prioDeviceReadEfficiency
18 prioDeviceWriteEfficiency
19 prioDeviceActivity
20 prioDeviceDirty
21 )
22
23 var deviceChartsTmpl = collectorapi.Charts{
24 chartDeviceCacheSpaceUsageTmpl.Copy(),
25 chartDeviceMetadataSpaceUsageTmpl.Copy(),
26
27 chartDeviceReadEfficiencyTmpl.Copy(),
28 chartDeviceWriteEfficiencyTmpl.Copy(),
29
30 chartDeviceActivityTmpl.Copy(),
31
32 chartDeviceDirtySizeTmpl.Copy(),
33 }
34
35 var (
36 chartDeviceCacheSpaceUsageTmpl = collectorapi.Chart{
37 ID: "dmcache_device_%s_cache_space_usage",
38 Title: "DMCache space usage",
39 Units: "bytes",
40 Fam: "space usage",
41 Ctx: "dmcache.device_cache_space_usage",
42 Type: collectorapi.Stacked,
43 Priority: prioDeviceCacheSpaceUsage,
44 Dims: collectorapi.Dims{
45 {ID: "dmcache_device_%s_cache_free_bytes", Name: "free"},
46 {ID: "dmcache_device_%s_cache_used_bytes", Name: "used"},
47 },
48 }
49 chartDeviceMetadataSpaceUsageTmpl = collectorapi.Chart{
50 ID: "dmcache_device_%s_metadata_space_usage",
51 Title: "DMCache metadata space usage",
52 Units: "bytes",
53 Fam: "space usage",
54 Ctx: "dmcache.device_metadata_space_usage",
55 Type: collectorapi.Stacked,
56 Priority: prioDeviceMetaSpaceUsage,
57 Dims: collectorapi.Dims{
58 {ID: "dmcache_device_%s_metadata_free_bytes", Name: "free"},
59 {ID: "dmcache_device_%s_metadata_used_bytes", Name: "used"},
60 },
61 }
62 )
63
64 var (
65 chartDeviceReadEfficiencyTmpl = collectorapi.Chart{
66 ID: "dmcache_device_%s_read_efficiency",
67 Title: "DMCache read efficiency",
68 Units: "requests/s",
69 Fam: "efficiency",
70 Ctx: "dmcache.device_cache_read_efficiency",
71 Type: collectorapi.Stacked,
72 Priority: prioDeviceReadEfficiency,
73 Dims: collectorapi.Dims{
74 {ID: "dmcache_device_%s_read_hits", Name: "hits", Algo: collectorapi.Incremental},
75 {ID: "dmcache_device_%s_read_misses", Name: "misses", Algo: collectorapi.Incremental},
76 },
77 }
78 chartDeviceWriteEfficiencyTmpl = collectorapi.Chart{
79 ID: "dmcache_device_%s_write_efficiency",
80 Title: "DMCache write efficiency",
81 Units: "requests/s",
82 Fam: "efficiency",
83 Ctx: "dmcache.device_cache_write_efficiency",
84 Type: collectorapi.Stacked,
85 Priority: prioDeviceWriteEfficiency,
86 Dims: collectorapi.Dims{
87 {ID: "dmcache_device_%s_write_hits", Name: "hits", Algo: collectorapi.Incremental},
88 {ID: "dmcache_device_%s_write_misses", Name: "misses", Algo: collectorapi.Incremental},
89 },
90 }
91 )
92
93 var chartDeviceActivityTmpl = collectorapi.Chart{
94 ID: "dmcache_device_%s_activity",
95 Title: "DMCache activity",
96 Units: "bytes/s",
97 Fam: "activity",
98 Ctx: "dmcache.device_cache_activity",
99 Type: collectorapi.Area,
100 Priority: prioDeviceActivity,
101 Dims: collectorapi.Dims{
102 {ID: "dmcache_device_%s_promotions_bytes", Name: "promotions", Algo: collectorapi.Incremental},
103 {ID: "dmcache_device_%s_demotions_bytes", Name: "demotions", Mul: -1, Algo: collectorapi.Incremental},
104 },
105 }
106
107 var chartDeviceDirtySizeTmpl = collectorapi.Chart{
108 ID: "dmcache_device_%s_dirty_size",
109 Title: "DMCache dirty data size",
110 Units: "bytes",
111 Fam: "dirty size",
112 Ctx: "dmcache.device_cache_dirty_size",
113 Type: collectorapi.Area,
114 Priority: prioDeviceDirty,
115 Dims: collectorapi.Dims{
116 {ID: "dmcache_device_%s_dirty_bytes", Name: "dirty"},
117 },
118 }
119
120 func (c *Collector) addDeviceCharts(device string) {
121 charts := deviceChartsTmpl.Copy()
122
123 for _, chart := range *charts {
124 chart.ID = fmt.Sprintf(chart.ID, cleanDeviceName(device))
125 chart.Labels = []collectorapi.Label{
126 {Key: "device", Value: device},
127 }
128 for _, dim := range chart.Dims {
129 dim.ID = fmt.Sprintf(dim.ID, device)
130 }
131 }
132
133 if err := c.Charts().Add(*charts...); err != nil {
134 c.Warning(err)
135 }
136 }
137
138 func (c *Collector) removeDeviceCharts(device string) {
139 px := fmt.Sprintf("dmcache_device_%s_", cleanDeviceName(device))
140
141 for _, chart := range *c.Charts() {
142 if strings.HasPrefix(chart.ID, px) {
143 chart.MarkRemove()
144 chart.MarkNotCreated()
145 }
146 }
147 }
148
149 func cleanDeviceName(device string) string {
150 return strings.ReplaceAll(device, ".", "_")
151 }