2017-02-13 15:46:53 +00:00
|
|
|
// Package numpin implements an ipfs-cluster informer which determines how many
|
|
|
|
// items this peer is pinning and returns it as api.Metric
|
|
|
|
package numpin
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
|
|
|
|
rpc "github.com/hsanjuan/go-libp2p-gorpc"
|
|
|
|
|
|
|
|
"github.com/ipfs/ipfs-cluster/api"
|
|
|
|
)
|
|
|
|
|
|
|
|
// MetricTTL specifies how long our reported metric is valid in seconds.
|
|
|
|
var MetricTTL = 10
|
|
|
|
|
|
|
|
// MetricName specifies the name of our metric
|
|
|
|
var MetricName = "numpin"
|
|
|
|
|
|
|
|
// Informer is a simple object to implement the ipfscluster.Informer
|
|
|
|
// and Component interfaces
|
|
|
|
type Informer struct {
|
|
|
|
rpcClient *rpc.Client
|
|
|
|
}
|
|
|
|
|
2017-02-15 14:16:16 +00:00
|
|
|
// NewInformer returns an initialized Informer.
|
2017-02-13 15:46:53 +00:00
|
|
|
func NewInformer() *Informer {
|
|
|
|
return &Informer{}
|
|
|
|
}
|
|
|
|
|
|
|
|
// SetClient provides us with an rpc.Client which allows
|
|
|
|
// contacting other components in the cluster.
|
|
|
|
func (npi *Informer) SetClient(c *rpc.Client) {
|
|
|
|
npi.rpcClient = c
|
|
|
|
}
|
|
|
|
|
|
|
|
// Shutdown is called on cluster shutdown. We just invalidate
|
|
|
|
// any metrics from this point.
|
|
|
|
func (npi *Informer) Shutdown() error {
|
|
|
|
npi.rpcClient = nil
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// Name returns the name of this informer
|
|
|
|
func (npi *Informer) Name() string {
|
|
|
|
return MetricName
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetMetric contacts the IPFSConnector component and
|
|
|
|
// requests the `pin ls` command. We return the number
|
|
|
|
// of pins in IPFS.
|
|
|
|
func (npi *Informer) GetMetric() api.Metric {
|
|
|
|
if npi.rpcClient == nil {
|
|
|
|
return api.Metric{
|
|
|
|
Valid: false,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pinMap := make(map[string]api.IPFSPinStatus)
|
|
|
|
|
|
|
|
// make use of the RPC API to obtain information
|
|
|
|
// about the number of pins in IPFS. See RPCAPI docs.
|
|
|
|
err := npi.rpcClient.Call("", // Local call
|
|
|
|
"Cluster", // Service name
|
|
|
|
"IPFSPinLs", // Method name
|
|
|
|
"recursive", // in arg
|
|
|
|
&pinMap) // out arg
|
|
|
|
|
|
|
|
valid := err == nil
|
|
|
|
|
|
|
|
m := api.Metric{
|
|
|
|
Name: MetricName,
|
|
|
|
Value: fmt.Sprintf("%d", len(pinMap)),
|
|
|
|
Valid: valid,
|
|
|
|
}
|
|
|
|
|
|
|
|
m.SetTTL(MetricTTL)
|
|
|
|
return m
|
|
|
|
}
|