|  | @@ -66,27 +66,27 @@ void extract_opt_stats_from_tcp_info(ConnectionMetrics* metrics,
 | 
	
		
			
				|  |  |      return;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    if (info->length > offsetof(grpc_core::tcp_info, tcpi_sndbuf_limited)) {
 | 
	
		
			
				|  |  | -    metrics->recurring_retrans.set(info->tcpi_retransmits);
 | 
	
		
			
				|  |  | -    metrics->is_delivery_rate_app_limited.set(
 | 
	
		
			
				|  |  | +    metrics->recurring_retrans.emplace(info->tcpi_retransmits);
 | 
	
		
			
				|  |  | +    metrics->is_delivery_rate_app_limited.emplace(
 | 
	
		
			
				|  |  |          info->tcpi_delivery_rate_app_limited);
 | 
	
		
			
				|  |  | -    metrics->congestion_window.set(info->tcpi_snd_cwnd);
 | 
	
		
			
				|  |  | -    metrics->reordering.set(info->tcpi_reordering);
 | 
	
		
			
				|  |  | -    metrics->packet_retx.set(info->tcpi_total_retrans);
 | 
	
		
			
				|  |  | -    metrics->pacing_rate.set(info->tcpi_pacing_rate);
 | 
	
		
			
				|  |  | -    metrics->data_notsent.set(info->tcpi_notsent_bytes);
 | 
	
		
			
				|  |  | +    metrics->congestion_window.emplace(info->tcpi_snd_cwnd);
 | 
	
		
			
				|  |  | +    metrics->reordering.emplace(info->tcpi_reordering);
 | 
	
		
			
				|  |  | +    metrics->packet_retx.emplace(info->tcpi_total_retrans);
 | 
	
		
			
				|  |  | +    metrics->pacing_rate.emplace(info->tcpi_pacing_rate);
 | 
	
		
			
				|  |  | +    metrics->data_notsent.emplace(info->tcpi_notsent_bytes);
 | 
	
		
			
				|  |  |      if (info->tcpi_min_rtt != UINT32_MAX) {
 | 
	
		
			
				|  |  | -      metrics->min_rtt.set(info->tcpi_min_rtt);
 | 
	
		
			
				|  |  | +      metrics->min_rtt.emplace(info->tcpi_min_rtt);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    metrics->packet_sent.set(info->tcpi_data_segs_out);
 | 
	
		
			
				|  |  | -    metrics->delivery_rate.set(info->tcpi_delivery_rate);
 | 
	
		
			
				|  |  | -    metrics->busy_usec.set(info->tcpi_busy_time);
 | 
	
		
			
				|  |  | -    metrics->rwnd_limited_usec.set(info->tcpi_rwnd_limited);
 | 
	
		
			
				|  |  | -    metrics->sndbuf_limited_usec.set(info->tcpi_sndbuf_limited);
 | 
	
		
			
				|  |  | +    metrics->packet_sent.emplace(info->tcpi_data_segs_out);
 | 
	
		
			
				|  |  | +    metrics->delivery_rate.emplace(info->tcpi_delivery_rate);
 | 
	
		
			
				|  |  | +    metrics->busy_usec.emplace(info->tcpi_busy_time);
 | 
	
		
			
				|  |  | +    metrics->rwnd_limited_usec.emplace(info->tcpi_rwnd_limited);
 | 
	
		
			
				|  |  | +    metrics->sndbuf_limited_usec.emplace(info->tcpi_sndbuf_limited);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    if (info->length > offsetof(grpc_core::tcp_info, tcpi_dsack_dups)) {
 | 
	
		
			
				|  |  | -    metrics->data_sent.set(info->tcpi_bytes_sent);
 | 
	
		
			
				|  |  | -    metrics->data_retx.set(info->tcpi_bytes_retrans);
 | 
	
		
			
				|  |  | -    metrics->packet_spurious_retx.set(info->tcpi_dsack_dups);
 | 
	
		
			
				|  |  | +    metrics->data_sent.emplace(info->tcpi_bytes_sent);
 | 
	
		
			
				|  |  | +    metrics->data_retx.emplace(info->tcpi_bytes_retrans);
 | 
	
		
			
				|  |  | +    metrics->packet_spurious_retx.emplace(info->tcpi_dsack_dups);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -107,79 +107,80 @@ void extract_opt_stats_from_cmsg(ConnectionMetrics* metrics,
 | 
	
		
			
				|  |  |      const void* val = data + offset + NLA_HDRLEN;
 | 
	
		
			
				|  |  |      switch (attr->nla_type) {
 | 
	
		
			
				|  |  |        case TCP_NLA_BUSY: {
 | 
	
		
			
				|  |  | -        metrics->busy_usec.set(read_unaligned<uint64_t>(val));
 | 
	
		
			
				|  |  | +        metrics->busy_usec.emplace(read_unaligned<uint64_t>(val));
 | 
	
		
			
				|  |  |          break;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        case TCP_NLA_RWND_LIMITED: {
 | 
	
		
			
				|  |  | -        metrics->rwnd_limited_usec.set(read_unaligned<uint64_t>(val));
 | 
	
		
			
				|  |  | +        metrics->rwnd_limited_usec.emplace(read_unaligned<uint64_t>(val));
 | 
	
		
			
				|  |  |          break;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        case TCP_NLA_SNDBUF_LIMITED: {
 | 
	
		
			
				|  |  | -        metrics->sndbuf_limited_usec.set(read_unaligned<uint64_t>(val));
 | 
	
		
			
				|  |  | +        metrics->sndbuf_limited_usec.emplace(read_unaligned<uint64_t>(val));
 | 
	
		
			
				|  |  |          break;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        case TCP_NLA_PACING_RATE: {
 | 
	
		
			
				|  |  | -        metrics->pacing_rate.set(read_unaligned<uint64_t>(val));
 | 
	
		
			
				|  |  | +        metrics->pacing_rate.emplace(read_unaligned<uint64_t>(val));
 | 
	
		
			
				|  |  |          break;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        case TCP_NLA_DELIVERY_RATE: {
 | 
	
		
			
				|  |  | -        metrics->delivery_rate.set(read_unaligned<uint64_t>(val));
 | 
	
		
			
				|  |  | +        metrics->delivery_rate.emplace(read_unaligned<uint64_t>(val));
 | 
	
		
			
				|  |  |          break;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        case TCP_NLA_DELIVERY_RATE_APP_LMT: {
 | 
	
		
			
				|  |  | -        metrics->is_delivery_rate_app_limited.set(read_unaligned<uint8_t>(val));
 | 
	
		
			
				|  |  | +        metrics->is_delivery_rate_app_limited.emplace(
 | 
	
		
			
				|  |  | +            read_unaligned<uint8_t>(val));
 | 
	
		
			
				|  |  |          break;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        case TCP_NLA_SND_CWND: {
 | 
	
		
			
				|  |  | -        metrics->congestion_window.set(read_unaligned<uint32_t>(val));
 | 
	
		
			
				|  |  | +        metrics->congestion_window.emplace(read_unaligned<uint32_t>(val));
 | 
	
		
			
				|  |  |          break;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        case TCP_NLA_MIN_RTT: {
 | 
	
		
			
				|  |  | -        metrics->min_rtt.set(read_unaligned<uint32_t>(val));
 | 
	
		
			
				|  |  | +        metrics->min_rtt.emplace(read_unaligned<uint32_t>(val));
 | 
	
		
			
				|  |  |          break;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        case TCP_NLA_SRTT: {
 | 
	
		
			
				|  |  | -        metrics->srtt.set(read_unaligned<uint32_t>(val));
 | 
	
		
			
				|  |  | +        metrics->srtt.emplace(read_unaligned<uint32_t>(val));
 | 
	
		
			
				|  |  |          break;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        case TCP_NLA_RECUR_RETRANS: {
 | 
	
		
			
				|  |  | -        metrics->recurring_retrans.set(read_unaligned<uint8_t>(val));
 | 
	
		
			
				|  |  | +        metrics->recurring_retrans.emplace(read_unaligned<uint8_t>(val));
 | 
	
		
			
				|  |  |          break;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        case TCP_NLA_BYTES_SENT: {
 | 
	
		
			
				|  |  | -        metrics->data_sent.set(read_unaligned<uint64_t>(val));
 | 
	
		
			
				|  |  | +        metrics->data_sent.emplace(read_unaligned<uint64_t>(val));
 | 
	
		
			
				|  |  |          break;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        case TCP_NLA_DATA_SEGS_OUT: {
 | 
	
		
			
				|  |  | -        metrics->packet_sent.set(read_unaligned<uint64_t>(val));
 | 
	
		
			
				|  |  | +        metrics->packet_sent.emplace(read_unaligned<uint64_t>(val));
 | 
	
		
			
				|  |  |          break;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        case TCP_NLA_TOTAL_RETRANS: {
 | 
	
		
			
				|  |  | -        metrics->packet_retx.set(read_unaligned<uint64_t>(val));
 | 
	
		
			
				|  |  | +        metrics->packet_retx.emplace(read_unaligned<uint64_t>(val));
 | 
	
		
			
				|  |  |          break;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        case TCP_NLA_DELIVERED: {
 | 
	
		
			
				|  |  | -        metrics->packet_delivered.set(read_unaligned<uint32_t>(val));
 | 
	
		
			
				|  |  | +        metrics->packet_delivered.emplace(read_unaligned<uint32_t>(val));
 | 
	
		
			
				|  |  |          break;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        case TCP_NLA_DELIVERED_CE: {
 | 
	
		
			
				|  |  | -        metrics->packet_delivered_ce.set(read_unaligned<uint32_t>(val));
 | 
	
		
			
				|  |  | +        metrics->packet_delivered_ce.emplace(read_unaligned<uint32_t>(val));
 | 
	
		
			
				|  |  |          break;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        case TCP_NLA_BYTES_RETRANS: {
 | 
	
		
			
				|  |  | -        metrics->data_retx.set(read_unaligned<uint64_t>(val));
 | 
	
		
			
				|  |  | +        metrics->data_retx.emplace(read_unaligned<uint64_t>(val));
 | 
	
		
			
				|  |  |          break;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        case TCP_NLA_DSACK_DUPS: {
 | 
	
		
			
				|  |  | -        metrics->packet_spurious_retx.set(read_unaligned<uint32_t>(val));
 | 
	
		
			
				|  |  | +        metrics->packet_spurious_retx.emplace(read_unaligned<uint32_t>(val));
 | 
	
		
			
				|  |  |          break;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        case TCP_NLA_REORDERING: {
 | 
	
		
			
				|  |  | -        metrics->reordering.set(read_unaligned<uint32_t>(val));
 | 
	
		
			
				|  |  | +        metrics->reordering.emplace(read_unaligned<uint32_t>(val));
 | 
	
		
			
				|  |  |          break;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        case TCP_NLA_SND_SSTHRESH: {
 | 
	
		
			
				|  |  | -        metrics->snd_ssthresh.set(read_unaligned<uint32_t>(val));
 | 
	
		
			
				|  |  | +        metrics->snd_ssthresh.emplace(read_unaligned<uint32_t>(val));
 | 
	
		
			
				|  |  |          break;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      }
 |