Issue #162: Rework configuration format
The following commit reimplements ipfs-cluster configuration under
the following premises:
* Each component is initialized with a configuration object
defined by its module
* Each component decides how the JSON representation of its
configuration looks like
* Each component parses and validates its own configuration
* Each component exposes its own defaults
* Component configurations are make the sections of a
central JSON configuration file (which replaces the current
JSON format)
* Component configurations implement a common interface
(config.ComponentConfig) with a set of common operations
* The central configuration file is managed by a
config.ConfigManager which:
* Registers ComponentConfigs
* Assigns the correspondent sections from the JSON file to each
component and delegates the parsing
* Delegates the JSON generation for each section
* Can be notified when the configuration is updated and must be
saved to disk
The new service.json would then look as follows:
```json
{
"cluster": {
"id": "QmTVW8NoRxC5wBhV7WtAYtRn7itipEESfozWN5KmXUQnk2",
"private_key": "<...>",
"secret": "00224102ae6aaf94f2606abf69a0e278251ecc1d64815b617ff19d6d2841f786",
"peers": [],
"bootstrap": [],
"leave_on_shutdown": false,
"listen_multiaddress": "/ip4/0.0.0.0/tcp/9096",
"state_sync_interval": "1m0s",
"ipfs_sync_interval": "2m10s",
"replication_factor": -1,
"monitor_ping_interval": "15s"
},
"consensus": {
"raft": {
"heartbeat_timeout": "1s",
"election_timeout": "1s",
"commit_timeout": "50ms",
"max_append_entries": 64,
"trailing_logs": 10240,
"snapshot_interval": "2m0s",
"snapshot_threshold": 8192,
"leader_lease_timeout": "500ms"
}
},
"api": {
"restapi": {
"listen_multiaddress": "/ip4/127.0.0.1/tcp/9094",
"read_timeout": "30s",
"read_header_timeout": "5s",
"write_timeout": "1m0s",
"idle_timeout": "2m0s"
}
},
"ipfs_connector": {
"ipfshttp": {
"proxy_listen_multiaddress": "/ip4/127.0.0.1/tcp/9095",
"node_multiaddress": "/ip4/127.0.0.1/tcp/5001",
"connect_swarms_delay": "7s",
"proxy_read_timeout": "10m0s",
"proxy_read_header_timeout": "5s",
"proxy_write_timeout": "10m0s",
"proxy_idle_timeout": "1m0s"
}
},
"monitor": {
"monbasic": {
"check_interval": "15s"
}
},
"informer": {
"disk": {
"metric_ttl": "30s",
"metric_type": "freespace"
},
"numpin": {
"metric_ttl": "10s"
}
}
}
```
This new format aims to be easily extensible per component. As such,
it already surfaces quite a few new options which were hardcoded
before.
Additionally, since Go API have changed, some redundant methods have been
removed and small refactoring has happened to take advantage of the new
way.
License: MIT
Signed-off-by: Hector Sanjuan <hector@protocol.ai>
2017-10-11 18:23:03 +00:00
|
|
|
// Package disk implements an ipfs-cluster informer which can provide different
|
|
|
|
// disk-related metrics from the IPFS daemon as an api.Metric.
|
2017-03-27 13:07:12 +00:00
|
|
|
package disk
|
|
|
|
|
|
|
|
import (
|
2018-06-27 04:03:15 +00:00
|
|
|
"context"
|
2017-03-27 13:07:12 +00:00
|
|
|
"fmt"
|
2021-07-28 12:03:42 +00:00
|
|
|
"sync"
|
2017-03-27 13:07:12 +00:00
|
|
|
|
2022-06-15 09:19:17 +00:00
|
|
|
"github.com/ipfs-cluster/ipfs-cluster/api"
|
2022-06-23 09:58:35 +00:00
|
|
|
"github.com/ipfs-cluster/ipfs-cluster/observations"
|
2019-06-14 10:41:11 +00:00
|
|
|
|
2020-03-13 20:40:02 +00:00
|
|
|
logging "github.com/ipfs/go-log/v2"
|
2018-10-17 13:28:03 +00:00
|
|
|
rpc "github.com/libp2p/go-libp2p-gorpc"
|
2017-03-27 13:07:12 +00:00
|
|
|
|
2022-06-23 09:58:35 +00:00
|
|
|
"go.opencensus.io/stats"
|
2018-06-27 04:03:15 +00:00
|
|
|
"go.opencensus.io/trace"
|
2017-03-27 13:07:12 +00:00
|
|
|
)
|
|
|
|
|
Issue #162: Rework configuration format
The following commit reimplements ipfs-cluster configuration under
the following premises:
* Each component is initialized with a configuration object
defined by its module
* Each component decides how the JSON representation of its
configuration looks like
* Each component parses and validates its own configuration
* Each component exposes its own defaults
* Component configurations are make the sections of a
central JSON configuration file (which replaces the current
JSON format)
* Component configurations implement a common interface
(config.ComponentConfig) with a set of common operations
* The central configuration file is managed by a
config.ConfigManager which:
* Registers ComponentConfigs
* Assigns the correspondent sections from the JSON file to each
component and delegates the parsing
* Delegates the JSON generation for each section
* Can be notified when the configuration is updated and must be
saved to disk
The new service.json would then look as follows:
```json
{
"cluster": {
"id": "QmTVW8NoRxC5wBhV7WtAYtRn7itipEESfozWN5KmXUQnk2",
"private_key": "<...>",
"secret": "00224102ae6aaf94f2606abf69a0e278251ecc1d64815b617ff19d6d2841f786",
"peers": [],
"bootstrap": [],
"leave_on_shutdown": false,
"listen_multiaddress": "/ip4/0.0.0.0/tcp/9096",
"state_sync_interval": "1m0s",
"ipfs_sync_interval": "2m10s",
"replication_factor": -1,
"monitor_ping_interval": "15s"
},
"consensus": {
"raft": {
"heartbeat_timeout": "1s",
"election_timeout": "1s",
"commit_timeout": "50ms",
"max_append_entries": 64,
"trailing_logs": 10240,
"snapshot_interval": "2m0s",
"snapshot_threshold": 8192,
"leader_lease_timeout": "500ms"
}
},
"api": {
"restapi": {
"listen_multiaddress": "/ip4/127.0.0.1/tcp/9094",
"read_timeout": "30s",
"read_header_timeout": "5s",
"write_timeout": "1m0s",
"idle_timeout": "2m0s"
}
},
"ipfs_connector": {
"ipfshttp": {
"proxy_listen_multiaddress": "/ip4/127.0.0.1/tcp/9095",
"node_multiaddress": "/ip4/127.0.0.1/tcp/5001",
"connect_swarms_delay": "7s",
"proxy_read_timeout": "10m0s",
"proxy_read_header_timeout": "5s",
"proxy_write_timeout": "10m0s",
"proxy_idle_timeout": "1m0s"
}
},
"monitor": {
"monbasic": {
"check_interval": "15s"
}
},
"informer": {
"disk": {
"metric_ttl": "30s",
"metric_type": "freespace"
},
"numpin": {
"metric_ttl": "10s"
}
}
}
```
This new format aims to be easily extensible per component. As such,
it already surfaces quite a few new options which were hardcoded
before.
Additionally, since Go API have changed, some redundant methods have been
removed and small refactoring has happened to take advantage of the new
way.
License: MIT
Signed-off-by: Hector Sanjuan <hector@protocol.ai>
2017-10-11 18:23:03 +00:00
|
|
|
// MetricType identifies the type of metric to fetch from the IPFS daemon.
|
2017-08-22 17:13:53 +00:00
|
|
|
type MetricType int
|
|
|
|
|
|
|
|
const (
|
Issue #162: Rework configuration format
The following commit reimplements ipfs-cluster configuration under
the following premises:
* Each component is initialized with a configuration object
defined by its module
* Each component decides how the JSON representation of its
configuration looks like
* Each component parses and validates its own configuration
* Each component exposes its own defaults
* Component configurations are make the sections of a
central JSON configuration file (which replaces the current
JSON format)
* Component configurations implement a common interface
(config.ComponentConfig) with a set of common operations
* The central configuration file is managed by a
config.ConfigManager which:
* Registers ComponentConfigs
* Assigns the correspondent sections from the JSON file to each
component and delegates the parsing
* Delegates the JSON generation for each section
* Can be notified when the configuration is updated and must be
saved to disk
The new service.json would then look as follows:
```json
{
"cluster": {
"id": "QmTVW8NoRxC5wBhV7WtAYtRn7itipEESfozWN5KmXUQnk2",
"private_key": "<...>",
"secret": "00224102ae6aaf94f2606abf69a0e278251ecc1d64815b617ff19d6d2841f786",
"peers": [],
"bootstrap": [],
"leave_on_shutdown": false,
"listen_multiaddress": "/ip4/0.0.0.0/tcp/9096",
"state_sync_interval": "1m0s",
"ipfs_sync_interval": "2m10s",
"replication_factor": -1,
"monitor_ping_interval": "15s"
},
"consensus": {
"raft": {
"heartbeat_timeout": "1s",
"election_timeout": "1s",
"commit_timeout": "50ms",
"max_append_entries": 64,
"trailing_logs": 10240,
"snapshot_interval": "2m0s",
"snapshot_threshold": 8192,
"leader_lease_timeout": "500ms"
}
},
"api": {
"restapi": {
"listen_multiaddress": "/ip4/127.0.0.1/tcp/9094",
"read_timeout": "30s",
"read_header_timeout": "5s",
"write_timeout": "1m0s",
"idle_timeout": "2m0s"
}
},
"ipfs_connector": {
"ipfshttp": {
"proxy_listen_multiaddress": "/ip4/127.0.0.1/tcp/9095",
"node_multiaddress": "/ip4/127.0.0.1/tcp/5001",
"connect_swarms_delay": "7s",
"proxy_read_timeout": "10m0s",
"proxy_read_header_timeout": "5s",
"proxy_write_timeout": "10m0s",
"proxy_idle_timeout": "1m0s"
}
},
"monitor": {
"monbasic": {
"check_interval": "15s"
}
},
"informer": {
"disk": {
"metric_ttl": "30s",
"metric_type": "freespace"
},
"numpin": {
"metric_ttl": "10s"
}
}
}
```
This new format aims to be easily extensible per component. As such,
it already surfaces quite a few new options which were hardcoded
before.
Additionally, since Go API have changed, some redundant methods have been
removed and small refactoring has happened to take advantage of the new
way.
License: MIT
Signed-off-by: Hector Sanjuan <hector@protocol.ai>
2017-10-11 18:23:03 +00:00
|
|
|
// MetricFreeSpace provides the available space reported by IPFS
|
2021-09-13 09:23:30 +00:00
|
|
|
MetricFreeSpace MetricType = iota
|
Issue #162: Rework configuration format
The following commit reimplements ipfs-cluster configuration under
the following premises:
* Each component is initialized with a configuration object
defined by its module
* Each component decides how the JSON representation of its
configuration looks like
* Each component parses and validates its own configuration
* Each component exposes its own defaults
* Component configurations are make the sections of a
central JSON configuration file (which replaces the current
JSON format)
* Component configurations implement a common interface
(config.ComponentConfig) with a set of common operations
* The central configuration file is managed by a
config.ConfigManager which:
* Registers ComponentConfigs
* Assigns the correspondent sections from the JSON file to each
component and delegates the parsing
* Delegates the JSON generation for each section
* Can be notified when the configuration is updated and must be
saved to disk
The new service.json would then look as follows:
```json
{
"cluster": {
"id": "QmTVW8NoRxC5wBhV7WtAYtRn7itipEESfozWN5KmXUQnk2",
"private_key": "<...>",
"secret": "00224102ae6aaf94f2606abf69a0e278251ecc1d64815b617ff19d6d2841f786",
"peers": [],
"bootstrap": [],
"leave_on_shutdown": false,
"listen_multiaddress": "/ip4/0.0.0.0/tcp/9096",
"state_sync_interval": "1m0s",
"ipfs_sync_interval": "2m10s",
"replication_factor": -1,
"monitor_ping_interval": "15s"
},
"consensus": {
"raft": {
"heartbeat_timeout": "1s",
"election_timeout": "1s",
"commit_timeout": "50ms",
"max_append_entries": 64,
"trailing_logs": 10240,
"snapshot_interval": "2m0s",
"snapshot_threshold": 8192,
"leader_lease_timeout": "500ms"
}
},
"api": {
"restapi": {
"listen_multiaddress": "/ip4/127.0.0.1/tcp/9094",
"read_timeout": "30s",
"read_header_timeout": "5s",
"write_timeout": "1m0s",
"idle_timeout": "2m0s"
}
},
"ipfs_connector": {
"ipfshttp": {
"proxy_listen_multiaddress": "/ip4/127.0.0.1/tcp/9095",
"node_multiaddress": "/ip4/127.0.0.1/tcp/5001",
"connect_swarms_delay": "7s",
"proxy_read_timeout": "10m0s",
"proxy_read_header_timeout": "5s",
"proxy_write_timeout": "10m0s",
"proxy_idle_timeout": "1m0s"
}
},
"monitor": {
"monbasic": {
"check_interval": "15s"
}
},
"informer": {
"disk": {
"metric_ttl": "30s",
"metric_type": "freespace"
},
"numpin": {
"metric_ttl": "10s"
}
}
}
```
This new format aims to be easily extensible per component. As such,
it already surfaces quite a few new options which were hardcoded
before.
Additionally, since Go API have changed, some redundant methods have been
removed and small refactoring has happened to take advantage of the new
way.
License: MIT
Signed-off-by: Hector Sanjuan <hector@protocol.ai>
2017-10-11 18:23:03 +00:00
|
|
|
// MetricRepoSize provides the used space reported by IPFS
|
2017-08-22 17:13:53 +00:00
|
|
|
MetricRepoSize
|
|
|
|
)
|
|
|
|
|
2021-09-13 09:23:30 +00:00
|
|
|
// String returns a string representation for MetricType.
|
|
|
|
func (t MetricType) String() string {
|
|
|
|
switch t {
|
|
|
|
case MetricFreeSpace:
|
|
|
|
return "freespace"
|
|
|
|
case MetricRepoSize:
|
|
|
|
return "reposize"
|
|
|
|
}
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
|
2017-03-27 13:07:12 +00:00
|
|
|
var logger = logging.Logger("diskinfo")
|
|
|
|
|
|
|
|
// Informer is a simple object to implement the ipfscluster.Informer
|
|
|
|
// and Component interfaces.
|
|
|
|
type Informer struct {
|
2021-07-28 12:03:42 +00:00
|
|
|
config *Config // set when created, readonly
|
|
|
|
|
|
|
|
mu sync.Mutex // guards access to following fields
|
2017-08-22 17:13:53 +00:00
|
|
|
rpcClient *rpc.Client
|
2017-03-27 13:07:12 +00:00
|
|
|
}
|
|
|
|
|
Issue #162: Rework configuration format
The following commit reimplements ipfs-cluster configuration under
the following premises:
* Each component is initialized with a configuration object
defined by its module
* Each component decides how the JSON representation of its
configuration looks like
* Each component parses and validates its own configuration
* Each component exposes its own defaults
* Component configurations are make the sections of a
central JSON configuration file (which replaces the current
JSON format)
* Component configurations implement a common interface
(config.ComponentConfig) with a set of common operations
* The central configuration file is managed by a
config.ConfigManager which:
* Registers ComponentConfigs
* Assigns the correspondent sections from the JSON file to each
component and delegates the parsing
* Delegates the JSON generation for each section
* Can be notified when the configuration is updated and must be
saved to disk
The new service.json would then look as follows:
```json
{
"cluster": {
"id": "QmTVW8NoRxC5wBhV7WtAYtRn7itipEESfozWN5KmXUQnk2",
"private_key": "<...>",
"secret": "00224102ae6aaf94f2606abf69a0e278251ecc1d64815b617ff19d6d2841f786",
"peers": [],
"bootstrap": [],
"leave_on_shutdown": false,
"listen_multiaddress": "/ip4/0.0.0.0/tcp/9096",
"state_sync_interval": "1m0s",
"ipfs_sync_interval": "2m10s",
"replication_factor": -1,
"monitor_ping_interval": "15s"
},
"consensus": {
"raft": {
"heartbeat_timeout": "1s",
"election_timeout": "1s",
"commit_timeout": "50ms",
"max_append_entries": 64,
"trailing_logs": 10240,
"snapshot_interval": "2m0s",
"snapshot_threshold": 8192,
"leader_lease_timeout": "500ms"
}
},
"api": {
"restapi": {
"listen_multiaddress": "/ip4/127.0.0.1/tcp/9094",
"read_timeout": "30s",
"read_header_timeout": "5s",
"write_timeout": "1m0s",
"idle_timeout": "2m0s"
}
},
"ipfs_connector": {
"ipfshttp": {
"proxy_listen_multiaddress": "/ip4/127.0.0.1/tcp/9095",
"node_multiaddress": "/ip4/127.0.0.1/tcp/5001",
"connect_swarms_delay": "7s",
"proxy_read_timeout": "10m0s",
"proxy_read_header_timeout": "5s",
"proxy_write_timeout": "10m0s",
"proxy_idle_timeout": "1m0s"
}
},
"monitor": {
"monbasic": {
"check_interval": "15s"
}
},
"informer": {
"disk": {
"metric_ttl": "30s",
"metric_type": "freespace"
},
"numpin": {
"metric_ttl": "10s"
}
}
}
```
This new format aims to be easily extensible per component. As such,
it already surfaces quite a few new options which were hardcoded
before.
Additionally, since Go API have changed, some redundant methods have been
removed and small refactoring has happened to take advantage of the new
way.
License: MIT
Signed-off-by: Hector Sanjuan <hector@protocol.ai>
2017-10-11 18:23:03 +00:00
|
|
|
// NewInformer returns an initialized informer using the given InformerConfig.
|
|
|
|
func NewInformer(cfg *Config) (*Informer, error) {
|
|
|
|
err := cfg.Validate()
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
2017-08-04 19:35:30 +00:00
|
|
|
}
|
2017-08-02 22:49:25 +00:00
|
|
|
|
Issue #162: Rework configuration format
The following commit reimplements ipfs-cluster configuration under
the following premises:
* Each component is initialized with a configuration object
defined by its module
* Each component decides how the JSON representation of its
configuration looks like
* Each component parses and validates its own configuration
* Each component exposes its own defaults
* Component configurations are make the sections of a
central JSON configuration file (which replaces the current
JSON format)
* Component configurations implement a common interface
(config.ComponentConfig) with a set of common operations
* The central configuration file is managed by a
config.ConfigManager which:
* Registers ComponentConfigs
* Assigns the correspondent sections from the JSON file to each
component and delegates the parsing
* Delegates the JSON generation for each section
* Can be notified when the configuration is updated and must be
saved to disk
The new service.json would then look as follows:
```json
{
"cluster": {
"id": "QmTVW8NoRxC5wBhV7WtAYtRn7itipEESfozWN5KmXUQnk2",
"private_key": "<...>",
"secret": "00224102ae6aaf94f2606abf69a0e278251ecc1d64815b617ff19d6d2841f786",
"peers": [],
"bootstrap": [],
"leave_on_shutdown": false,
"listen_multiaddress": "/ip4/0.0.0.0/tcp/9096",
"state_sync_interval": "1m0s",
"ipfs_sync_interval": "2m10s",
"replication_factor": -1,
"monitor_ping_interval": "15s"
},
"consensus": {
"raft": {
"heartbeat_timeout": "1s",
"election_timeout": "1s",
"commit_timeout": "50ms",
"max_append_entries": 64,
"trailing_logs": 10240,
"snapshot_interval": "2m0s",
"snapshot_threshold": 8192,
"leader_lease_timeout": "500ms"
}
},
"api": {
"restapi": {
"listen_multiaddress": "/ip4/127.0.0.1/tcp/9094",
"read_timeout": "30s",
"read_header_timeout": "5s",
"write_timeout": "1m0s",
"idle_timeout": "2m0s"
}
},
"ipfs_connector": {
"ipfshttp": {
"proxy_listen_multiaddress": "/ip4/127.0.0.1/tcp/9095",
"node_multiaddress": "/ip4/127.0.0.1/tcp/5001",
"connect_swarms_delay": "7s",
"proxy_read_timeout": "10m0s",
"proxy_read_header_timeout": "5s",
"proxy_write_timeout": "10m0s",
"proxy_idle_timeout": "1m0s"
}
},
"monitor": {
"monbasic": {
"check_interval": "15s"
}
},
"informer": {
"disk": {
"metric_ttl": "30s",
"metric_type": "freespace"
},
"numpin": {
"metric_ttl": "10s"
}
}
}
```
This new format aims to be easily extensible per component. As such,
it already surfaces quite a few new options which were hardcoded
before.
Additionally, since Go API have changed, some redundant methods have been
removed and small refactoring has happened to take advantage of the new
way.
License: MIT
Signed-off-by: Hector Sanjuan <hector@protocol.ai>
2017-10-11 18:23:03 +00:00
|
|
|
return &Informer{
|
|
|
|
config: cfg,
|
|
|
|
}, nil
|
2017-03-27 13:07:12 +00:00
|
|
|
}
|
|
|
|
|
2021-09-13 09:23:30 +00:00
|
|
|
// Name returns the name of the metric issued by this informer.
|
2017-08-22 17:13:53 +00:00
|
|
|
func (disk *Informer) Name() string {
|
2021-09-10 16:53:59 +00:00
|
|
|
return disk.config.MetricType.String()
|
2017-08-22 17:13:53 +00:00
|
|
|
}
|
|
|
|
|
2017-03-27 13:07:12 +00:00
|
|
|
// SetClient provides us with an rpc.Client which allows
|
|
|
|
// contacting other components in the cluster.
|
|
|
|
func (disk *Informer) SetClient(c *rpc.Client) {
|
2021-07-28 12:03:42 +00:00
|
|
|
disk.mu.Lock()
|
|
|
|
defer disk.mu.Unlock()
|
2017-03-27 13:07:12 +00:00
|
|
|
disk.rpcClient = c
|
|
|
|
}
|
|
|
|
|
|
|
|
// Shutdown is called on cluster shutdown. We just invalidate
|
|
|
|
// any metrics from this point.
|
2018-06-27 04:03:15 +00:00
|
|
|
func (disk *Informer) Shutdown(ctx context.Context) error {
|
2020-04-14 17:58:00 +00:00
|
|
|
_, span := trace.StartSpan(ctx, "informer/disk/Shutdown")
|
2018-06-27 04:03:15 +00:00
|
|
|
defer span.End()
|
|
|
|
|
2021-07-28 12:03:42 +00:00
|
|
|
disk.mu.Lock()
|
|
|
|
defer disk.mu.Unlock()
|
|
|
|
|
2017-03-27 13:07:12 +00:00
|
|
|
disk.rpcClient = nil
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2021-09-13 12:12:36 +00:00
|
|
|
// GetMetrics returns the metric obtained by this Informer. It must always
|
|
|
|
// return at least one metric.
|
2022-03-19 01:52:46 +00:00
|
|
|
func (disk *Informer) GetMetrics(ctx context.Context) []api.Metric {
|
2018-06-27 04:03:15 +00:00
|
|
|
ctx, span := trace.StartSpan(ctx, "informer/disk/GetMetric")
|
|
|
|
defer span.End()
|
|
|
|
|
2021-07-28 12:03:42 +00:00
|
|
|
disk.mu.Lock()
|
|
|
|
rpcClient := disk.rpcClient
|
|
|
|
disk.mu.Unlock()
|
|
|
|
|
|
|
|
if rpcClient == nil {
|
2022-03-19 01:52:46 +00:00
|
|
|
return []api.Metric{
|
|
|
|
{
|
|
|
|
Name: disk.Name(),
|
|
|
|
Valid: false,
|
|
|
|
},
|
|
|
|
}
|
2017-03-27 13:07:12 +00:00
|
|
|
}
|
|
|
|
|
2018-08-20 18:43:27 +00:00
|
|
|
var repoStat api.IPFSRepoStat
|
2022-06-23 09:47:11 +00:00
|
|
|
var weight uint64
|
|
|
|
var value string
|
2018-08-20 18:43:27 +00:00
|
|
|
|
2017-03-27 13:07:12 +00:00
|
|
|
valid := true
|
2018-08-20 18:43:27 +00:00
|
|
|
|
2021-07-28 12:03:42 +00:00
|
|
|
err := rpcClient.CallContext(
|
2018-06-27 04:03:15 +00:00
|
|
|
ctx,
|
|
|
|
"",
|
2019-05-04 20:36:10 +00:00
|
|
|
"IPFSConnector",
|
|
|
|
"RepoStat",
|
2017-03-27 13:07:12 +00:00
|
|
|
struct{}{},
|
2018-06-27 04:03:15 +00:00
|
|
|
&repoStat,
|
|
|
|
)
|
2017-03-27 13:07:12 +00:00
|
|
|
if err != nil {
|
|
|
|
logger.Error(err)
|
|
|
|
valid = false
|
2018-08-20 18:43:27 +00:00
|
|
|
} else {
|
2021-09-10 16:53:59 +00:00
|
|
|
switch disk.config.MetricType {
|
|
|
|
case MetricFreeSpace:
|
|
|
|
size := repoStat.RepoSize
|
|
|
|
total := repoStat.StorageMax
|
|
|
|
if size < total {
|
2022-06-23 09:47:11 +00:00
|
|
|
weight = total - size
|
2022-05-03 16:39:44 +00:00
|
|
|
} else {
|
|
|
|
// Make sure we don't underflow and stop
|
|
|
|
// sending this metric when space is exhausted.
|
2022-06-23 09:47:11 +00:00
|
|
|
weight = 0
|
2022-05-03 16:39:44 +00:00
|
|
|
valid = false
|
|
|
|
logger.Warn("reported freespace is 0")
|
2021-09-10 16:53:59 +00:00
|
|
|
}
|
2022-06-23 09:47:11 +00:00
|
|
|
value = fmt.Sprintf("%d", weight)
|
2021-09-10 16:53:59 +00:00
|
|
|
case MetricRepoSize:
|
2022-06-23 09:47:11 +00:00
|
|
|
// smaller repositories have more priority
|
|
|
|
weight = -repoStat.RepoSize
|
|
|
|
value = fmt.Sprintf("%d", repoStat.RepoSize)
|
2018-08-20 18:43:27 +00:00
|
|
|
}
|
2017-03-27 13:07:12 +00:00
|
|
|
}
|
|
|
|
|
2022-03-19 01:52:46 +00:00
|
|
|
m := api.Metric{
|
2021-10-06 12:10:06 +00:00
|
|
|
Name: disk.Name(),
|
2022-06-23 09:47:11 +00:00
|
|
|
Value: value,
|
2021-10-06 12:10:06 +00:00
|
|
|
Valid: valid,
|
2022-06-23 09:47:11 +00:00
|
|
|
Weight: int64(weight),
|
2021-10-06 12:10:06 +00:00
|
|
|
Partitionable: false,
|
2017-03-27 13:07:12 +00:00
|
|
|
}
|
|
|
|
|
2018-05-07 06:50:03 +00:00
|
|
|
m.SetTTL(disk.config.MetricTTL)
|
2022-06-23 09:58:35 +00:00
|
|
|
|
|
|
|
stats.Record(ctx, observations.InformerDisk.M(m.Weight))
|
|
|
|
|
2022-03-19 01:52:46 +00:00
|
|
|
return []api.Metric{m}
|
2017-03-27 13:07:12 +00:00
|
|
|
}
|