142 lines
4.7 KiB
Go
Raw Permalink Normal View History

package metrics
import (
"net/http"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/zeromicro/go-zero/core/logx"
)
const namespace = "muyu"
const subsystem = "inventory"
// ---- Business Counters ----
var ProductCreatedTotal = prometheus.NewCounterVec(prometheus.CounterOpts{
Namespace: namespace, Subsystem: subsystem,
Name: "product_created_total",
Help: "Total number of products created.",
}, []string{"tenant_id", "product_name", "spec", "color"})
var ProductDeletedTotal = prometheus.NewCounterVec(prometheus.CounterOpts{
Namespace: namespace, Subsystem: subsystem,
Name: "product_deleted_total",
Help: "Total number of products deleted (soft delete).",
}, []string{"tenant_id"})
var ImportOperationsTotal = prometheus.NewCounterVec(prometheus.CounterOpts{
Namespace: namespace, Subsystem: subsystem,
Name: "import_operations_total",
Help: "Total number of import operations executed.",
}, []string{"tenant_id", "operator"})
var ImportProductsTotal = prometheus.NewCounterVec(prometheus.CounterOpts{
Namespace: namespace, Subsystem: subsystem,
Name: "import_products_total",
Help: "Total number of products processed during imports.",
}, []string{"tenant_id", "result"})
var InboundLengthMetersTotal = prometheus.NewCounterVec(prometheus.CounterOpts{
Namespace: namespace, Subsystem: subsystem,
Name: "inbound_length_meters_total",
Help: "Total length (meters) of fabric added to inventory.",
}, []string{"tenant_id", "product_name", "color", "operation"})
var InboundBoltsTotal = prometheus.NewCounterVec(prometheus.CounterOpts{
Namespace: namespace, Subsystem: subsystem,
Name: "inbound_bolts_total",
Help: "Total number of bolt records added to inventory.",
}, []string{"tenant_id", "operation"})
var PansSavedTotal = prometheus.NewCounterVec(prometheus.CounterOpts{
Namespace: namespace, Subsystem: subsystem,
Name: "pans_saved_total",
Help: "Total number of pan-save operations.",
}, []string{"tenant_id", "product_id"})
var StockCheckCreatedTotal = prometheus.NewCounterVec(prometheus.CounterOpts{
Namespace: namespace, Subsystem: subsystem,
Name: "stock_check_created_total",
Help: "Total number of stock check records created.",
}, []string{"tenant_id"})
var StockCheckConfirmedTotal = prometheus.NewCounterVec(prometheus.CounterOpts{
Namespace: namespace, Subsystem: subsystem,
Name: "stock_check_confirmed_total",
Help: "Total number of stock checks confirmed.",
}, []string{"tenant_id"})
var StockAdjustCreatedTotal = prometheus.NewCounterVec(prometheus.CounterOpts{
Namespace: namespace, Subsystem: subsystem,
Name: "stock_adjust_created_total",
Help: "Total number of stock adjustments created.",
}, []string{"tenant_id", "reason"})
var StockAdjustApprovedTotal = prometheus.NewCounterVec(prometheus.CounterOpts{
Namespace: namespace, Subsystem: subsystem,
Name: "stock_adjust_approved_total",
Help: "Total number of stock adjustments approved/rejected.",
}, []string{"tenant_id", "action"})
var StockAdjustQuantityMeters = prometheus.NewCounterVec(prometheus.CounterOpts{
Namespace: namespace, Subsystem: subsystem,
Name: "stock_adjust_quantity_meters_total",
Help: "Total adjusted quantity in meters (absolute value, split by direction).",
}, []string{"tenant_id", "direction"})
// ---- Histograms ----
var ImportBatchSize = prometheus.NewHistogramVec(prometheus.HistogramOpts{
Namespace: namespace, Subsystem: subsystem,
Name: "import_batch_size",
Help: "Number of products per import operation.",
Buckets: []float64{1, 5, 10, 50, 100, 200, 500, 1000},
}, []string{"tenant_id"})
// ---- RPC Operational Metrics ----
var RPCDurationSeconds = prometheus.NewHistogramVec(prometheus.HistogramOpts{
Namespace: namespace, Subsystem: subsystem,
Name: "rpc_duration_seconds",
Help: "Duration of RPC calls in seconds.",
Buckets: prometheus.DefBuckets,
}, []string{"method"})
var RPCRequestsTotal = prometheus.NewCounterVec(prometheus.CounterOpts{
Namespace: namespace, Subsystem: subsystem,
Name: "rpc_requests_total",
Help: "Total number of RPC requests.",
}, []string{"method", "code"})
func init() {
prometheus.MustRegister(
ProductCreatedTotal,
ProductDeletedTotal,
ImportOperationsTotal,
ImportProductsTotal,
InboundLengthMetersTotal,
InboundBoltsTotal,
PansSavedTotal,
StockCheckCreatedTotal,
StockCheckConfirmedTotal,
StockAdjustCreatedTotal,
StockAdjustApprovedTotal,
StockAdjustQuantityMeters,
ImportBatchSize,
RPCDurationSeconds,
RPCRequestsTotal,
)
}
func StartHTTP(addr string) {
mux := http.NewServeMux()
mux.Handle("/metrics", promhttp.Handler())
go func() {
logx.Infof("prometheus metrics listening on %s", addr)
if err := http.ListenAndServe(addr, mux); err != nil {
logx.Errorf("prometheus http server error: %v", err)
}
}()
}