code: func (h *apiExecutor) Info(ctx context.Context, cmd *InfoRequest) *InfoResponse {
  	defer func(started time.Time) {
  		apiCommandDurationSummary.WithLabelValues(h.protocol, "info").Observe(time.Since(started).Seconds())
  	}(time.Now())
  
  	resp := &InfoResponse{}
  
  	info, err := h.node.Info()
  	if err != nil {
  		h.node.Log(centrifuge.NewLogEntry(centrifuge.LogLevelError, "error calling info", map[string]interface{}{"error": err.Error()}))
  		resp.Error = ErrorInternal
  		return resp
  	}
  
  	nodes := make([]*NodeResult, len(info.Nodes))
  	for i, nd := range info.Nodes {
  		res := &NodeResult{
  			UID:         nd.UID,
  			Version:     nd.Version,
  			Name:        nd.Name,
  			NumClients:  nd.NumClients,
  			NumUsers:    nd.NumUsers,
  			NumChannels: nd.NumChannels,
  			Uptime:      nd.Uptime,
  		}
  		if nd.Metrics != nil {
  			res.Metrics = &Metrics{
  				Interval: nd.Metrics.Interval,
  				Items:    nd.Metrics.Items,
  			}
  		}
  		nodes[i] = res
  	}
  	resp.Result = &InfoResult{
  		Nodes: nodes,
  	}
  	return resp
  }
docs: // Info returns information about running nodes.