mirror of
https://codeberg.org/scip/esctl.git
synced 2026-08-24 12:44:18 +02:00
@@ -261,64 +261,6 @@ func IndexClose(conf *cfg.Config, index string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func IndexAllocation(conf *cfg.Config, index string) error {
|
||||
res, err := conf.DefaultCluster.ES().Cluster.AllocationExplain().
|
||||
Index(index).
|
||||
Primary(conf.Primary).
|
||||
Shard(conf.Shards).
|
||||
Do(context.Background())
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to get index allocation explain: %s", esErrorString(err))
|
||||
}
|
||||
|
||||
slog.Debug("ES result", "index", res)
|
||||
|
||||
currentNode := res.CurrentNode
|
||||
|
||||
table := printer.NewTable(conf, 2, 10)
|
||||
table.Addheaders("index allocation setting", "value")
|
||||
|
||||
roles := make([]string, len(currentNode.Roles))
|
||||
for idx, role := range currentNode.Roles {
|
||||
roles[idx] = role.Name
|
||||
}
|
||||
|
||||
table.Entries = [][]any{
|
||||
{"Index", index},
|
||||
{"Current node", currentNode.Name},
|
||||
{"Current k8s node", currentNode.Attributes["k8s_node_name"]},
|
||||
{"Current node address", currentNode.TransportAddress},
|
||||
{"Current node id", currentNode.Id},
|
||||
{"Current node weight", currentNode.WeightRanking},
|
||||
{"Current node roles", roles},
|
||||
{"Can rebalance cluster", res.CanRebalanceCluster.Name},
|
||||
{"Can rebalance to another node", res.CanRebalanceToOtherNode.Name},
|
||||
{"Can remain on current node", res.CanRemainOnCurrentNode.Name},
|
||||
}
|
||||
|
||||
if err := table.Print(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
/*
|
||||
func IndexModify(conf *cfg.Config, index string) error {
|
||||
settings := esdsl.NewIndexSettings().NumberOfReplicas(strconv.Itoa(conf.Replicas))
|
||||
|
||||
_, err := conf.DefaultCluster.ES().Indices.PutSettings().
|
||||
Indices(index).
|
||||
Index(settings).
|
||||
Do(context.Background())
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to modify index settings: %s", esErrorString(err))
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
*/
|
||||
|
||||
func IndexFields(conf *cfg.Config, index string) error {
|
||||
res, err := conf.DefaultCluster.ES().FieldCaps().
|
||||
Index(index).
|
||||
|
||||
@@ -145,3 +145,63 @@ func ShardShow(conf *cfg.Config, index string) error {
|
||||
|
||||
return printShards(conf, res)
|
||||
}
|
||||
|
||||
func ShardAllocation(conf *cfg.Config, index string) error {
|
||||
explain := conf.DefaultCluster.ES().Cluster.AllocationExplain().
|
||||
Index(index).
|
||||
Primary(conf.Primary).
|
||||
Shard(conf.Shards)
|
||||
|
||||
if conf.FromNode != "" {
|
||||
explain.CurrentNode(conf.FromNode)
|
||||
}
|
||||
|
||||
res, err := explain.Do(context.Background())
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to get shard allocation explain: %s", esErrorString(err))
|
||||
}
|
||||
|
||||
slog.Debug("ES result", "explain", res)
|
||||
|
||||
currentNode := res.CurrentNode
|
||||
|
||||
table := printer.NewTable(conf, 2, 10)
|
||||
table.Addheaders("shard allocation setting", "value")
|
||||
|
||||
roles := make([]string, len(currentNode.Roles))
|
||||
for idx, role := range currentNode.Roles {
|
||||
roles[idx] = role.Name
|
||||
}
|
||||
|
||||
table.Entries = [][]any{
|
||||
{"Index", index},
|
||||
{"Current state", res.CurrentState},
|
||||
{"Current node", currentNode.Name},
|
||||
{"Current k8s node", currentNode.Attributes["k8s_node_name"]},
|
||||
{"Current node address", currentNode.TransportAddress},
|
||||
{"Current node id", currentNode.Id},
|
||||
{"Current node weight", currentNode.WeightRanking},
|
||||
{"Current node roles", roles},
|
||||
{"Can rebalance cluster", res.CanRebalanceCluster.Name},
|
||||
{"Can rebalance to another node", res.CanRebalanceToOtherNode.Name},
|
||||
{"Can remain on current node", res.CanRemainOnCurrentNode.Name},
|
||||
}
|
||||
|
||||
if res.CurrentState == "unassigned" {
|
||||
table.AddRow("Unassignment reason", res.UnassignedInfo.Reason.String()+" at "+res.UnassignedInfo.At.(string))
|
||||
}
|
||||
|
||||
for _, nodeDecision := range res.NodeAllocationDecisions {
|
||||
for _, decider := range nodeDecision.Deciders {
|
||||
table.AddRow("Allocation decider", decider.Decider)
|
||||
table.AddRow(" -> decision", decider.Decision.String())
|
||||
table.AddRow(" -> explanation", decider.Explanation)
|
||||
}
|
||||
}
|
||||
|
||||
if err := table.Print(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user