code: func (p *Process) RedisInfo(addr string, timeout time.Duration) (*RedisInfo, error) {
  	// Default to local process if addr not specified.
  	if addr == "" {
  		addr = fmt.Sprintf("localhost:%s", p.Port)
  	}
  
  	logger := p.Logger.New("fn", "replInfo", "addr", addr)
  	logger.Info("sending INFO")
  
  	// Connect to the redis server.
  	conn, err := redis.Dial("tcp", addr,
  		redis.DialPassword(p.Password),
  		redis.DialConnectTimeout(timeout),
  		redis.DialReadTimeout(timeout),
  		redis.DialWriteTimeout(timeout),
  	)
  	if err != nil {
  		logger.Info("dial error", "err", err)
  		return nil, err
  	}
  	defer conn.Close()
  
  	// Execute INFO command.
  	reply, err := conn.Do("INFO")
  	if err != nil {
  		logger.Error("info error", "err", err)
  		return nil, err
  	}
  
  	buf, ok := reply.([]byte)
  	if !ok {
  		logger.Error("info reply type error", "type", fmt.Sprintf("%T", buf))
  		return nil, fmt.Errorf("unexpected INFO reply format: %T", buf)
  	}
  
  	// Parse the bulk string reply info a typed object.
  	info, err := ParseRedisInfo(string(buf))
  	if err != nil {
  		logger.Error("parse info error", "err", err)
  		return nil, fmt.Errorf("parse info: %s", err)
  	}
  
  	logger.Info("INFO received")
  	return info, nil
  }
docs: // RedisInfo executes an INFO command against a Redis server and returns the results.