github.com/openfga/openfga@v1.5.4-rc1/internal/condition/metrics/metrics.go (about)

     1  // Package metrics provides various metric and telemetry definitions for OpenFGA Conditions.
     2  package metrics
     3  
     4  import (
     5  	"time"
     6  
     7  	"github.com/prometheus/client_golang/prometheus"
     8  	"github.com/prometheus/client_golang/prometheus/promauto"
     9  
    10  	"github.com/openfga/openfga/internal/build"
    11  	"github.com/openfga/openfga/internal/server/config"
    12  	"github.com/openfga/openfga/internal/utils"
    13  )
    14  
    15  // Metrics provides access to Condition metrics.
    16  var Metrics *ConditionMetrics
    17  
    18  func init() {
    19  	m := &ConditionMetrics{
    20  		compilationTime: promauto.NewHistogram(prometheus.HistogramOpts{
    21  			Namespace: build.ProjectName,
    22  			Name:      "condition_compilation_duration_ms",
    23  			Help:      "A histogram measuring the compilation time (in milliseconds) of a Condition.",
    24  			Buckets:   []float64{1, 5, 15, 50, 100, 250, 500, 1000},
    25  		}),
    26  
    27  		evaluationTime: promauto.NewHistogram(prometheus.HistogramOpts{
    28  			Namespace: build.ProjectName,
    29  			Name:      "condition_evaluation_duration_ms",
    30  			Help:      "A histogram measuring the evaluation time (in milliseconds) of a Condition.",
    31  			Buckets:   []float64{0.1, 0.25, 0.5, 1, 5, 15, 50, 100, 250, 500},
    32  		}),
    33  
    34  		evaluationCost: promauto.NewHistogram(prometheus.HistogramOpts{
    35  			Namespace:                       build.ProjectName,
    36  			Name:                            "condition_evaluation_cost",
    37  			Help:                            "A histogram of the CEL evaluation cost of a Condition in a Relationship Tuple",
    38  			Buckets:                         utils.LinearBuckets(0, config.DefaultMaxConditionEvaluationCost, 10),
    39  			NativeHistogramBucketFactor:     1.1,
    40  			NativeHistogramMaxBucketNumber:  config.DefaultMaxConditionEvaluationCost,
    41  			NativeHistogramMinResetDuration: time.Hour,
    42  		}),
    43  	}
    44  
    45  	Metrics = m
    46  }
    47  
    48  type ConditionMetrics struct {
    49  	compilationTime prometheus.Histogram
    50  	evaluationTime  prometheus.Histogram
    51  	evaluationCost  prometheus.Histogram
    52  }
    53  
    54  // ObserveCompilationDuration records the duration (in milliseconds) that Condition compilation took.
    55  func (m *ConditionMetrics) ObserveCompilationDuration(elapsed time.Duration) {
    56  	m.compilationTime.Observe(float64(elapsed.Milliseconds()))
    57  }
    58  
    59  // ObserveEvaluationDuration records the duration (in milliseconds) that Condition evaluation took.
    60  func (m *ConditionMetrics) ObserveEvaluationDuration(elapsed time.Duration) {
    61  	m.evaluationTime.Observe(float64(elapsed.Milliseconds()))
    62  }
    63  
    64  // ObserveEvaluationCost records the CEL evaluation cost the Condition required to resolve the expression.
    65  func (m *ConditionMetrics) ObserveEvaluationCost(cost uint64) {
    66  	m.evaluationCost.Observe(float64(cost))
    67  }