diff --git a/core/corehttp/metrics.go b/core/corehttp/metrics.go index 5d00a3c4c..4dee41aed 100644 --- a/core/corehttp/metrics.go +++ b/core/corehttp/metrics.go @@ -29,7 +29,7 @@ func MetricsCollectionOption(handlerName string) ServeOption { var ( peersTotalMetric = prometheus.NewDesc( prometheus.BuildFQName("ipfs", "p2p", "peers_total"), - "Number of connected peers", nil, nil) + "Number of connected peers", []string{"transport"}, nil) ) type IpfsNodeCollector struct { @@ -41,13 +41,24 @@ func (_ IpfsNodeCollector) Describe(ch chan<- *prometheus.Desc) { } func (c IpfsNodeCollector) Collect(ch chan<- prometheus.Metric) { - ch <- prometheus.MustNewConstMetric( - peersTotalMetric, - prometheus.GaugeValue, - c.PeersTotalValue(), - ) + for tr, val := range c.PeersTotalValues() { + ch <- prometheus.MustNewConstMetric( + peersTotalMetric, + prometheus.GaugeValue, + val, + tr, + ) + } } -func (c IpfsNodeCollector) PeersTotalValue() float64 { - return float64(len(c.Node.PeerHost.Network().Conns())) +func (c IpfsNodeCollector) PeersTotalValues() map[string]float64 { + vals := make(map[string]float64) + for _, conn := range c.Node.PeerHost.Network().Conns() { + tr := "" + for _, proto := range conn.RemoteMultiaddr().Protocols() { + tr = tr + "/" + proto.Name + } + vals[tr] = vals[tr] + 1 + } + return vals } diff --git a/core/corehttp/metrics_test.go b/core/corehttp/metrics_test.go index 7495360f7..98859f00f 100644 --- a/core/corehttp/metrics_test.go +++ b/core/corehttp/metrics_test.go @@ -39,8 +39,11 @@ func TestPeersTotal(t *testing.T) { node := &core.IpfsNode{PeerHost: hosts[0]} collector := IpfsNodeCollector{Node: node} - actual := collector.PeersTotalValue() - if actual != 3 { - t.Fatalf("expected 3 peers, got %d", int(actual)) + actual := collector.PeersTotalValues() + if len(actual) != 1 { + t.Fatalf("expected 1 peers transport, got %d", len(actual)) + } + if actual["/ip4/tcp"] != float64(3) { + t.Fatalf("expected 3 peers, got %s", actual["/ip4/tcp"]) } }