code: func deviceStatsToDatapoints(stats []IODeviceStats, prefix string, baseTags map[string]string, ts string) []producers.Datapoint {
  	var datapoints []producers.Datapoint
  
  	for _, stat := range stats {
  		dev := devTotal
  		if stat.Device.Major > 0 {
  			dev = fmt.Sprintf("%d:%d", stat.Device.Major, stat.Device.Minor)
  		}
  		// Create a new tags map for these datapoints
  		tags := map[string]string{blkioDevice: dev}
  		for k, v := range baseTags {
  			tags[k] = v
  		}
  		datapoints = append(datapoints, statValuesToDatapoints(stat.Serviced, prefix+"."+serviced, tags, ts)...)
  		datapoints = append(datapoints, statValuesToDatapoints(stat.ServiceBytes, prefix+"."+serviceBytes, tags, ts)...)
  		datapoints = append(datapoints, statValuesToDatapoints(stat.ServiceTime, prefix+"."+serviceTime, tags, ts)...)
  		datapoints = append(datapoints, statValuesToDatapoints(stat.Merged, prefix+"."+merged, tags, ts)...)
  		datapoints = append(datapoints, statValuesToDatapoints(stat.Queued, prefix+"."+queued, tags, ts)...)
  		datapoints = append(datapoints, statValuesToDatapoints(stat.WaitTime, prefix+"."+waitTime, tags, ts)...)
  	}
  
  	return datapoints
  }
docs: // deviceStatsToDatapoints flattens the nested blkio stats into a list of
  // clearly-named datapoints. All units are bytes, therefore all values are
  // integers. Datapoints from throttled devices are tagged with their origin.