@@ -47,9 +47,10 @@ var errNilMetric = errors.New("expecting a non-nil metric")
4747var errNilMetricDescriptor = errors .New ("expecting a non-nil metric descriptor" )
4848
4949type metricProtoPayload struct {
50- node * commonpb.Node
51- resource * resourcepb.Resource
52- metric * metricspb.Metric
50+ node * commonpb.Node
51+ resource * resourcepb.Resource
52+ metric * metricspb.Metric
53+ additionalLabels map [string ]labelValue
5354}
5455
5556// ExportMetricsProto exports OpenCensus Metrics Proto to Stackdriver Monitoring.
@@ -58,11 +59,18 @@ func (se *statsExporter) ExportMetricsProto(ctx context.Context, node *commonpb.
5859 return errNilMetric
5960 }
6061
62+ additionalLabels := se .defaultLabels
63+ if additionalLabels == nil {
64+ // additionalLabels must be stateless because each node is different
65+ additionalLabels = getDefaultLabelsFromNode (node )
66+ }
67+
6168 for _ , metric := range metrics {
6269 payload := & metricProtoPayload {
63- metric : metric ,
64- resource : rsc ,
65- node : node ,
70+ metric : metric ,
71+ resource : rsc ,
72+ node : node ,
73+ additionalLabels : additionalLabels ,
6674 }
6775 se .protoMetricsBundler .Add (payload , 1 )
6876 }
@@ -83,15 +91,15 @@ func (se *statsExporter) handleMetricsProtoUpload(payloads []*metricProtoPayload
8391
8492 for _ , payload := range payloads {
8593 // Now create the metric descriptor remotely.
86- if err := se .createMetricDescriptor (ctx , payload .metric ); err != nil {
94+ if err := se .createMetricDescriptor (ctx , payload .metric , payload . additionalLabels ); err != nil {
8795 span .SetStatus (trace.Status {Code : 2 , Message : err .Error ()})
8896 return err
8997 }
9098 }
9199
92100 var allTimeSeries []* monitoringpb.TimeSeries
93101 for _ , payload := range payloads {
94- tsl , err := se .protoMetricToTimeSeries (ctx , payload .node , payload .resource , payload .metric )
102+ tsl , err := se .protoMetricToTimeSeries (ctx , payload .node , payload .resource , payload .metric , payload . additionalLabels )
95103 if err != nil {
96104 span .SetStatus (trace.Status {Code : 2 , Message : err .Error ()})
97105 return err
@@ -196,7 +204,7 @@ func (se *statsExporter) combineTimeSeriesToCreateTimeSeriesRequest(ts []*monito
196204
197205// protoMetricToTimeSeries converts a metric into a Stackdriver Monitoring v3 API CreateTimeSeriesRequest
198206// but it doesn't invoke any remote API.
199- func (se * statsExporter ) protoMetricToTimeSeries (ctx context.Context , node * commonpb.Node , rsc * resourcepb.Resource , metric * metricspb.Metric ) ([]* monitoringpb.TimeSeries , error ) {
207+ func (se * statsExporter ) protoMetricToTimeSeries (ctx context.Context , node * commonpb.Node , rsc * resourcepb.Resource , metric * metricspb.Metric , additionalLabels map [ string ] labelValue ) ([]* monitoringpb.TimeSeries , error ) {
200208 if metric == nil {
201209 return nil , errNilMetric
202210 }
@@ -223,7 +231,7 @@ func (se *statsExporter) protoMetricToTimeSeries(ctx context.Context, node *comm
223231
224232 // Each TimeSeries has labelValues which MUST be correlated
225233 // with that from the MetricDescriptor
226- labels , err := labelsPerTimeSeries (se . defaultLabels , metricLabelKeys , protoTimeSeries .GetLabelValues ())
234+ labels , err := labelsPerTimeSeries (additionalLabels , metricLabelKeys , protoTimeSeries .GetLabelValues ())
227235 if err != nil {
228236 // TODO: (@odeke-em) perhaps log this error from labels extraction, if non-nil.
229237 continue
@@ -261,10 +269,10 @@ func labelsPerTimeSeries(defaults map[string]labelValue, labelKeys []*metricspb.
261269 return labels , nil
262270}
263271
264- func (se * statsExporter ) protoMetricDescriptorToCreateMetricDescriptorRequest (ctx context.Context , metric * metricspb.Metric ) (* monitoringpb.CreateMetricDescriptorRequest , error ) {
272+ func (se * statsExporter ) protoMetricDescriptorToCreateMetricDescriptorRequest (ctx context.Context , metric * metricspb.Metric , additionalLabels map [ string ] labelValue ) (* monitoringpb.CreateMetricDescriptorRequest , error ) {
265273 // Otherwise, we encountered a cache-miss and
266274 // should create the metric descriptor remotely.
267- inMD , err := se .protoToMonitoringMetricDescriptor (metric )
275+ inMD , err := se .protoToMonitoringMetricDescriptor (metric , additionalLabels )
268276 if err != nil {
269277 return nil , err
270278 }
@@ -279,7 +287,7 @@ func (se *statsExporter) protoMetricDescriptorToCreateMetricDescriptorRequest(ct
279287
280288// createMetricDescriptor creates a metric descriptor from the OpenCensus proto metric
281289// and then creates it remotely using Stackdriver's API.
282- func (se * statsExporter ) createMetricDescriptor (ctx context.Context , metric * metricspb.Metric ) error {
290+ func (se * statsExporter ) createMetricDescriptor (ctx context.Context , metric * metricspb.Metric , additionalLabels map [ string ] labelValue ) error {
283291 se .protoMu .Lock ()
284292 defer se .protoMu .Unlock ()
285293
@@ -290,7 +298,7 @@ func (se *statsExporter) createMetricDescriptor(ctx context.Context, metric *met
290298
291299 // Otherwise, we encountered a cache-miss and
292300 // should create the metric descriptor remotely.
293- inMD , err := se .protoToMonitoringMetricDescriptor (metric )
301+ inMD , err := se .protoToMonitoringMetricDescriptor (metric , additionalLabels )
294302 if err != nil {
295303 return err
296304 }
@@ -337,7 +345,7 @@ func (se *statsExporter) protoTimeSeriesToMonitoringPoints(ts *metricspb.TimeSer
337345 return sptl , nil
338346}
339347
340- func (se * statsExporter ) protoToMonitoringMetricDescriptor (metric * metricspb.Metric ) (* googlemetricpb.MetricDescriptor , error ) {
348+ func (se * statsExporter ) protoToMonitoringMetricDescriptor (metric * metricspb.Metric , additionalLabels map [ string ] labelValue ) (* googlemetricpb.MetricDescriptor , error ) {
341349 if metric == nil {
342350 return nil , errNilMetric
343351 }
@@ -358,7 +366,7 @@ func (se *statsExporter) protoToMonitoringMetricDescriptor(metric *metricspb.Met
358366 Type : metricType ,
359367 MetricKind : metricKind ,
360368 ValueType : valueType ,
361- Labels : labelDescriptorsFromProto (se . defaultLabels , metric .GetMetricDescriptor ().GetLabelKeys ()),
369+ Labels : labelDescriptorsFromProto (additionalLabels , metric .GetMetricDescriptor ().GetLabelKeys ()),
362370 }
363371
364372 return sdm , nil
@@ -573,3 +581,13 @@ func protoResourceToMonitoredResource(rsp *resourcepb.Resource) *monitoredrespb.
573581 }
574582 return mrsp
575583}
584+
585+ func getDefaultLabelsFromNode (node * commonpb.Node ) map [string ]labelValue {
586+ taskValue := fmt .Sprintf ("%s-%d@%s" , strings .ToLower (node .LibraryInfo .GetLanguage ().String ()), node .Identifier .Pid , node .Identifier .HostName )
587+ return map [string ]labelValue {
588+ opencensusTaskKey : {
589+ val : taskValue ,
590+ desc : opencensusTaskDescription ,
591+ },
592+ }
593+ }
0 commit comments