// Licensed to the LF AI & Data foundation under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package metrics import ( "net/http" // nolint:gosec _ "net/http/pprof" "github.com/milvus-io/milvus/internal/log" "github.com/milvus-io/milvus/internal/util/typeutil" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" "go.uber.org/zap" ) const ( milvusNamespace = "milvus" AbandonLabel = "abandon" SearchLabel = "search" QueryLabel = "query" CacheHitLabel = "hit" CacheMissLabel = "miss" ) var ( // RootCoordProxyLister counts the num of registered proxy nodes RootCoordProxyLister = prometheus.NewGaugeVec( prometheus.GaugeOpts{ Namespace: milvusNamespace, Subsystem: typeutil.RootCoordRole, Name: "list_of_proxy", Help: "List of proxy nodes which have registered with etcd", }, []string{"client_id"}) //////////////////////////////////////////////////////////////////////////// // for grpc // RootCoordCreateCollectionCounter counts the num of calls of CreateCollection RootCoordCreateCollectionCounter = prometheus.NewCounterVec( prometheus.CounterOpts{ Namespace: milvusNamespace, Subsystem: typeutil.RootCoordRole, Name: "create_collection_total", Help: "Counter of create collection", }, []string{"client_id", "type"}) // RootCoordDropCollectionCounter counts the num of calls of DropCollection RootCoordDropCollectionCounter = prometheus.NewCounterVec( prometheus.CounterOpts{ Namespace: milvusNamespace, Subsystem: typeutil.RootCoordRole, Name: "drop_collection_total", Help: "Counter of drop collection", }, []string{"client_id", "type"}) // RootCoordHasCollectionCounter counts the num of calls of HasCollection RootCoordHasCollectionCounter = prometheus.NewCounterVec( prometheus.CounterOpts{ Namespace: milvusNamespace, Subsystem: typeutil.RootCoordRole, Name: "has_collection_total", Help: "Counter of has collection", }, []string{"client_id", "type"}) // RootCoordDescribeCollectionCounter counts the num of calls of DescribeCollection RootCoordDescribeCollectionCounter = prometheus.NewCounterVec( prometheus.CounterOpts{ Namespace: milvusNamespace, Subsystem: typeutil.RootCoordRole, Name: "describe_collection_total", Help: "Counter of describe collection", }, []string{"client_id", "type"}) // RootCoordShowCollectionsCounter counts the num of calls of ShowCollections RootCoordShowCollectionsCounter = prometheus.NewCounterVec( prometheus.CounterOpts{ Namespace: milvusNamespace, Subsystem: typeutil.RootCoordRole, Name: "show_collections_total", Help: "Counter of show collections", }, []string{"client_id", "type"}) // RootCoordCreatePartitionCounter counts the num of calls of CreatePartition RootCoordCreatePartitionCounter = prometheus.NewCounterVec( prometheus.CounterOpts{ Namespace: milvusNamespace, Subsystem: typeutil.RootCoordRole, Name: "create_partition_total", Help: "Counter of create partition", }, []string{"client_id", "type"}) // RootCoordDropPartitionCounter counts the num of calls of DropPartition RootCoordDropPartitionCounter = prometheus.NewCounterVec( prometheus.CounterOpts{ Namespace: milvusNamespace, Subsystem: typeutil.RootCoordRole, Name: "drop_partition_total", Help: "Counter of drop partition", }, []string{"client_id", "type"}) // RootCoordHasPartitionCounter counts the num of calls of HasPartition RootCoordHasPartitionCounter = prometheus.NewCounterVec( prometheus.CounterOpts{ Namespace: milvusNamespace, Subsystem: typeutil.RootCoordRole, Name: "has_partition_total", Help: "Counter of has partition", }, []string{"client_id", "type"}) // RootCoordShowPartitionsCounter counts the num of calls of ShowPartitions RootCoordShowPartitionsCounter = prometheus.NewCounterVec( prometheus.CounterOpts{ Namespace: milvusNamespace, Subsystem: typeutil.RootCoordRole, Name: "show_partitions_total", Help: "Counter of show partitions", }, []string{"client_id", "type"}) // RootCoordCreateIndexCounter counts the num of calls of CreateIndex RootCoordCreateIndexCounter = prometheus.NewCounterVec( prometheus.CounterOpts{ Namespace: milvusNamespace, Subsystem: typeutil.RootCoordRole, Name: "create_index_total", Help: "Counter of create index", }, []string{"client_id", "type"}) // RootCoordDropIndexCounter counts the num of calls of DropIndex RootCoordDropIndexCounter = prometheus.NewCounterVec( prometheus.CounterOpts{ Namespace: milvusNamespace, Subsystem: typeutil.RootCoordRole, Name: "drop_index_total", Help: "Counter of drop index", }, []string{"client_id", "type"}) // RootCoordDescribeIndexCounter counts the num of calls of DescribeIndex RootCoordDescribeIndexCounter = prometheus.NewCounterVec( prometheus.CounterOpts{ Namespace: milvusNamespace, Subsystem: typeutil.RootCoordRole, Name: "describe_index_total", Help: "Counter of describe index", }, []string{"client_id", "type"}) // RootCoordDescribeSegmentCounter counts the num of calls of DescribeSegment RootCoordDescribeSegmentCounter = prometheus.NewCounterVec( prometheus.CounterOpts{ Namespace: milvusNamespace, Subsystem: typeutil.RootCoordRole, Name: "describe_segment_total", Help: "Counter of describe segment", }, []string{"client_id", "type"}) // RootCoordShowSegmentsCounter counts the num of calls of ShowSegments RootCoordShowSegmentsCounter = prometheus.NewCounterVec( prometheus.CounterOpts{ Namespace: milvusNamespace, Subsystem: typeutil.RootCoordRole, Name: "show_segments_total", Help: "Counter of show segments", }, []string{"client_id", "type"}) //////////////////////////////////////////////////////////////////////////// // for time tick // RootCoordInsertChannelTimeTick counts the time tick num of insert channel in 24H RootCoordInsertChannelTimeTick = prometheus.NewGaugeVec( prometheus.GaugeOpts{ Namespace: milvusNamespace, Subsystem: typeutil.RootCoordRole, Name: "insert_channel_time_tick", Help: "Time tick of insert Channel in 24H", }, []string{"vchannel"}) // RootCoordDDChannelTimeTick counts the time tick num of dd channel in 24H RootCoordDDChannelTimeTick = prometheus.NewGauge( prometheus.GaugeOpts{ Namespace: milvusNamespace, Subsystem: typeutil.RootCoordRole, Name: "dd_channel_time_tick", Help: "Time tick of dd Channel in 24H", }) ) //RegisterRootCoord registers RootCoord metrics func RegisterRootCoord() { prometheus.MustRegister(RootCoordProxyLister) // for grpc prometheus.MustRegister(RootCoordCreateCollectionCounter) prometheus.MustRegister(RootCoordDropCollectionCounter) prometheus.MustRegister(RootCoordHasCollectionCounter) prometheus.MustRegister(RootCoordDescribeCollectionCounter) prometheus.MustRegister(RootCoordShowCollectionsCounter) prometheus.MustRegister(RootCoordCreatePartitionCounter) prometheus.MustRegister(RootCoordDropPartitionCounter) prometheus.MustRegister(RootCoordHasPartitionCounter) prometheus.MustRegister(RootCoordShowPartitionsCounter) prometheus.MustRegister(RootCoordCreateIndexCounter) prometheus.MustRegister(RootCoordDropIndexCounter) prometheus.MustRegister(RootCoordDescribeIndexCounter) prometheus.MustRegister(RootCoordDescribeSegmentCounter) prometheus.MustRegister(RootCoordShowSegmentsCounter) // for time tick prometheus.MustRegister(RootCoordInsertChannelTimeTick) prometheus.MustRegister(RootCoordDDChannelTimeTick) //prometheus.MustRegister(PanicCounter) } var ( //DataCoordDataNodeList records the num of regsitered data nodes DataCoordDataNodeList = prometheus.NewGaugeVec( prometheus.GaugeOpts{ Namespace: milvusNamespace, Subsystem: typeutil.DataCoordRole, Name: "list_of_data_node", Help: "List of data nodes registered within etcd", }, []string{"status"}, ) ) //RegisterDataCoord registers DataCoord metrics func RegisterDataCoord() { prometheus.MustRegister(DataCoordDataNodeList) } var ( // DataNodeFlushSegmentsCounter counts the num of calls of FlushSegments DataNodeFlushSegmentsCounter = prometheus.NewCounterVec( prometheus.CounterOpts{ Namespace: milvusNamespace, Subsystem: typeutil.DataNodeRole, Name: "flush_segments_total", Help: "Counter of flush segments", }, []string{"type"}) // DataNodeWatchDmChannelsCounter counts the num of calls of WatchDmChannels DataNodeWatchDmChannelsCounter = prometheus.NewCounterVec( prometheus.CounterOpts{ Namespace: milvusNamespace, Subsystem: typeutil.DataNodeRole, Name: "watch_dm_channels_total", Help: "Counter of watch dm channel", }, []string{"type"}) ) //ServeHTTP serves prometheus http service func ServeHTTP() { http.Handle("/metrics", promhttp.Handler()) go func() { if err := http.ListenAndServe(":9091", nil); err != nil { log.Error("handle metrics failed", zap.Error(err)) } }() }