Skip to content

Commit f7f61cd

Browse files
committed
feat(inputs.cgroup): Support more cgroup v2 formats
1 parent 51cddd9 commit f7f61cd

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+521
-3
lines changed

plugins/inputs/cgroup/cgroup_linux.go

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ type fileFormat struct {
175175
}
176176

177177
const keyPattern = "[[:alnum:]:_.]+"
178-
const valuePattern = "[\\d-]+"
178+
const valuePattern = "(?:max|[\\d-\\.]+)"
179179

180180
var fileFormats = [...]fileFormat{
181181
// VAL\n
@@ -205,9 +205,9 @@ var fileFormats = [...]fileFormat{
205205
// VAL0 VAL1 ...\n
206206
{
207207
name: "Space separated values",
208-
pattern: "^(" + valuePattern + " )+\n$",
208+
pattern: "^(" + valuePattern + " ?)+\n$",
209209
parser: func(measurement string, fields map[string]interface{}, b []byte) {
210-
re := regexp.MustCompile("(" + valuePattern + ") ")
210+
re := regexp.MustCompile("(" + valuePattern + ")")
211211
matches := re.FindAllStringSubmatch(string(b), -1)
212212
for i, v := range matches {
213213
fields[measurement+"."+strconv.Itoa(i)] = numberOrString(v[1])
@@ -229,13 +229,60 @@ var fileFormats = [...]fileFormat{
229229
}
230230
},
231231
},
232+
// NAME0 KEY0=VAL0 ...\n
233+
// NAME1 KEY1=VAL1 ...\n
234+
// ...
235+
{
236+
name: "Equal sign separated key-value pairs, multiple lines with name",
237+
pattern: fmt.Sprintf("^(%s( %s=%s)+\n)+$", keyPattern, keyPattern, valuePattern),
238+
parser: func(measurement string, fields map[string]interface{}, b []byte) {
239+
lines := strings.Split(string(b), "\n")
240+
for _, line := range lines {
241+
f := strings.Fields(line)
242+
if len(f) == 0 {
243+
continue
244+
}
245+
name := f[0]
246+
for _, field := range f[1:] {
247+
k, v, found := strings.Cut(field, "=")
248+
if found {
249+
fields[strings.Join([]string{measurement, name, k}, ".")] = numberOrString(v)
250+
}
251+
252+
}
253+
254+
}
255+
},
256+
},
257+
// KEY0=VAL0 KEY1=VAL1 ...\n
258+
{
259+
name: "Equal sign separated key-value pairs on a single line",
260+
pattern: fmt.Sprintf("^(%s=%s ?)+\n$", keyPattern, valuePattern),
261+
parser: func(measurement string, fields map[string]interface{}, b []byte) {
262+
f := strings.Fields(string(b))
263+
if len(f) == 0 {
264+
return
265+
}
266+
for _, field := range f {
267+
k, v, found := strings.Cut(field, "=")
268+
if found {
269+
fields[strings.Join([]string{measurement, k}, ".")] = numberOrString(v)
270+
}
271+
272+
}
273+
},
274+
},
232275
}
233276

234277
func numberOrString(s string) interface{} {
235278
i, err := strconv.ParseInt(s, 10, 64)
236279
if err == nil {
237280
return i
238281
}
282+
f, err := strconv.ParseFloat(s, 64)
283+
if err == nil {
284+
return f
285+
}
239286

240287
return s
241288
}

0 commit comments

Comments
 (0)