in plugins/core/reporter/grpc/grpc.go [200:251]
func (r *gRPCReporter) SendMetrics(metrics []reporter.ReportedMeter) {
if len(metrics) == 0 {
return
}
meters := make([]*agentv3.MeterData, len(metrics))
for i, m := range metrics {
meter := &agentv3.MeterData{}
switch data := m.(type) {
case reporter.ReportedMeterSingleValue:
meter.Metric = &agentv3.MeterData_SingleValue{
SingleValue: &agentv3.MeterSingleValue{
Name: data.Name(),
Labels: r.convertLabels(data.Labels()),
Value: data.Value(),
},
}
case reporter.ReportedMeterHistogram:
buckets := make([]*agentv3.MeterBucketValue, len(data.BucketValues()))
for i, b := range data.BucketValues() {
buckets[i] = &agentv3.MeterBucketValue{
Bucket: b.Bucket(),
Count: b.Count(),
IsNegativeInfinity: b.IsNegativeInfinity(),
}
}
meter.Metric = &agentv3.MeterData_Histogram{
Histogram: &agentv3.MeterHistogram{
Name: data.Name(),
Labels: r.convertLabels(data.Labels()),
Values: buckets,
},
}
}
meters[i] = meter
}
meters[0].Service = r.entity.ServiceName
meters[0].ServiceInstance = r.entity.ServiceInstanceName
meters[0].Timestamp = time.Now().UnixNano() / int64(time.Millisecond)
defer func() {
// recover the panic caused by close tracingSendCh
if err := recover(); err != nil {
r.logger.Errorf("reporter metrics err %v", err)
}
}()
select {
case r.metricsSendCh <- meters:
default:
r.logger.Errorf("reach max metrics send buffer")
}
}