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 }