pcm-openstack/internal/pkg/tracker/metrics.go

145 lines
4.1 KiB
Go

package tracker
import (
"context"
"github.com/prometheus/client_golang/api"
v1 "github.com/prometheus/client_golang/api/prometheus/v1"
proModel "github.com/prometheus/common/model"
"gitlink.org.cn/jcce-pcm/pcm-coordinator/model"
"gitlink.org.cn/jcce-pcm/utils/tool"
"k8s.io/apimachinery/pkg/util/json"
"time"
)
const ADDRESS = "http://10.101.15.3:32585"
const (
NODE_DISK_AVAIL = "node_filesystem_avail_bytes{fstype=~\"ext4|xfs\"}"
NODE_DISK_TOTAL = "node_filesystem_size_bytes{fstype=~\"ext4|xfs\"}"
NODE_MEMORY_AVAIL = "node_memory_MemAvailable_bytes"
NODE_MEMORY_TOTAL = "node_memory_MemTotal_bytes"
NODE_CPU_TOTAL_COUNT = "node:node_num_cpu:sum"
NODE_CPU_USAGE = "sum by (instance)(increase(node_cpu_seconds_total{mode=\"idle\"}[5m])) / sum by (instance)(increase(node_cpu_seconds_total[5m]))"
)
func MetricsQuery(statement string) (*proModel.Vector, error) {
client, err := api.NewClient(api.Config{
Address: ADDRESS,
})
if err != nil {
return nil, err
}
v1api := v1.NewAPI(client)
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
metrics, _, err := v1api.Query(ctx, statement, time.Now(), v1.WithTimeout(5*time.Second))
marshal, err := json.Marshal(metrics)
if err != nil {
return nil, err
}
vector := proModel.Vector{}
json.Unmarshal(marshal, &vector)
return &vector, nil
}
// NodeDiskAvail 查询磁盘可用空间
func NodeDiskAvail(nodes []*model.ScNodeAvailInfo) ([]*model.ScNodeAvailInfo, error) {
vectors, err := MetricsQuery(NODE_DISK_AVAIL)
if err != nil {
return nil, err
}
for index := range nodes {
for i := 0; i < vectors.Len(); i++ {
if string((*vectors)[i].Metric["instance"]) == nodes[index].NodeName {
nodes[index].DiskAvail = tool.StringToInt64((*vectors)[index].Value.String())
}
}
}
return nodes, nil
}
// NodeDiskTotal 查询磁盘总空间
func NodeDiskTotal(nodes []*model.ScNodeAvailInfo) ([]*model.ScNodeAvailInfo, error) {
vectors, err := MetricsQuery(NODE_DISK_TOTAL)
if err != nil {
return nil, err
}
for index := range nodes {
for i := 0; i < vectors.Len(); i++ {
if string((*vectors)[i].Metric["instance"]) == nodes[index].NodeName {
nodes[index].DiskTotal = tool.StringToInt64((*vectors)[index].Value.String())
}
}
}
return nodes, nil
}
// NodeMemoryTotal 查询内存总大小
func NodeMemoryTotal(nodes []*model.ScNodeAvailInfo) ([]*model.ScNodeAvailInfo, error) {
vectors, err := MetricsQuery(NODE_MEMORY_TOTAL)
if err != nil {
return nil, err
}
for index := range nodes {
for i := 0; i < vectors.Len(); i++ {
if string((*vectors)[i].Metric["instance"]) == nodes[index].NodeName {
nodes[index].MemTotal = tool.StringToInt64((*vectors)[index].Value.String())
}
}
}
return nodes, nil
}
// NodeMemoryAvail 查询内存可用大小
func NodeMemoryAvail(nodes []*model.ScNodeAvailInfo) ([]*model.ScNodeAvailInfo, error) {
vectors, err := MetricsQuery(NODE_MEMORY_AVAIL)
if err != nil {
return nil, err
}
for index := range nodes {
for i := 0; i < vectors.Len(); i++ {
if string((*vectors)[i].Metric["instance"]) == nodes[index].NodeName {
nodes[index].MemAvail = tool.StringToInt64((*vectors)[index].Value.String())
}
}
}
return nodes, nil
}
// NodeCpuTotalCount 查询cpu总核数
func NodeCpuTotalCount(nodes []*model.ScNodeAvailInfo) ([]*model.ScNodeAvailInfo, error) {
vectors, err := MetricsQuery(NODE_CPU_TOTAL_COUNT)
if err != nil {
return nil, err
}
for index := range nodes {
for i := 0; i < vectors.Len(); i++ {
if string((*vectors)[i].Metric["node"]) == nodes[index].NodeName {
nodes[index].CpuTotal = tool.StringToInt64((*vectors)[index].Value.String())
}
}
}
return nodes, nil
}
// NodeCpuUsage 查询cpu使用率
func NodeCpuUsage(nodes []*model.ScNodeAvailInfo) ([]*model.ScNodeAvailInfo, error) {
vectors, err := MetricsQuery(NODE_CPU_USAGE)
if err != nil {
return nil, err
}
for index := range nodes {
for i := 0; i < vectors.Len(); i++ {
if string((*vectors)[i].Metric["instance"]) == nodes[index].NodeName {
nodes[index].CpuUsable = tool.StringToFloat64((*vectors)[index].Value.String())
}
}
}
return nodes, nil
}