github.com/siglens/siglens@v0.0.0-20240328180423-f7ce9ae441ed/pkg/instrumentation/ssgauges.go (about)

     1  package instrumentation
     2  
     3  /*
     4  Copyright 2023.
     5  
     6  Licensed under the Apache License, Version 2.0 (the "License");
     7  you may not use this file except in compliance with the License.
     8  You may obtain a copy of the License at
     9  
    10      http://www.apache.org/licenses/LICENSE-2.0
    11  
    12  Unless required by applicable law or agreed to in writing, software
    13  distributed under the License is distributed on an "AS IS" BASIS,
    14  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    15  See the License for the specific language governing permissions and
    16  limitations under the License.
    17  */
    18  
    19  import (
    20  	"context"
    21  	"fmt"
    22  	"sync"
    23  
    24  	log "github.com/sirupsen/logrus"
    25  
    26  	"go.opentelemetry.io/otel/attribute"
    27  	metric "go.opentelemetry.io/otel/metric"
    28  )
    29  
    30  /* Adding a new Gauge
    31     1. create a var int64
    32     2. create a rwlock
    33     3. create meter.async.guage
    34     4. create SetXXX method for the gauge
    35     5. register a callback.
    36  
    37     // Anotated example below
    38  */
    39  
    40  type sumcount struct {
    41  	sum      int64
    42  	count    int64
    43  	labelkey string
    44  	labelval string
    45  }
    46  
    47  var currentEventCountGauge int64                         // 1
    48  var currentEventCountGaugeLock sync.RWMutex              // 2
    49  var CURRENT_EVENT_COUNT, _ = meter.Int64ObservableGauge( // 3
    50  	"ss.current.event.count",
    51  	metric.WithUnit("count"),
    52  	metric.WithDescription("Current Count of total num of events"))
    53  
    54  func SetGaugeCurrentEventCount(val int64) { // 4
    55  	currentEventCountGaugeLock.Lock()
    56  	currentEventCountGauge = val
    57  	currentEventCountGaugeLock.Unlock()
    58  }
    59  
    60  var currentBytesReceivedGauge int64
    61  var currentBytesReceivedGaugeLock sync.RWMutex
    62  var CURRENT_BYTES_RECEIVED, _ = meter.Int64ObservableGauge(
    63  	"ss.current.bytes.received",
    64  	metric.WithUnit("bytes"),
    65  	metric.WithDescription("current count of bytes received"))
    66  
    67  func SetGaugeCurrentBytesReceivedGauge(val int64) {
    68  	currentBytesReceivedGaugeLock.Lock()
    69  	currentBytesReceivedGauge = val
    70  	currentBytesReceivedGaugeLock.Unlock()
    71  }
    72  
    73  var currentOnDiskBytesGauge int64
    74  var currentOnDiskBytesGaugeLock sync.RWMutex
    75  var CURRENT_ON_DISK_BYTES, _ = meter.Int64ObservableGauge(
    76  	"ss.current.on.disk.bytes",
    77  	metric.WithUnit("bytes"),
    78  	metric.WithDescription("current on disk bytes"))
    79  
    80  func SetGaugeOnDiskBytesGauge(val int64) {
    81  	currentOnDiskBytesGaugeLock.Lock()
    82  	currentOnDiskBytesGauge = val
    83  	currentOnDiskBytesGaugeLock.Unlock()
    84  }
    85  
    86  // map[labelkey-value] --> sumcount struct
    87  var queryLatencyMsMap = map[string]*sumcount{}
    88  var queryLatencyMsLock sync.RWMutex
    89  var QUERY_LATENCY_MS, _ = meter.Int64ObservableGauge(
    90  	"ss.query.latency.ms",
    91  	metric.WithUnit("milliseconds"),
    92  	metric.WithDescription("query latency in milliseconds"))
    93  
    94  func SetQueryLatencyMs(val int64, labelkey string, labelval string) {
    95  	keystr := fmt.Sprintf("%v:%v", labelkey, labelval)
    96  	queryLatencyMsLock.Lock()
    97  	defer queryLatencyMsLock.Unlock()
    98  	mentry, ok := queryLatencyMsMap[keystr]
    99  	if !ok {
   100  		mentry = &sumcount{labelkey: labelkey, labelval: labelval}
   101  		queryLatencyMsMap[keystr] = mentry
   102  	}
   103  	mentry.sum += val
   104  	mentry.count++
   105  }
   106  
   107  var writerSegstoreCountGauge int64
   108  var writerSegstoreCountLock sync.RWMutex
   109  var WRITER_SEGSTORE_COUNT, _ = meter.Int64ObservableGauge(
   110  	"ss.writer.segstore.count",
   111  	metric.WithUnit("count"),
   112  	metric.WithDescription("writer segstore count"))
   113  
   114  func SetWriterSegstoreCountGauge(val int64) {
   115  	writerSegstoreCountLock.Lock()
   116  	writerSegstoreCountGauge = val
   117  	writerSegstoreCountLock.Unlock()
   118  }
   119  
   120  var segmentMicroindexCountGauge int64
   121  var segmentMicroindexCountLock sync.RWMutex
   122  var SEGMENT_MICROINDEX_COUNT, _ = meter.Int64ObservableGauge(
   123  	"ss.segment.microindex.count",
   124  	metric.WithUnit("count"),
   125  	metric.WithDescription("segment microindex count"))
   126  
   127  func SetSegmentMicroindexCountGauge(val int64) {
   128  	segmentMicroindexCountLock.Lock()
   129  	segmentMicroindexCountGauge = val
   130  	segmentMicroindexCountLock.Unlock()
   131  }
   132  
   133  var eventCountPerIndexMap = map[string]*sumcount{}
   134  var eventCountPerIndexGaugeLock sync.RWMutex
   135  var EVENT_COUNT_PER_INDEX, _ = meter.Int64ObservableGauge(
   136  	"ss.event.count.per.index",
   137  	metric.WithUnit("count"),
   138  	metric.WithDescription("event count per index"))
   139  
   140  func SetEventCountPerIndex(val int64, labelkey string, labelval string) {
   141  	keystr := fmt.Sprintf("%v:%v", labelkey, labelval)
   142  	eventCountPerIndexGaugeLock.Lock()
   143  	defer eventCountPerIndexGaugeLock.Unlock()
   144  	mentry, ok := eventCountPerIndexMap[keystr]
   145  	if !ok {
   146  		mentry = &sumcount{labelkey: labelkey, labelval: labelval}
   147  		eventCountPerIndexMap[keystr] = mentry
   148  	}
   149  	mentry.sum += val
   150  	mentry.count++
   151  }
   152  
   153  var bytesCountPerIndexMap = map[string]*sumcount{}
   154  var bytesCountPerIndexGaugeLock sync.RWMutex
   155  var BYTES_COUNT_PER_INDEX, _ = meter.Int64ObservableGauge(
   156  	"ss.bytes.count.per.index",
   157  	metric.WithUnit("bytes"),
   158  	metric.WithDescription("bytes count per index"))
   159  
   160  func SetBytesCountPerIndex(val int64, labelkey string, labelval string) {
   161  	keystr := fmt.Sprintf("%v:%v", labelkey, labelval)
   162  	bytesCountPerIndexGaugeLock.Lock()
   163  	defer bytesCountPerIndexGaugeLock.Unlock()
   164  	mentry, ok := bytesCountPerIndexMap[keystr]
   165  	if !ok {
   166  		mentry = &sumcount{labelkey: labelkey, labelval: labelval}
   167  		bytesCountPerIndexMap[keystr] = mentry
   168  	}
   169  	mentry.sum += val
   170  	mentry.count++
   171  }
   172  
   173  var onDiskBytesPerIndexMap = map[string]*sumcount{}
   174  var onDiskBytesPerIndexLock sync.RWMutex
   175  var ON_DISK_BYTES_PER_INDEX, _ = meter.Int64ObservableGauge(
   176  	"ss.on.disk.bytes.per.index",
   177  	metric.WithUnit("bytes"),
   178  	metric.WithDescription("on disk bytes per index"))
   179  
   180  func SetOnDiskBytesPerIndex(val int64, labelkey string, labelval string) {
   181  	keystr := fmt.Sprintf("%v:%v", labelkey, labelval)
   182  	onDiskBytesPerIndexLock.Lock()
   183  	defer onDiskBytesPerIndexLock.Unlock()
   184  	mentry, ok := onDiskBytesPerIndexMap[keystr]
   185  	if !ok {
   186  		mentry = &sumcount{labelkey: labelkey, labelval: labelval}
   187  		onDiskBytesPerIndexMap[keystr] = mentry
   188  	}
   189  	mentry.sum += val
   190  	mentry.count++
   191  }
   192  
   193  var eventsSearchedGauge int64
   194  var eventsSearchedGaugeLock sync.RWMutex
   195  var EVENTS_SEARCHED, _ = meter.Int64ObservableGauge(
   196  	"ss.events.searched",
   197  	metric.WithUnit("count"),
   198  	metric.WithDescription("events searched"))
   199  
   200  func SetEventsSearchedGauge(val int64) {
   201  	eventsSearchedGaugeLock.Lock()
   202  	eventsSearchedGauge = val
   203  	eventsSearchedGaugeLock.Unlock()
   204  }
   205  
   206  var eventsMatchedGauge int64
   207  var eventsMatchedGaugeLock sync.RWMutex
   208  var EVENTS_MATCHED, _ = meter.Int64ObservableGauge(
   209  	"ss.events.matched",
   210  	metric.WithUnit("count"),
   211  	metric.WithDescription("events matched"))
   212  
   213  func SetEventsMatchedGauge(val int64) {
   214  	eventsMatchedGaugeLock.Lock()
   215  	eventsMatchedGauge = val
   216  	eventsMatchedGaugeLock.Unlock()
   217  }
   218  
   219  var segmentLatencyMinMsMap = map[string]*sumcount{}
   220  var segmentLatencyMinMsLock sync.RWMutex
   221  var SEGMENT_LATENCY_MIN_MS, _ = meter.Int64ObservableGauge(
   222  	"ss.segment.latency.min.ms",
   223  	metric.WithUnit("milliseconds"),
   224  	metric.WithDescription("segment latency min in ms"))
   225  
   226  func SetSegmentLatencyMinMs(val int64, labelkey string, labelval string) {
   227  	keystr := fmt.Sprintf("%v:%v", labelkey, labelval)
   228  	segmentLatencyMinMsLock.Lock()
   229  	defer segmentLatencyMinMsLock.Unlock()
   230  	mentry, ok := segmentLatencyMinMsMap[keystr]
   231  	if !ok {
   232  		mentry = &sumcount{labelkey: labelkey, labelval: labelval}
   233  		segmentLatencyMinMsMap[keystr] = mentry
   234  	}
   235  	mentry.sum += val
   236  	mentry.count++
   237  }
   238  
   239  var segmentLatencyMaxMsMap = map[string]*sumcount{}
   240  var segmentLatencyMaxMsLock sync.RWMutex
   241  var SEGMENT_LATENCY_MAX_MS, _ = meter.Int64ObservableGauge(
   242  	"ss.segment.latency.max.ms",
   243  	metric.WithUnit("milliseconds"),
   244  	metric.WithDescription("segment latency max in ms"))
   245  
   246  func SetSegmentLatencyMaxMs(val int64, labelkey string, labelval string) {
   247  	keystr := fmt.Sprintf("%v:%v", labelkey, labelval)
   248  	segmentLatencyMaxMsLock.Lock()
   249  	defer segmentLatencyMaxMsLock.Unlock()
   250  	mentry, ok := segmentLatencyMaxMsMap[keystr]
   251  	if !ok {
   252  		mentry = &sumcount{labelkey: labelkey, labelval: labelval}
   253  		segmentLatencyMaxMsMap[keystr] = mentry
   254  	}
   255  	mentry.sum += val
   256  	mentry.count++
   257  }
   258  
   259  var segmentLatencyAvgMsMap = map[string]*sumcount{}
   260  var segmentLatencyAvgMsLock sync.RWMutex
   261  var SEGMENT_LATENCY_AVG_MS, _ = meter.Int64ObservableGauge(
   262  	"ss.segment.latency.avg.ms",
   263  	metric.WithUnit("milliseconds"),
   264  	metric.WithDescription("segment latency avg in ms"))
   265  
   266  func SetSegmentLatencyAvgMs(val int64, labelkey string, labelval string) {
   267  	keystr := fmt.Sprintf("%v:%v", labelkey, labelval)
   268  	segmentLatencyAvgMsLock.Lock()
   269  	defer segmentLatencyAvgMsLock.Unlock()
   270  	mentry, ok := segmentLatencyAvgMsMap[keystr]
   271  	if !ok {
   272  		mentry = &sumcount{labelkey: labelkey, labelval: labelval}
   273  		segmentLatencyAvgMsMap[keystr] = mentry
   274  	}
   275  	mentry.sum += val
   276  	mentry.count++
   277  }
   278  
   279  var segmentLatencyP95MsMap = map[string]*sumcount{}
   280  var segmentLatencyP95MsLock sync.RWMutex
   281  var SEGMENT_LATENCY_P95_MS, _ = meter.Int64ObservableGauge(
   282  	"ss.segment.latency.p95.ms",
   283  	metric.WithUnit("milliseconds"),
   284  	metric.WithDescription("segment latency p95 in ms"))
   285  
   286  func SetSegmentLatencyP95Ms(val int64, labelkey string, labelval string) {
   287  	keystr := fmt.Sprintf("%v:%v", labelkey, labelval)
   288  	segmentLatencyP95MsLock.Lock()
   289  	defer segmentLatencyP95MsLock.Unlock()
   290  	mentry, ok := segmentLatencyP95MsMap[keystr]
   291  	if !ok {
   292  		mentry = &sumcount{labelkey: labelkey, labelval: labelval}
   293  		segmentLatencyP95MsMap[keystr] = mentry
   294  	}
   295  	mentry.sum += val
   296  	mentry.count++
   297  }
   298  
   299  func registerGaugeCallbacks() {
   300  	_, err := meter.RegisterCallback(func(_ context.Context, o metric.Observer) error {
   301  		currentEventCountGaugeLock.RLock()
   302  		defer currentEventCountGaugeLock.RUnlock()
   303  		o.ObserveInt64(CURRENT_EVENT_COUNT, int64(currentEventCountGauge))
   304  		return nil
   305  	}, CURRENT_EVENT_COUNT)
   306  	if err != nil {
   307  		log.Errorf("failed to register callback for gauge CURRENT_EVENT_COUNT, err %v", err)
   308  	}
   309  
   310  	_, err = meter.RegisterCallback(func(_ context.Context, o metric.Observer) error {
   311  		currentBytesReceivedGaugeLock.RLock()
   312  		defer currentBytesReceivedGaugeLock.RUnlock()
   313  		o.ObserveInt64(CURRENT_BYTES_RECEIVED, int64(currentBytesReceivedGauge))
   314  		return nil
   315  	}, CURRENT_BYTES_RECEIVED)
   316  	if err != nil {
   317  		log.Errorf("failed to register callback for gauge CURRENT_BYTES_RECEIVED, err %v", err)
   318  	}
   319  
   320  	_, err = meter.RegisterCallback(func(_ context.Context, o metric.Observer) error {
   321  		currentOnDiskBytesGaugeLock.RLock()
   322  		defer currentOnDiskBytesGaugeLock.RUnlock()
   323  		o.ObserveInt64(CURRENT_ON_DISK_BYTES, int64(currentOnDiskBytesGauge))
   324  		return nil
   325  	}, CURRENT_ON_DISK_BYTES)
   326  	if err != nil {
   327  		log.Errorf("failed to register callback for gauge CURRENT_ON_DISK_BYTES, err %v", err)
   328  	}
   329  
   330  	_, err = meter.RegisterCallback(func(_ context.Context, o metric.Observer) error {
   331  		emitQueryLatencyMs(ctx, o)
   332  		return nil
   333  	}, QUERY_LATENCY_MS)
   334  	if err != nil {
   335  		log.Errorf("failed to register callback for gauge QUERY_LATENCY_MS, err %v", err)
   336  	}
   337  
   338  	_, err = meter.RegisterCallback(func(_ context.Context, o metric.Observer) error {
   339  		writerSegstoreCountLock.RLock()
   340  		defer writerSegstoreCountLock.RUnlock()
   341  		o.ObserveInt64(WRITER_SEGSTORE_COUNT, int64(writerSegstoreCountGauge))
   342  		return nil
   343  	}, WRITER_SEGSTORE_COUNT)
   344  	if err != nil {
   345  		log.Errorf("failed to register callback for gauge WRITER_SEGSTORE_COUNT, err %v", err)
   346  	}
   347  
   348  	_, err = meter.RegisterCallback(func(_ context.Context, o metric.Observer) error {
   349  		segmentMicroindexCountLock.RLock()
   350  		defer segmentMicroindexCountLock.RUnlock()
   351  		o.ObserveInt64(SEGMENT_MICROINDEX_COUNT, int64(segmentMicroindexCountGauge))
   352  		return nil
   353  	}, SEGMENT_MICROINDEX_COUNT)
   354  	if err != nil {
   355  		log.Errorf("failed to register callback for gauge SEGMENT_MICROINDEX_COUNT, err %v", err)
   356  	}
   357  
   358  	_, err = meter.RegisterCallback(func(_ context.Context, o metric.Observer) error {
   359  		emitEventCountPerIndexMap(ctx, o)
   360  		return nil
   361  	}, EVENT_COUNT_PER_INDEX)
   362  	if err != nil {
   363  		log.Errorf("failed to register callback for gauge EVENT_COUNT_PER_INDEX, err %v", err)
   364  	}
   365  
   366  	_, err = meter.RegisterCallback(func(_ context.Context, o metric.Observer) error {
   367  		emitBytesCountPerIndexMap(ctx, o)
   368  		return nil
   369  	}, BYTES_COUNT_PER_INDEX)
   370  	if err != nil {
   371  		log.Errorf("failed to register callback for gauge BYTES_COUNT_PER_INDEX, err %v", err)
   372  	}
   373  
   374  	_, err = meter.RegisterCallback(func(_ context.Context, o metric.Observer) error {
   375  		emitOnDiskBytesPerIndexMap(ctx, o)
   376  		return nil
   377  	}, ON_DISK_BYTES_PER_INDEX)
   378  	if err != nil {
   379  		log.Errorf("failed to register callback for gauge ON_DISK_BYTES_PER_INDEX, err %v", err)
   380  	}
   381  
   382  	_, err = meter.RegisterCallback(func(_ context.Context, o metric.Observer) error {
   383  		o.ObserveInt64(EVENTS_SEARCHED, int64(eventsSearchedGauge))
   384  		return nil
   385  	}, EVENTS_SEARCHED)
   386  	if err != nil {
   387  		log.Errorf("failed to register callback for gauge EVENTS_SEARCHED, err %v", err)
   388  	}
   389  
   390  	_, err = meter.RegisterCallback(func(_ context.Context, o metric.Observer) error {
   391  		o.ObserveInt64(EVENTS_MATCHED, int64(eventsMatchedGauge))
   392  		return nil
   393  	}, EVENTS_MATCHED)
   394  	if err != nil {
   395  		log.Errorf("failed to register callback for gauge EVENTS_MATCHED, err %v", err)
   396  	}
   397  
   398  	_, err = meter.RegisterCallback(func(_ context.Context, o metric.Observer) error {
   399  		emitSegmentLatencyMinMsMap(ctx, o)
   400  		return nil
   401  	}, SEGMENT_LATENCY_MIN_MS)
   402  	if err != nil {
   403  		log.Errorf("failed to register callback for gauge SEGMENT_LATENCY_MIN_MS, err %v", err)
   404  	}
   405  
   406  	_, err = meter.RegisterCallback(func(_ context.Context, o metric.Observer) error {
   407  		emitSegmentLatencyMaxMsMap(ctx, o)
   408  		return nil
   409  	}, SEGMENT_LATENCY_MAX_MS)
   410  	if err != nil {
   411  		log.Errorf("failed to register callback for gauge SEGMENT_LATENCY_MAX_MS, err %v", err)
   412  	}
   413  
   414  	_, err = meter.RegisterCallback(func(_ context.Context, o metric.Observer) error {
   415  		emitSegmentLatencyAvgMsMap(ctx, o)
   416  		return nil
   417  	}, SEGMENT_LATENCY_AVG_MS)
   418  	if err != nil {
   419  		log.Errorf("failed to register callback for gauge SEGMENT_LATENCY_AVG_MS, err %v", err)
   420  	}
   421  
   422  	_, err = meter.RegisterCallback(func(_ context.Context, o metric.Observer) error {
   423  		emitSegmentLatencyP95MsMap(ctx, o)
   424  		return nil
   425  	}, SEGMENT_LATENCY_P95_MS)
   426  	if err != nil {
   427  		log.Errorf("failed to register callback for gauge SEGMENT_LATENCY_P95_MS, err %v", err)
   428  	}
   429  
   430  }
   431  
   432  func emitQueryLatencyMs(ctx context.Context, o metric.Observer) {
   433  	queryLatencyMsLock.Lock()
   434  	defer queryLatencyMsLock.Unlock()
   435  	for mkey, mentry := range queryLatencyMsMap {
   436  		if mentry.count != 0 {
   437  			attrs := []attribute.KeyValue{
   438  				attribute.String(mentry.labelkey, mentry.labelval),
   439  			}
   440  			o.ObserveInt64(QUERY_LATENCY_MS, int64(mentry.sum/mentry.count), metric.WithAttributes(attrs...))
   441  		}
   442  		delete(queryLatencyMsMap, mkey)
   443  	}
   444  }
   445  
   446  func emitEventCountPerIndexMap(ctx context.Context, o metric.Observer) {
   447  	eventCountPerIndexGaugeLock.Lock()
   448  	defer eventCountPerIndexGaugeLock.Unlock()
   449  	for mkey, mentry := range eventCountPerIndexMap {
   450  		if mentry.count != 0 {
   451  			attrs := []attribute.KeyValue{
   452  				attribute.String(mentry.labelkey, mentry.labelval),
   453  			}
   454  			o.ObserveInt64(EVENT_COUNT_PER_INDEX, int64(mentry.sum/mentry.count), metric.WithAttributes(attrs...))
   455  		}
   456  		delete(eventCountPerIndexMap, mkey)
   457  	}
   458  }
   459  
   460  func emitBytesCountPerIndexMap(ctx context.Context, o metric.Observer) {
   461  	bytesCountPerIndexGaugeLock.Lock()
   462  	defer bytesCountPerIndexGaugeLock.Unlock()
   463  	for mkey, mentry := range bytesCountPerIndexMap {
   464  		if mentry.count != 0 {
   465  			attrs := []attribute.KeyValue{
   466  				attribute.String(mentry.labelkey, mentry.labelval),
   467  			}
   468  			o.ObserveInt64(BYTES_COUNT_PER_INDEX, int64(mentry.sum/mentry.count), metric.WithAttributes(attrs...))
   469  		}
   470  		delete(bytesCountPerIndexMap, mkey)
   471  	}
   472  }
   473  
   474  func emitOnDiskBytesPerIndexMap(ctx context.Context, o metric.Observer) {
   475  	onDiskBytesPerIndexLock.Lock()
   476  	defer onDiskBytesPerIndexLock.Unlock()
   477  	for mkey, mentry := range onDiskBytesPerIndexMap {
   478  		if mentry.count != 0 {
   479  			attrs := []attribute.KeyValue{
   480  				attribute.String(mentry.labelkey, mentry.labelval),
   481  			}
   482  			o.ObserveInt64(ON_DISK_BYTES_PER_INDEX, int64(mentry.sum/mentry.count), metric.WithAttributes(attrs...))
   483  		}
   484  		delete(onDiskBytesPerIndexMap, mkey)
   485  	}
   486  }
   487  
   488  func emitSegmentLatencyMinMsMap(ctx context.Context, o metric.Observer) {
   489  	segmentLatencyMinMsLock.Lock()
   490  	defer segmentLatencyMinMsLock.Unlock()
   491  	for mkey, mentry := range segmentLatencyMinMsMap {
   492  		if mentry.count != 0 {
   493  			attrs := []attribute.KeyValue{
   494  				attribute.String(mentry.labelkey, mentry.labelval),
   495  			}
   496  			o.ObserveInt64(SEGMENT_LATENCY_MIN_MS, int64(mentry.sum/mentry.count), metric.WithAttributes(attrs...))
   497  		}
   498  		delete(segmentLatencyMinMsMap, mkey)
   499  	}
   500  }
   501  
   502  func emitSegmentLatencyMaxMsMap(ctx context.Context, o metric.Observer) {
   503  	segmentLatencyMaxMsLock.Lock()
   504  	defer segmentLatencyMaxMsLock.Unlock()
   505  	for mkey, mentry := range segmentLatencyMaxMsMap {
   506  		if mentry.count != 0 {
   507  			attrs := []attribute.KeyValue{
   508  				attribute.String(mentry.labelkey, mentry.labelval),
   509  			}
   510  			o.ObserveInt64(SEGMENT_LATENCY_MAX_MS, int64(mentry.sum/mentry.count), metric.WithAttributes(attrs...))
   511  		}
   512  		delete(segmentLatencyMaxMsMap, mkey)
   513  	}
   514  }
   515  
   516  func emitSegmentLatencyAvgMsMap(ctx context.Context, o metric.Observer) {
   517  	segmentLatencyAvgMsLock.Lock()
   518  	defer segmentLatencyAvgMsLock.Unlock()
   519  	for mkey, mentry := range segmentLatencyAvgMsMap {
   520  		if mentry.count != 0 {
   521  			attrs := []attribute.KeyValue{
   522  				attribute.String(mentry.labelkey, mentry.labelval),
   523  			}
   524  			o.ObserveInt64(SEGMENT_LATENCY_AVG_MS, int64(mentry.sum/mentry.count), metric.WithAttributes(attrs...))
   525  		}
   526  		delete(segmentLatencyAvgMsMap, mkey)
   527  	}
   528  }
   529  
   530  func emitSegmentLatencyP95MsMap(ctx context.Context, o metric.Observer) {
   531  	segmentLatencyP95MsLock.Lock()
   532  	defer segmentLatencyP95MsLock.Unlock()
   533  	for mkey, mentry := range segmentLatencyP95MsMap {
   534  		if mentry.count != 0 {
   535  			attrs := []attribute.KeyValue{
   536  				attribute.String(mentry.labelkey, mentry.labelval),
   537  			}
   538  			o.ObserveInt64(SEGMENT_LATENCY_P95_MS, int64(mentry.sum/mentry.count), metric.WithAttributes(attrs...))
   539  		}
   540  		delete(segmentLatencyP95MsMap, mkey)
   541  	}
   542  }