@@ -18,41 +18,182 @@ package metrics
1818
1919import (
2020 "context"
21+ "fmt"
22+ "net/http"
2123 "time"
2224
2325 "github.com/hyperledger/firefly-common/pkg/config"
26+ "github.com/hyperledger/firefly-common/pkg/metric"
2427 "github.com/hyperledger/firefly-transaction-manager/internal/tmconfig"
28+ "github.com/prometheus/client_golang/prometheus"
29+ "github.com/prometheus/client_golang/prometheus/promhttp"
2530)
2631
32+ const metricsTransactionManagerPrefix = "tm"
33+
34+ // REST api-server and transaction handler are sub-subsystem
35+ var metricsTransactionHandlerSubsystemName = fmt .Sprintf ("%s_%s" , metricsTransactionManagerPrefix , "th" )
36+ var metricsRESTAPIServerSubSystemName = fmt .Sprintf ("%s_%s" , metricsTransactionManagerPrefix , "api_server_rest" )
37+
2738type metricsManager struct {
28- ctx context.Context
29- metricsEnabled bool
30- timeMap map [string ]time.Time
39+ ctx context.Context
40+ metricsEnabled bool
41+ metricsRegistry metric.MetricsRegistry
42+ txHandlerMetricsManager metric.MetricsManager
43+ timeMap map [string ]time.Time
3144}
3245
3346func NewMetricsManager (ctx context.Context ) Metrics {
47+ metricsRegistry := metric .NewPrometheusMetricsRegistry ()
48+ txHandlerMetricsManager , _ := metricsRegistry .NewMetricsManagerForSubsystem (ctx , metricsTransactionHandlerSubsystemName )
49+ _ = metricsRegistry .NewHTTPMetricsInstrumentationsForSubsystem (
50+ ctx ,
51+ metricsRESTAPIServerSubSystemName ,
52+ true ,
53+ prometheus .DefBuckets ,
54+ map [string ]string {},
55+ )
3456 mm := & metricsManager {
35- ctx : ctx ,
36- metricsEnabled : config .GetBool (tmconfig .MetricsEnabled ),
37- timeMap : make (map [string ]time.Time ),
57+ ctx : ctx ,
58+ metricsEnabled : config .GetBool (tmconfig .MetricsEnabled ),
59+ timeMap : make (map [string ]time.Time ),
60+ metricsRegistry : metricsRegistry ,
61+ txHandlerMetricsManager : txHandlerMetricsManager ,
3862 }
3963
4064 return mm
4165}
4266
43- func (mm * metricsManager ) TransactionSubmissionError () {
44- TransactionSubmissionError . Inc ()
67+ func (mm * metricsManager ) IsMetricsEnabled () bool {
68+ return mm . metricsEnabled
4569}
46- func (mm * metricsManager ) TransactionsInFlightSet (count float64 ) {
47- TransactionsInFlight .Set (count )
70+
71+ func (mm * metricsManager ) HTTPHandler () http.Handler {
72+ httpHandler , _ := mm .metricsRegistry .HTTPHandler (mm .ctx , promhttp.HandlerOpts {})
73+ return httpHandler
4874}
4975
50- func (mm * metricsManager ) IsMetricsEnabled () bool {
51- return mm .metricsEnabled
76+ func (mm * metricsManager ) GetAPIServerRESTHTTPMiddleware () func (next http.Handler ) http.Handler {
77+ httpMiddleware , _ := mm .metricsRegistry .GetHTTPMetricsInstrumentationsMiddlewareForSubsystem (mm .ctx , metricsRESTAPIServerSubSystemName )
78+ return httpMiddleware
5279}
5380
5481type Metrics interface {
55- TransactionSubmissionError ()
56- TransactionsInFlightSet (count float64 )
5782 IsMetricsEnabled () bool
83+
84+ // HTTPHandler returns the HTTP handler of this metrics registry
85+ HTTPHandler () http.Handler
86+
87+ GetAPIServerRESTHTTPMiddleware () func (next http.Handler ) http.Handler
88+
89+ // functions for transaction handler to define and emit metrics
90+ TransactionHandlerMetrics
91+ }
92+
93+ // Transaction handler metrics are defined and emitted by transaction handlers
94+ type TransactionHandlerMetrics interface {
95+ // functions for declaring new metrics
96+ InitTxHandlerCounterMetric (ctx context.Context , metricName string , helpText string , withDefaultLabels bool )
97+ InitTxHandlerCounterMetricWithLabels (ctx context.Context , metricName string , helpText string , labelNames []string , withDefaultLabels bool )
98+ InitTxHandlerGaugeMetric (ctx context.Context , metricName string , helpText string , withDefaultLabels bool )
99+ InitTxHandlerGaugeMetricWithLabels (ctx context.Context , metricName string , helpText string , labelNames []string , withDefaultLabels bool )
100+ InitTxHandlerHistogramMetric (ctx context.Context , metricName string , helpText string , buckets []float64 , withDefaultLabels bool )
101+ InitTxHandlerHistogramMetricWithLabels (ctx context.Context , metricName string , helpText string , buckets []float64 , labelNames []string , withDefaultLabels bool )
102+ InitTxHandlerSummaryMetric (ctx context.Context , metricName string , helpText string , withDefaultLabels bool )
103+ InitTxHandlerSummaryMetricWithLabels (ctx context.Context , metricName string , helpText string , labelNames []string , withDefaultLabels bool )
104+
105+ // functions for use existing metrics
106+ SetTxHandlerGaugeMetric (ctx context.Context , metricName string , number float64 , defaultLabels * metric.FireflyDefaultLabels )
107+ SetTxHandlerGaugeMetricWithLabels (ctx context.Context , metricName string , number float64 , labels map [string ]string , defaultLabels * metric.FireflyDefaultLabels )
108+ IncTxHandlerCounterMetric (ctx context.Context , metricName string , defaultLabels * metric.FireflyDefaultLabels )
109+ IncTxHandlerCounterMetricWithLabels (ctx context.Context , metricName string , labels map [string ]string , defaultLabels * metric.FireflyDefaultLabels )
110+ ObserveTxHandlerHistogramMetric (ctx context.Context , metricName string , number float64 , defaultLabels * metric.FireflyDefaultLabels )
111+ ObserveTxHandlerHistogramMetricWithLabels (ctx context.Context , metricName string , number float64 , labels map [string ]string , defaultLabels * metric.FireflyDefaultLabels )
112+ ObserveTxHandlerSummaryMetric (ctx context.Context , metricName string , number float64 , defaultLabels * metric.FireflyDefaultLabels )
113+ ObserveTxHandlerSummaryMetricWithLabels (ctx context.Context , metricName string , number float64 , labels map [string ]string , defaultLabels * metric.FireflyDefaultLabels )
114+ }
115+
116+ func (mm * metricsManager ) InitTxHandlerCounterMetric (ctx context.Context , metricName string , helpText string , withDefaultLabels bool ) {
117+ if mm .metricsEnabled {
118+ mm .txHandlerMetricsManager .NewCounterMetric (ctx , metricName , helpText , withDefaultLabels )
119+ }
120+ }
121+ func (mm * metricsManager ) InitTxHandlerCounterMetricWithLabels (ctx context.Context , metricName string , helpText string , labelNames []string , withDefaultLabels bool ) {
122+ if mm .metricsEnabled {
123+ mm .txHandlerMetricsManager .NewCounterMetricWithLabels (ctx , metricName , helpText , labelNames , withDefaultLabels )
124+ }
125+ }
126+ func (mm * metricsManager ) InitTxHandlerGaugeMetric (ctx context.Context , metricName string , helpText string , withDefaultLabels bool ) {
127+ if mm .metricsEnabled {
128+ mm .txHandlerMetricsManager .NewGaugeMetric (ctx , metricName , helpText , withDefaultLabels )
129+ }
130+ }
131+ func (mm * metricsManager ) InitTxHandlerGaugeMetricWithLabels (ctx context.Context , metricName string , helpText string , labelNames []string , withDefaultLabels bool ) {
132+ if mm .metricsEnabled {
133+ mm .txHandlerMetricsManager .NewGaugeMetricWithLabels (ctx , metricName , helpText , labelNames , withDefaultLabels )
134+ }
135+ }
136+ func (mm * metricsManager ) InitTxHandlerHistogramMetric (ctx context.Context , metricName string , helpText string , buckets []float64 , withDefaultLabels bool ) {
137+ if mm .metricsEnabled {
138+ mm .txHandlerMetricsManager .NewHistogramMetric (ctx , metricName , helpText , buckets , withDefaultLabels )
139+ }
140+ }
141+ func (mm * metricsManager ) InitTxHandlerHistogramMetricWithLabels (ctx context.Context , metricName string , helpText string , buckets []float64 , labelNames []string , withDefaultLabels bool ) {
142+ if mm .metricsEnabled {
143+ mm .txHandlerMetricsManager .NewHistogramMetricWithLabels (ctx , metricName , helpText , buckets , labelNames , withDefaultLabels )
144+ }
145+ }
146+ func (mm * metricsManager ) InitTxHandlerSummaryMetric (ctx context.Context , metricName string , helpText string , withDefaultLabels bool ) {
147+ if mm .metricsEnabled {
148+ mm .txHandlerMetricsManager .NewSummaryMetric (ctx , metricName , helpText , withDefaultLabels )
149+ }
150+ }
151+ func (mm * metricsManager ) InitTxHandlerSummaryMetricWithLabels (ctx context.Context , metricName string , helpText string , labelNames []string , withDefaultLabels bool ) {
152+ if mm .metricsEnabled {
153+ mm .txHandlerMetricsManager .NewSummaryMetricWithLabels (ctx , metricName , helpText , labelNames , withDefaultLabels )
154+ }
155+ }
156+
157+ // functions for use existing metrics
158+ func (mm * metricsManager ) SetTxHandlerGaugeMetric (ctx context.Context , metricName string , number float64 , defaultLabels * metric.FireflyDefaultLabels ) {
159+ if mm .metricsEnabled {
160+ mm .txHandlerMetricsManager .SetGaugeMetric (ctx , metricName , number , defaultLabels )
161+ }
162+ }
163+ func (mm * metricsManager ) SetTxHandlerGaugeMetricWithLabels (ctx context.Context , metricName string , number float64 , labels map [string ]string , defaultLabels * metric.FireflyDefaultLabels ) {
164+ if mm .metricsEnabled {
165+ mm .txHandlerMetricsManager .SetGaugeMetricWithLabels (ctx , metricName , number , labels , defaultLabels )
166+ }
167+ }
168+
169+ func (mm * metricsManager ) IncTxHandlerCounterMetric (ctx context.Context , metricName string , defaultLabels * metric.FireflyDefaultLabels ) {
170+ if mm .metricsEnabled {
171+ mm .txHandlerMetricsManager .IncCounterMetric (ctx , metricName , defaultLabels )
172+ }
173+ }
174+ func (mm * metricsManager ) IncTxHandlerCounterMetricWithLabels (ctx context.Context , metricName string , labels map [string ]string , defaultLabels * metric.FireflyDefaultLabels ) {
175+ if mm .metricsEnabled {
176+ mm .txHandlerMetricsManager .IncCounterMetricWithLabels (ctx , metricName , labels , defaultLabels )
177+ }
178+ }
179+ func (mm * metricsManager ) ObserveTxHandlerHistogramMetric (ctx context.Context , metricName string , number float64 , defaultLabels * metric.FireflyDefaultLabels ) {
180+ if mm .metricsEnabled {
181+ mm .txHandlerMetricsManager .ObserveHistogramMetric (ctx , metricName , number , defaultLabels )
182+ }
183+ }
184+ func (mm * metricsManager ) ObserveTxHandlerHistogramMetricWithLabels (ctx context.Context , metricName string , number float64 , labels map [string ]string , defaultLabels * metric.FireflyDefaultLabels ) {
185+ if mm .metricsEnabled {
186+ mm .txHandlerMetricsManager .ObserveHistogramMetricWithLabels (ctx , metricName , number , labels , defaultLabels )
187+ }
188+ }
189+
190+ func (mm * metricsManager ) ObserveTxHandlerSummaryMetric (ctx context.Context , metricName string , number float64 , defaultLabels * metric.FireflyDefaultLabels ) {
191+ if mm .metricsEnabled {
192+ mm .txHandlerMetricsManager .ObserveSummaryMetric (ctx , metricName , number , defaultLabels )
193+ }
194+ }
195+ func (mm * metricsManager ) ObserveTxHandlerSummaryMetricWithLabels (ctx context.Context , metricName string , number float64 , labels map [string ]string , defaultLabels * metric.FireflyDefaultLabels ) {
196+ if mm .metricsEnabled {
197+ mm .txHandlerMetricsManager .ObserveSummaryMetricWithLabels (ctx , metricName , number , labels , defaultLabels )
198+ }
58199}
0 commit comments