You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
404 lines
19 KiB
Go
404 lines
19 KiB
Go
package main
|
|
|
|
import (
|
|
"github.com/ceph/go-ceph/rados"
|
|
"time"
|
|
)
|
|
|
|
type params struct {
|
|
duration time.Duration
|
|
threadsCount uint64
|
|
blocksize, objectsize uint64
|
|
parallel, disablecheck bool
|
|
bs, os, cluster, user, keyring, config, pool, define, rdefine, cpuprofile, memprofile string
|
|
}
|
|
|
|
type cephconnection struct {
|
|
conn *rados.Conn
|
|
ioctx *rados.IOContext
|
|
}
|
|
|
|
type Poolinfo struct {
|
|
Pool string `json:"pool,omitempty"`
|
|
PoolId uint64 `json:"pool_id,omitempty"`
|
|
Size uint64 `json:"size,omitempty"`
|
|
}
|
|
|
|
func (times *PlacementGroup) StringsToTimes() {
|
|
const LongForm = "2006-01-02 15:04:05.000000"
|
|
times.LastFreshT, _ = time.Parse(LongForm, times.LastFresh)
|
|
times.LastChangeT, _ = time.Parse(LongForm, times.LastChange)
|
|
times.LastActiveT, _ = time.Parse(LongForm, times.LastActive)
|
|
times.LastPeeredT, _ = time.Parse(LongForm, times.LastPeered)
|
|
times.LastCleanT, _ = time.Parse(LongForm, times.LastClean)
|
|
times.LastBecameActiveT, _ = time.Parse(LongForm, times.LastBecameActive)
|
|
times.LastBecamePeeredT, _ = time.Parse(LongForm, times.LastBecamePeered)
|
|
times.LastUnstaleT, _ = time.Parse(LongForm, times.LastUnstale)
|
|
times.LastUndegradedT, _ = time.Parse(LongForm, times.LastUndegraded)
|
|
times.LastFullsizedT, _ = time.Parse(LongForm, times.LastFullsized)
|
|
times.LastDeepScrubStampT, _ = time.Parse(LongForm, times.LastDeepScrubStamp)
|
|
times.LastDeepScrubT, _ = time.Parse(LongForm, times.LastDeepScrub)
|
|
times.LastCleanScrubStampT, _ = time.Parse(LongForm, times.LastCleanScrubStamp)
|
|
times.LastScrubStampT, _ = time.Parse(LongForm, times.LastScrubStamp)
|
|
times.LastScrubT, _ = time.Parse(LongForm, times.LastScrub)
|
|
}
|
|
|
|
type Bucket struct {
|
|
Alg string `json:"alg"`
|
|
Hash string `json:"hash"`
|
|
ID int64 `json:"id"`
|
|
Items []struct {
|
|
ID int64 `json:"id"`
|
|
Pos uint64 `json:"pos"`
|
|
Weight float64 `json:"weight"`
|
|
} `json:"items"`
|
|
Name string `json:"name"`
|
|
TypeID int64 `json:"type_id"`
|
|
TypeName string `json:"type_name"`
|
|
Weight float64 `json:"weight"`
|
|
}
|
|
|
|
type Device struct {
|
|
Class string `json:"class"`
|
|
ID int64 `json:"id"`
|
|
Name string `json:"name"`
|
|
Info OsdMetadata
|
|
}
|
|
|
|
type OsdCrushDump struct {
|
|
Buckets []Bucket `json:"buckets"`
|
|
ChooseArgs struct{} `json:"choose_args"`
|
|
Devices []Device `json:"devices"`
|
|
Rules []struct {
|
|
MaxSize uint64 `json:"max_size"`
|
|
MinSize uint64 `json:"min_size"`
|
|
RuleID int64 `json:"rule_id"`
|
|
RuleName string `json:"rule_name"`
|
|
Ruleset int64 `json:"ruleset"`
|
|
Steps []struct {
|
|
Item int64 `json:"item"`
|
|
ItemName string `json:"item_name"`
|
|
Num int64 `json:"num"`
|
|
Op string `json:"op"`
|
|
Type string `json:"type"`
|
|
} `json:"steps"`
|
|
Type uint64 `json:"type"`
|
|
} `json:"rules"`
|
|
Tunables struct {
|
|
AllowedBucketAlgs uint64 `json:"allowed_bucket_algs"`
|
|
ChooseLocalFallbackTries uint64 `json:"choose_local_fallback_tries"`
|
|
ChooseLocalTries uint64 `json:"choose_local_tries"`
|
|
ChooseTotalTries uint64 `json:"choose_total_tries"`
|
|
ChooseleafDescendOnce uint64 `json:"chooseleaf_descend_once"`
|
|
ChooseleafStable uint64 `json:"chooseleaf_stable"`
|
|
ChooseleafVaryR uint64 `json:"chooseleaf_vary_r"`
|
|
HasV2Rules uint64 `json:"has_v2_rules"`
|
|
HasV3Rules uint64 `json:"has_v3_rules"`
|
|
HasV4Buckets uint64 `json:"has_v4_buckets"`
|
|
HasV5Rules uint64 `json:"has_v5_rules"`
|
|
LegacyTunables uint64 `json:"legacy_tunables"`
|
|
MinimumRequiredVersion string `json:"minimum_required_version"`
|
|
OptimalTunables uint64 `json:"optimal_tunables"`
|
|
Profile string `json:"profile"`
|
|
RequireFeatureTunables uint64 `json:"require_feature_tunables"`
|
|
RequireFeatureTunables2 uint64 `json:"require_feature_tunables2"`
|
|
RequireFeatureTunables3 uint64 `json:"require_feature_tunables3"`
|
|
RequireFeatureTunables5 uint64 `json:"require_feature_tunables5"`
|
|
StrawCalcVersion uint64 `json:"straw_calc_version"`
|
|
} `json:"tunables"`
|
|
Types []struct {
|
|
Name string `json:"name"`
|
|
TypeID int64 `json:"type_id"`
|
|
} `json:"types"`
|
|
}
|
|
type Osd struct {
|
|
ClusterAddr string `json:"cluster_addr"`
|
|
DownAt uint64 `json:"down_at"`
|
|
HeartbeatBackAddr string `json:"heartbeat_back_addr"`
|
|
HeartbeatFrontAddr string `json:"heartbeat_front_addr"`
|
|
In uint64 `json:"in"`
|
|
LastCleanBegin uint64 `json:"last_clean_begin"`
|
|
LastCleanEnd uint64 `json:"last_clean_end"`
|
|
LostAt uint64 `json:"lost_at"`
|
|
Osd uint64 `json:"osd"`
|
|
PrimaryAffinity float64 `json:"primary_affinity"`
|
|
PublicAddr string `json:"public_addr"`
|
|
State []string `json:"state"`
|
|
Up uint64 `json:"up"`
|
|
UpFrom uint64 `json:"up_from"`
|
|
UpThru uint64 `json:"up_thru"`
|
|
UUID string `json:"uuid"`
|
|
Weight float64 `json:"weight"`
|
|
}
|
|
type OsdDump struct {
|
|
BackfillfullRatio float64 `json:"backfillfull_ratio"`
|
|
Blacklist struct{} `json:"blacklist"`
|
|
ClusterSnapshot string `json:"cluster_snapshot"`
|
|
Created string `json:"created"`
|
|
CrushVersion uint64 `json:"crush_version"`
|
|
Epoch uint64 `json:"epoch"`
|
|
ErasureCodeProfiles struct {
|
|
Default struct {
|
|
K string `json:"k"`
|
|
M string `json:"m"`
|
|
Plugin string `json:"plugin"`
|
|
Technique string `json:"technique"`
|
|
} `json:"default"`
|
|
} `json:"erasure_code_profiles"`
|
|
Flags string `json:"flags"`
|
|
FlagsNum uint64 `json:"flags_num"`
|
|
FlagsSet []string `json:"flags_set"`
|
|
Fsid string `json:"fsid"`
|
|
FullRatio float64 `json:"full_ratio"`
|
|
MaxOsd uint64 `json:"max_osd"`
|
|
MinCompatClient string `json:"min_compat_client"`
|
|
Modified string `json:"modified"`
|
|
NearfullRatio float64 `json:"nearfull_ratio"`
|
|
NewPurgedSnaps []interface{} `json:"new_purged_snaps"`
|
|
NewRemovedSnaps []interface{} `json:"new_removed_snaps"`
|
|
OsdXinfo []struct {
|
|
DownStamp string `json:"down_stamp"`
|
|
Features uint64 `json:"features"`
|
|
LaggyInterval uint64 `json:"laggy_interval"`
|
|
LaggyProbability float64 `json:"laggy_probability"`
|
|
OldWeight float64 `json:"old_weight"`
|
|
Osd uint64 `json:"osd"`
|
|
} `json:"osd_xinfo"`
|
|
Osds []Osd `json:"osds"`
|
|
PgTemp []interface{} `json:"pg_temp"`
|
|
PgUpmap []interface{} `json:"pg_upmap"`
|
|
PgUpmapItems []interface{} `json:"pg_upmap_items"`
|
|
PoolMax uint64 `json:"pool_max"`
|
|
Pools []struct {
|
|
ApplicationMetadata struct {
|
|
Rbd struct{} `json:"rbd"`
|
|
Rgw struct{} `json:"rgw"`
|
|
} `json:"application_metadata"`
|
|
Auid uint64 `json:"auid"`
|
|
CacheMinEvictAge uint64 `json:"cache_min_evict_age"`
|
|
CacheMinFlushAge uint64 `json:"cache_min_flush_age"`
|
|
CacheMode string `json:"cache_mode"`
|
|
CacheTargetDirtyHighRatioMicro uint64 `json:"cache_target_dirty_high_ratio_micro"`
|
|
CacheTargetDirtyRatioMicro uint64 `json:"cache_target_dirty_ratio_micro"`
|
|
CacheTargetFullRatioMicro uint64 `json:"cache_target_full_ratio_micro"`
|
|
CreateTime string `json:"create_time"`
|
|
CrushRule int64 `json:"crush_rule"`
|
|
ErasureCodeProfile string `json:"erasure_code_profile"`
|
|
ExpectedNumObjects uint64 `json:"expected_num_objects"`
|
|
FastRead bool `json:"fast_read"`
|
|
Flags uint64 `json:"flags"`
|
|
FlagsNames string `json:"flags_names"`
|
|
GradeTable []interface{} `json:"grade_table"`
|
|
HitSetCount uint64 `json:"hit_set_count"`
|
|
HitSetGradeDecayRate uint64 `json:"hit_set_grade_decay_rate"`
|
|
HitSetParams struct {
|
|
Type string `json:"type"`
|
|
} `json:"hit_set_params"`
|
|
HitSetPeriod uint64 `json:"hit_set_period"`
|
|
HitSetSearchLastN uint64 `json:"hit_set_search_last_n"`
|
|
LastChange string `json:"last_change"`
|
|
LastForceOpResend string `json:"last_force_op_resend"`
|
|
LastForceOpResendPreluminous string `json:"last_force_op_resend_preluminous"`
|
|
MinReadRecencyForPromote uint64 `json:"min_read_recency_for_promote"`
|
|
MinSize uint64 `json:"min_size"`
|
|
MinWriteRecencyForPromote uint64 `json:"min_write_recency_for_promote"`
|
|
ObjectHash uint64 `json:"object_hash"`
|
|
Options struct{} `json:"options"`
|
|
PgNum uint64 `json:"pg_num"`
|
|
PgPlacementNum uint64 `json:"pg_placement_num"`
|
|
Pool uint64 `json:"pool"`
|
|
PoolName string `json:"pool_name"`
|
|
PoolSnaps []interface{} `json:"pool_snaps"`
|
|
QuotaMaxBytes uint64 `json:"quota_max_bytes"`
|
|
QuotaMaxObjects uint64 `json:"quota_max_objects"`
|
|
ReadTier int64 `json:"read_tier"`
|
|
RemovedSnaps string `json:"removed_snaps"`
|
|
Size uint64 `json:"size"`
|
|
SnapEpoch uint64 `json:"snap_epoch"`
|
|
SnapMode string `json:"snap_mode"`
|
|
SnapSeq uint64 `json:"snap_seq"`
|
|
StripeWidth uint64 `json:"stripe_width"`
|
|
TargetMaxBytes uint64 `json:"target_max_bytes"`
|
|
TargetMaxObjects uint64 `json:"target_max_objects"`
|
|
TierOf int64 `json:"tier_of"`
|
|
Tiers []interface{} `json:"tiers"`
|
|
Type uint64 `json:"type"`
|
|
UseGmtHitset bool `json:"use_gmt_hitset"`
|
|
WriteTier int64 `json:"write_tier"`
|
|
} `json:"pools"`
|
|
PrimaryTemp []interface{} `json:"primary_temp"`
|
|
RemovedSnapsQueue []interface{} `json:"removed_snaps_queue"`
|
|
RequireMinCompatClient string `json:"require_min_compat_client"`
|
|
RequireOsdRelease string `json:"require_osd_release"`
|
|
}
|
|
|
|
type PlacementGroup struct {
|
|
Acting []uint64 `json:"acting"`
|
|
ActingPrimary int64 `json:"acting_primary"`
|
|
BlockedBy []interface{} `json:"blocked_by"`
|
|
Created uint64 `json:"created"`
|
|
DirtyStatsInvalid bool `json:"dirty_stats_invalid"`
|
|
HitsetBytesStatsInvalid bool `json:"hitset_bytes_stats_invalid"`
|
|
HitsetStatsInvalid bool `json:"hitset_stats_invalid"`
|
|
LastActive string `json:"last_active"`
|
|
LastActiveT time.Time
|
|
LastBecameActive string `json:"last_became_active"`
|
|
LastBecameActiveT time.Time
|
|
LastBecamePeered string `json:"last_became_peered"`
|
|
LastBecamePeeredT time.Time
|
|
LastChange string `json:"last_change"`
|
|
LastChangeT time.Time
|
|
LastClean string `json:"last_clean"`
|
|
LastCleanT time.Time
|
|
LastCleanScrubStamp string `json:"last_clean_scrub_stamp"`
|
|
LastCleanScrubStampT time.Time
|
|
LastDeepScrub string `json:"last_deep_scrub"`
|
|
LastDeepScrubT time.Time
|
|
LastDeepScrubStamp string `json:"last_deep_scrub_stamp"`
|
|
LastDeepScrubStampT time.Time
|
|
LastEpochClean uint64 `json:"last_epoch_clean"`
|
|
LastFresh string `json:"last_fresh"`
|
|
LastFreshT time.Time
|
|
LastFullsized string `json:"last_fullsized"`
|
|
LastFullsizedT time.Time
|
|
LastPeered string `json:"last_peered"`
|
|
LastPeeredT time.Time
|
|
LastScrub string `json:"last_scrub"`
|
|
LastScrubT time.Time
|
|
LastScrubStamp string `json:"last_scrub_stamp"`
|
|
LastScrubStampT time.Time
|
|
LastUndegraded string `json:"last_undegraded"`
|
|
LastUndegradedT time.Time
|
|
LastUnstale string `json:"last_unstale"`
|
|
LastUnstaleT time.Time
|
|
LogSize uint64 `json:"log_size"`
|
|
LogStart string `json:"log_start"`
|
|
ManifestStatsInvalid bool `json:"manifest_stats_invalid"`
|
|
MappingEpoch uint64 `json:"mapping_epoch"`
|
|
OmapStatsInvalid bool `json:"omap_stats_invalid"`
|
|
OndiskLogSize uint64 `json:"ondisk_log_size"`
|
|
OndiskLogStart string `json:"ondisk_log_start"`
|
|
Parent string `json:"parent"`
|
|
ParentSplitBits uint64 `json:"parent_split_bits"`
|
|
Pgid string `json:"pgid"`
|
|
PinStatsInvalid bool `json:"pin_stats_invalid"`
|
|
PurgedSnaps []interface{} `json:"purged_snaps"`
|
|
ReportedEpoch string `json:"reported_epoch"`
|
|
ReportedSeq string `json:"reported_seq"`
|
|
SnaptrimqLen uint64 `json:"snaptrimq_len"`
|
|
StatSum struct {
|
|
NumBytes uint64 `json:"num_bytes"`
|
|
NumBytesHitSetArchive uint64 `json:"num_bytes_hit_set_archive"`
|
|
NumBytesRecovered uint64 `json:"num_bytes_recovered"`
|
|
NumDeepScrubErrors uint64 `json:"num_deep_scrub_errors"`
|
|
NumEvict uint64 `json:"num_evict"`
|
|
NumEvictKb uint64 `json:"num_evict_kb"`
|
|
NumEvictModeFull uint64 `json:"num_evict_mode_full"`
|
|
NumEvictModeSome uint64 `json:"num_evict_mode_some"`
|
|
NumFlush uint64 `json:"num_flush"`
|
|
NumFlushKb uint64 `json:"num_flush_kb"`
|
|
NumFlushModeHigh uint64 `json:"num_flush_mode_high"`
|
|
NumFlushModeLow uint64 `json:"num_flush_mode_low"`
|
|
NumKeysRecovered uint64 `json:"num_keys_recovered"`
|
|
NumLargeOmapObjects uint64 `json:"num_large_omap_objects"`
|
|
NumLegacySnapsets uint64 `json:"num_legacy_snapsets"`
|
|
NumObjectClones uint64 `json:"num_object_clones"`
|
|
NumObjectCopies uint64 `json:"num_object_copies"`
|
|
NumObjects uint64 `json:"num_objects"`
|
|
NumObjectsDegraded uint64 `json:"num_objects_degraded"`
|
|
NumObjectsDirty uint64 `json:"num_objects_dirty"`
|
|
NumObjectsHitSetArchive uint64 `json:"num_objects_hit_set_archive"`
|
|
NumObjectsManifest uint64 `json:"num_objects_manifest"`
|
|
NumObjectsMisplaced uint64 `json:"num_objects_misplaced"`
|
|
NumObjectsMissing uint64 `json:"num_objects_missing"`
|
|
NumObjectsMissingOnPrimary uint64 `json:"num_objects_missing_on_primary"`
|
|
NumObjectsOmap uint64 `json:"num_objects_omap"`
|
|
NumObjectsPinned uint64 `json:"num_objects_pinned"`
|
|
NumObjectsRecovered uint64 `json:"num_objects_recovered"`
|
|
NumObjectsUnfound uint64 `json:"num_objects_unfound"`
|
|
NumPromote uint64 `json:"num_promote"`
|
|
NumRead uint64 `json:"num_read"`
|
|
NumReadKb uint64 `json:"num_read_kb"`
|
|
NumScrubErrors uint64 `json:"num_scrub_errors"`
|
|
NumShallowScrubErrors uint64 `json:"num_shallow_scrub_errors"`
|
|
NumWhiteouts uint64 `json:"num_whiteouts"`
|
|
NumWrite uint64 `json:"num_write"`
|
|
NumWriteKb uint64 `json:"num_write_kb"`
|
|
} `json:"stat_sum"`
|
|
State string `json:"state"`
|
|
StatsInvalid bool `json:"stats_invalid"`
|
|
Up []uint64 `json:"up"`
|
|
UpPrimary int64 `json:"up_primary"`
|
|
Version string `json:"version"`
|
|
}
|
|
|
|
type OsdMetadata struct {
|
|
Arch string `json:"arch"`
|
|
BackAddr string `json:"back_addr"`
|
|
BackIface string `json:"back_iface"`
|
|
Bluefs string `json:"bluefs"`
|
|
BluefsSingleSharedDevice string `json:"bluefs_single_shared_device"`
|
|
BluestoreBdevAccessMode string `json:"bluestore_bdev_access_mode"`
|
|
BluestoreBdevBlockSize string `json:"bluestore_bdev_block_size"`
|
|
BluestoreBdevDev string `json:"bluestore_bdev_dev"`
|
|
BluestoreBdevDevNode string `json:"bluestore_bdev_dev_node"`
|
|
BluestoreBdevDriver string `json:"bluestore_bdev_driver"`
|
|
BluestoreBdevModel string `json:"bluestore_bdev_model"`
|
|
BluestoreBdevPartitionPath string `json:"bluestore_bdev_partition_path"`
|
|
BluestoreBdevRotational string `json:"bluestore_bdev_rotational"`
|
|
BluestoreBdevSize string `json:"bluestore_bdev_size"`
|
|
BluestoreBdevType string `json:"bluestore_bdev_type"`
|
|
CephRelease string `json:"ceph_release"`
|
|
CephVersion string `json:"ceph_version"`
|
|
CephVersionShort string `json:"ceph_version_short"`
|
|
CPU string `json:"cpu"`
|
|
DefaultDeviceClass string `json:"default_device_class"`
|
|
Devices string `json:"devices"`
|
|
Distro string `json:"distro"`
|
|
DistroDescription string `json:"distro_description"`
|
|
DistroVersion string `json:"distro_version"`
|
|
FrontAddr string `json:"front_addr"`
|
|
FrontIface string `json:"front_iface"`
|
|
HbBackAddr string `json:"hb_back_addr"`
|
|
HbFrontAddr string `json:"hb_front_addr"`
|
|
Hostname string `json:"hostname"`
|
|
ID int64 `json:"id"`
|
|
JournalRotational string `json:"journal_rotational"`
|
|
KernelDescription string `json:"kernel_description"`
|
|
KernelVersion string `json:"kernel_version"`
|
|
MemSwapKb string `json:"mem_swap_kb"`
|
|
MemTotalKb string `json:"mem_total_kb"`
|
|
Os string `json:"os"`
|
|
OsdData string `json:"osd_data"`
|
|
OsdObjectstore string `json:"osd_objectstore"`
|
|
Rotational string `json:"rotational"`
|
|
}
|
|
|
|
type OsdMap struct {
|
|
Acting []uint64 `json:"acting"`
|
|
ActingPrimary uint64 `json:"acting_primary"`
|
|
Epoch uint64 `json:"epoch"`
|
|
Objname string `json:"objname"`
|
|
Pgid string `json:"pgid"`
|
|
Pool string `json:"pool"`
|
|
PoolID uint64 `json:"pool_id"`
|
|
RawPgid string `json:"raw_pgid"`
|
|
Up []uint64 `json:"up"`
|
|
UpPrimary int64 `json:"up_primary"`
|
|
}
|
|
|
|
type avgLatencies struct {
|
|
latencytotal int64
|
|
len int64
|
|
}
|
|
|
|
type placementGroupNautilus struct {
|
|
PgReady bool `json:"pg_ready"`
|
|
PgStats []PlacementGroup `json:"pg_stats"`
|
|
}
|
|
|
|
type osdStatLine struct {
|
|
num int64
|
|
line string
|
|
}
|