code: func buildTags(msg producers.Dimensions) (tags []string, err error) {
  	v := reflect.ValueOf(msg)
  	if v.Kind() != reflect.Struct {
  		return tags, fmt.Errorf("error: expected type struct, got %s", v.Kind().String())
  	}
  
  	for i := 0; i < v.NumField(); i++ {
  		// The producers.Dimensions struct contains a nested
  		// map[string]string for user-defined Labels
  		if v.Field(i).Kind() == reflect.Map {
  			for k, v := range v.Field(i).Interface().(map[string]string) {
  				tags = append(tags, strings.Join([]string{k, v}, ":"))
  			}
  			continue
  		}
  
  		fieldInfo := v.Type().Field(i)
  
  		fieldVal := fmt.Sprintf("%v", v.Field(i).Interface())
  		if fieldVal == reflect.Zero(fieldInfo.Type).String() {
  			// don't include keys without a value
  			continue
  		}
  
  		fieldTag := strings.Split(fieldInfo.Tag.Get("json"), ",")[0] // remove "omitempty" if present
  		tags = append(tags, strings.Join([]string{fieldTag, fieldVal}, ":"))
  	}
  
  	return tags, nil
  }
docs: // buildTags analyzes the MetricsMessage.Dimensions struct and returns a slice
  // of strings of key/value pairs in the format "key:value"