| 295 | } |
| 296 | |
| 297 | func (c *zfsCollector) parsePoolObjsetFile(reader io.Reader, zpoolPath string, handler func(string, string, zfsSysctl, uint64)) error { |
| 298 | scanner := bufio.NewScanner(reader) |
| 299 | |
| 300 | parseLine := false |
| 301 | var zpoolName, datasetName string |
| 302 | for scanner.Scan() { |
| 303 | line := scanner.Text() |
| 304 | parts := strings.Fields(line) |
| 305 | |
| 306 | if !parseLine && len(parts) == 3 && parts[0] == "name" && parts[1] == "type" && parts[2] == "data" { |
| 307 | parseLine = true |
| 308 | continue |
| 309 | } |
| 310 | |
| 311 | if !parseLine || len(parts) < 3 { |
| 312 | continue |
| 313 | } |
| 314 | if parts[0] == "dataset_name" { |
| 315 | zpoolPathElements := strings.Split(zpoolPath, "/") |
| 316 | pathLen := len(zpoolPathElements) |
| 317 | zpoolName = zpoolPathElements[pathLen-2] |
| 318 | datasetName = line[strings.Index(line, parts[2]):] |
| 319 | continue |
| 320 | } |
| 321 | |
| 322 | if parts[1] == kstatDataUint64 { |
| 323 | key := fmt.Sprintf("kstat.zfs.misc.objset.%s", parts[0]) |
| 324 | value, err := strconv.ParseUint(parts[2], 10, 64) |
| 325 | if err != nil { |
| 326 | return fmt.Errorf("could not parse expected integer value for %q", key) |
| 327 | } |
| 328 | handler(zpoolName, datasetName, zfsSysctl(key), value) |
| 329 | } |
| 330 | } |
| 331 | if !parseLine { |
| 332 | return fmt.Errorf("did not parse a single %s %s metric", zpoolName, datasetName) |
| 333 | } |
| 334 | |
| 335 | return scanner.Err() |
| 336 | } |
| 337 | |
| 338 | func (c *zfsCollector) parsePoolStateFile(reader io.Reader, zpoolPath string, handler func(string, string, uint64)) error { |
| 339 | scanner := bufio.NewScanner(reader) |