github.com/weaviate/weaviate@v1.24.6/usecases/objects/metrics.go (about)

     1  //                           _       _
     2  // __      _____  __ ___   ___  __ _| |_ ___
     3  // \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \
     4  //  \ V  V /  __/ (_| |\ V /| | (_| | ||  __/
     5  //   \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___|
     6  //
     7  //  Copyright © 2016 - 2024 Weaviate B.V. All rights reserved.
     8  //
     9  //  CONTACT: hello@weaviate.io
    10  //
    11  
    12  package objects
    13  
    14  import (
    15  	"time"
    16  
    17  	"github.com/prometheus/client_golang/prometheus"
    18  	"github.com/weaviate/weaviate/usecases/monitoring"
    19  )
    20  
    21  type Metrics struct {
    22  	queriesCount       *prometheus.GaugeVec
    23  	batchTime          *prometheus.HistogramVec
    24  	dimensions         *prometheus.CounterVec
    25  	dimensionsCombined prometheus.Counter
    26  	groupClasses       bool
    27  }
    28  
    29  func NewMetrics(prom *monitoring.PrometheusMetrics) *Metrics {
    30  	if prom == nil {
    31  		return nil
    32  	}
    33  
    34  	return &Metrics{
    35  		queriesCount:       prom.QueriesCount,
    36  		batchTime:          prom.BatchTime,
    37  		dimensions:         prom.QueryDimensions,
    38  		dimensionsCombined: prom.QueryDimensionsCombined,
    39  		groupClasses:       prom.Group,
    40  	}
    41  }
    42  
    43  func (m *Metrics) queriesInc(queryType string) {
    44  	if m == nil {
    45  		return
    46  	}
    47  
    48  	m.queriesCount.With(prometheus.Labels{
    49  		"class_name": "n/a",
    50  		"query_type": queryType,
    51  	}).Inc()
    52  }
    53  
    54  func (m *Metrics) queriesDec(queryType string) {
    55  	if m == nil {
    56  		return
    57  	}
    58  
    59  	m.queriesCount.With(prometheus.Labels{
    60  		"class_name": "n/a",
    61  		"query_type": queryType,
    62  	}).Dec()
    63  }
    64  
    65  func (m *Metrics) BatchInc() {
    66  	m.queriesInc("batch")
    67  }
    68  
    69  func (m *Metrics) BatchDec() {
    70  	m.queriesDec("batch")
    71  }
    72  
    73  func (m *Metrics) BatchRefInc() {
    74  	m.queriesInc("batch_references")
    75  }
    76  
    77  func (m *Metrics) BatchRefDec() {
    78  	m.queriesDec("batch_references")
    79  }
    80  
    81  func (m *Metrics) BatchDeleteInc() {
    82  	m.queriesInc("batch_delete")
    83  }
    84  
    85  func (m *Metrics) BatchDeleteDec() {
    86  	m.queriesDec("batch_delete")
    87  }
    88  
    89  func (m *Metrics) AddObjectInc() {
    90  	m.queriesInc("add_object")
    91  }
    92  
    93  func (m *Metrics) AddObjectDec() {
    94  	m.queriesDec("add_object")
    95  }
    96  
    97  func (m *Metrics) UpdateObjectInc() {
    98  	m.queriesInc("update_object")
    99  }
   100  
   101  func (m *Metrics) UpdateObjectDec() {
   102  	m.queriesDec("update_object")
   103  }
   104  
   105  func (m *Metrics) MergeObjectInc() {
   106  	m.queriesInc("merge_object")
   107  }
   108  
   109  func (m *Metrics) MergeObjectDec() {
   110  	m.queriesDec("merge_object")
   111  }
   112  
   113  func (m *Metrics) DeleteObjectInc() {
   114  	m.queriesInc("delete_object")
   115  }
   116  
   117  func (m *Metrics) DeleteObjectDec() {
   118  	m.queriesDec("delete_object")
   119  }
   120  
   121  func (m *Metrics) GetObjectInc() {
   122  	m.queriesInc("get_object")
   123  }
   124  
   125  func (m *Metrics) GetObjectDec() {
   126  	m.queriesDec("get_object")
   127  }
   128  
   129  func (m *Metrics) HeadObjectInc() {
   130  	m.queriesInc("head_object")
   131  }
   132  
   133  func (m *Metrics) HeadObjectDec() {
   134  	m.queriesDec("head_object")
   135  }
   136  
   137  func (m *Metrics) AddReferenceInc() {
   138  	m.queriesInc("add_reference")
   139  }
   140  
   141  func (m *Metrics) AddReferenceDec() {
   142  	m.queriesDec("add_reference")
   143  }
   144  
   145  func (m *Metrics) UpdateReferenceInc() {
   146  	m.queriesInc("update_reference")
   147  }
   148  
   149  func (m *Metrics) UpdateReferenceDec() {
   150  	m.queriesDec("update_reference")
   151  }
   152  
   153  func (m *Metrics) DeleteReferenceInc() {
   154  	m.queriesInc("delete_reference")
   155  }
   156  
   157  func (m *Metrics) DeleteReferenceDec() {
   158  	m.queriesDec("delete_reference")
   159  }
   160  
   161  func (m *Metrics) BatchOp(op string, startNs int64) {
   162  	if m == nil {
   163  		return
   164  	}
   165  
   166  	took := float64(time.Now().UnixNano()-startNs) / float64(time.Millisecond)
   167  
   168  	m.batchTime.With(prometheus.Labels{
   169  		"operation":  op,
   170  		"class_name": "n/a",
   171  		"shard_name": "n/a",
   172  	}).Observe(float64(took))
   173  }
   174  
   175  func (m *Metrics) AddUsageDimensions(className, queryType, operation string, dims int) {
   176  	if m == nil {
   177  		return
   178  	}
   179  
   180  	if m.groupClasses {
   181  		className = "n/a"
   182  	}
   183  
   184  	m.dimensions.With(prometheus.Labels{
   185  		"class_name": className,
   186  		"operation":  operation,
   187  		"query_type": queryType,
   188  	}).Add(float64(dims))
   189  	m.dimensionsCombined.Add(float64(dims))
   190  }