code: func (t *QueueManager) Start() {
  	// Setup the QueueManagers metrics. We do this here rather than in the
  	// constructor because of the ordering of creating Queue Managers's, stopping them,
  	// and then starting new ones in storage/remote/storage.go ApplyConfig.
  	name := t.client.Name()
  	t.highestSentTimestampMetric = &maxGauge{
  		Gauge: queueHighestSentTimestamp.WithLabelValues(name),
  	}
  	t.pendingSamplesMetric = queuePendingSamples.WithLabelValues(name)
  	t.enqueueRetriesMetric = enqueueRetriesTotal.WithLabelValues(name)
  	t.droppedSamplesTotal = droppedSamplesTotal.WithLabelValues(name)
  	t.numShardsMetric = numShards.WithLabelValues(name)
  	t.failedSamplesTotal = failedSamplesTotal.WithLabelValues(name)
  	t.sentBatchDuration = sentBatchDuration.WithLabelValues(name)
  	t.succeededSamplesTotal = succeededSamplesTotal.WithLabelValues(name)
  	t.retriedSamplesTotal = retriedSamplesTotal.WithLabelValues(name)
  	t.shardCapacity = shardCapacity.WithLabelValues(name)
  
  	// Initialise some metrics.
  	t.shardCapacity.Set(float64(t.cfg.Capacity))
  	t.pendingSamplesMetric.Set(0)
  
  	t.shards.start(t.numShards)
  	t.watcher.Start()
  
  	t.wg.Add(2)
  	go t.updateShardsLoop()
  	go t.reshardLoop()
  }
docs: // Start the queue manager sending samples to the remote storage.
  // Does not block.