@@ -133,8 +133,12 @@ type MetricsRecorder struct {
133133 // nodeRegistry contains, as subregistries, the multiple component-specific
134134 // registries which are recorded as "node level" metrics.
135135 nodeRegistry * metric.Registry
136- desc roachpb.NodeDescriptor
137- startedAt int64
136+ // logRegistry contains the global metrics registry used by the logging
137+ // package. NB: The underlying metrics are global, but each server gets
138+ // its own separate registry to avoid things such as colliding labels.
139+ logRegistry * metric.Registry
140+ desc roachpb.NodeDescriptor
141+ startedAt int64
138142
139143 // storeRegistries contains a registry for each store on the node. These
140144 // are not stored as subregistries, but rather are treated as wholly
@@ -193,6 +197,7 @@ func (mr *MetricsRecorder) AddTenantRegistry(tenantID roachpb.TenantID, rec *met
193197 // tenant is initialized.
194198 mr .mu .Do (func () {
195199 mr .mu .nodeRegistry .AddLabel ("tenant" , catconstants .SystemTenantName )
200+ mr .mu .logRegistry .AddLabel ("tenant" , catconstants .SystemTenantName )
196201 })
197202 }
198203 mr .mu .tenantRegistries [tenantID ] = rec
@@ -207,16 +212,17 @@ func (mr *MetricsRecorder) RemoveTenantRegistry(tenantID roachpb.TenantID) {
207212}
208213
209214// AddNode adds the Registry from an initialized node, along with its descriptor
210- // and start time.
215+ // and start time. It also adds the logging registry.
211216func (mr * MetricsRecorder ) AddNode (
212- reg * metric.Registry ,
217+ nodeReg , logReg * metric.Registry ,
213218 desc roachpb.NodeDescriptor ,
214219 startedAt int64 ,
215220 advertiseAddr , httpAddr , sqlAddr string ,
216221) {
217222 mr .mu .Lock ()
218223 defer mr .mu .Unlock ()
219- mr .mu .nodeRegistry = reg
224+ mr .mu .nodeRegistry = nodeReg
225+ mr .mu .logRegistry = logReg
220226 mr .mu .desc = desc
221227 mr .mu .startedAt = startedAt
222228
@@ -233,20 +239,20 @@ func (mr *MetricsRecorder) AddNode(
233239 metadata .AddLabel (sqlAddrLabelKey , sqlAddr )
234240 nodeIDGauge := metric .NewGauge (metadata )
235241 nodeIDGauge .Update (int64 (desc .NodeID ))
236- reg .AddMetric (nodeIDGauge )
242+ nodeReg .AddMetric (nodeIDGauge )
237243
238244 if ! disableNodeAndTenantLabels {
239245 nodeIDInt := int (desc .NodeID )
240246 if nodeIDInt != 0 {
241- reg .AddLabel ("node_id" , strconv .Itoa (int (desc .NodeID )))
242- // We assume that all stores have been added to the registry
243- // prior to calling `AddNode`.
247+ nodeReg .AddLabel ("node_id" , strconv .Itoa (int (desc .NodeID )))
248+ logReg .AddLabel ("node_id" , strconv .Itoa (int (desc .NodeID )))
244249 for _ , s := range mr .mu .storeRegistries {
245250 s .AddLabel ("node_id" , strconv .Itoa (int (desc .NodeID )))
246251 }
247252 }
248253 if mr .tenantNameContainer != nil && mr .tenantNameContainer .String () != catconstants .SystemTenantName {
249- reg .AddLabel ("tenant" , mr .tenantNameContainer )
254+ nodeReg .AddLabel ("tenant" , mr .tenantNameContainer )
255+ logReg .AddLabel ("tenant" , mr .tenantNameContainer )
250256 }
251257 }
252258}
@@ -279,7 +285,8 @@ func (mr *MetricsRecorder) MarshalJSON() ([]byte, error) {
279285 return []byte ("{}" ), nil
280286 }
281287 topLevel := map [string ]interface {}{
282- fmt .Sprintf ("node.%d" , mr .mu .desc .NodeID ): mr .mu .nodeRegistry ,
288+ fmt .Sprintf ("node.%d" , mr .mu .desc .NodeID ): mr .mu .nodeRegistry ,
289+ fmt .Sprintf ("node.%d.log" , mr .mu .desc .NodeID ): mr .mu .logRegistry ,
283290 }
284291 // Add collection of stores to top level. JSON requires that keys be strings,
285292 // so we must convert the store ID to a string.
@@ -304,6 +311,7 @@ func (mr *MetricsRecorder) ScrapeIntoPrometheus(pm *metric.PrometheusExporter) {
304311 }
305312 includeChildMetrics := ChildMetricsEnabled .Get (& mr .settings .SV )
306313 pm .ScrapeRegistry (mr .mu .nodeRegistry , includeChildMetrics )
314+ pm .ScrapeRegistry (mr .mu .logRegistry , includeChildMetrics )
307315 for _ , reg := range mr .mu .storeRegistries {
308316 pm .ScrapeRegistry (reg , includeChildMetrics )
309317 }
@@ -363,6 +371,9 @@ func (mr *MetricsRecorder) GetTimeSeriesData() []tspb.TimeSeriesData {
363371 timestampNanos : now .UnixNano (),
364372 }
365373 recorder .record (& data )
374+ // Now record the log metrics.
375+ recorder .registry = mr .mu .logRegistry
376+ recorder .record (& data )
366377
367378 // Record time series from node-level registries for secondary tenants.
368379 for tenantID , r := range mr .mu .tenantRegistries {
@@ -422,6 +433,7 @@ func (mr *MetricsRecorder) GetMetricsMetadata() map[string]metric.Metadata {
422433 metrics := make (map [string ]metric.Metadata )
423434
424435 mr .mu .nodeRegistry .WriteMetricsMetadata (metrics )
436+ mr .mu .logRegistry .WriteMetricsMetadata (metrics )
425437
426438 // Get a random storeID.
427439 var sID roachpb.StoreID
@@ -511,6 +523,9 @@ func (mr *MetricsRecorder) GenerateNodeStatus(ctx context.Context) *statuspb.Nod
511523 eachRecordableValue (mr .mu .nodeRegistry , func (name string , val float64 ) {
512524 nodeStat .Metrics [name ] = val
513525 })
526+ eachRecordableValue (mr .mu .logRegistry , func (name string , val float64 ) {
527+ nodeStat .Metrics [name ] = val
528+ })
514529
515530 // Generate status summaries for stores.
516531 for storeID , r := range mr .mu .storeRegistries {
0 commit comments