150 lines
5.1 KiB
Go
150 lines
5.1 KiB
Go
/*******************************************************************************
|
||
* Copyright 2017 Dell Inc.
|
||
*
|
||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
||
* in compliance with the License. You may obtain a copy of the License at
|
||
*
|
||
* http://www.apache.org/licenses/LICENSE-2.0
|
||
*
|
||
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
||
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||
* or implied. See the License for the specific language governing permissions and limitations under
|
||
* the License.
|
||
*******************************************************************************/
|
||
|
||
package dtos
|
||
|
||
import (
|
||
"encoding/json"
|
||
"github.com/winc-link/hummingbird/internal/models"
|
||
)
|
||
|
||
type StatsResp struct {
|
||
MemoryStats MemoryStats `json:"memory_stats"`
|
||
CpuStats CpuStats `json:"cpu_stats"`
|
||
PrecpuStats CpuStats `json:"precpu_stats"`
|
||
}
|
||
|
||
type CpuStats struct {
|
||
CpuUsage CpuUsage `json:"cpu_usage"`
|
||
SystemCpuUsage int64 `json:"system_cpu_usage"`
|
||
OnlineCpus int64 `json:"online_cpus"`
|
||
}
|
||
|
||
type CpuUsage struct {
|
||
PercpuUsage []int64 `json:"percpu_usage"`
|
||
TotalUsage int64 `json:"total_usage"`
|
||
}
|
||
|
||
type MemoryStats struct {
|
||
Usage int64 `json:"usage"`
|
||
Limit int64 `json:"limit"`
|
||
MaxUsage int64 `json:"max_usage"`
|
||
Stats MemoryStatsDetail `json:"stats"`
|
||
}
|
||
|
||
type MemoryStatsDetail struct {
|
||
Cache int64 `json:"cache"`
|
||
Rss int64 `json:"rss"`
|
||
}
|
||
|
||
func (s StatsResp) UsedMemory() int64 {
|
||
return s.MemoryStats.Usage - s.MemoryStats.Stats.Cache
|
||
}
|
||
|
||
// MemoryUsage %
|
||
func (s StatsResp) MemoryUsage() float64 {
|
||
if s.MemoryStats.Limit <= 0 {
|
||
return 0
|
||
}
|
||
return float64(s.UsedMemory()/s.MemoryStats.Limit) * 100.0
|
||
}
|
||
|
||
func (s StatsResp) CpuDelta() float64 {
|
||
return float64(s.CpuStats.CpuUsage.TotalUsage - s.PrecpuStats.CpuUsage.TotalUsage)
|
||
}
|
||
|
||
func (s StatsResp) SystemCpuDelta() float64 {
|
||
return float64(s.CpuStats.SystemCpuUsage - s.PrecpuStats.SystemCpuUsage)
|
||
}
|
||
|
||
// CpuUsage %
|
||
func (s StatsResp) CpuUsage() float64 {
|
||
scd := s.SystemCpuDelta()
|
||
if scd <= 0 {
|
||
return 0
|
||
}
|
||
return (s.CpuDelta() / scd) * float64(s.CpuStats.OnlineCpus) * 100.0
|
||
}
|
||
|
||
type SystemMetrics struct {
|
||
Timestamp int64 `json:"timestamp"` // 时间戳
|
||
CpuUsedPercent float64 `json:"cpu_used_percent"` // cpu 使用率百分比
|
||
CpuAvg float64 `json:"cpu_avg"` // cpu 负载,1分钟
|
||
Memory SystemMemory `json:"memory"` // 内存
|
||
Disk SystemDisk `json:"disk"` // 磁盘使用率
|
||
Network map[string]SystemNetwork `json:"network"` // 网卡en/eth的IO
|
||
Openfiles int `json:"openfiles"` // 文件数,linux 才有
|
||
}
|
||
|
||
type SystemMemory struct {
|
||
Total uint64 `json:"total"` // 大小
|
||
Used uint64 `json:"used"` // 使用大小 bytes
|
||
UsedPercent float64 `json:"used_percent"` // 百分比
|
||
}
|
||
|
||
type SystemDisk struct {
|
||
Path string `json:"path"` // 获取 / 目录信息
|
||
Total uint64 `json:"total"` // 大小 bytes
|
||
Used uint64 `json:"used"` // 使用值
|
||
UsedPercent float64 `json:"used_percent"` // 使用百分比
|
||
}
|
||
|
||
type SystemNetwork struct {
|
||
Name string `json:"name"`
|
||
BytesSent uint64 `json:"bytes_sent"` // 总发送字节
|
||
BytesRecv uint64 `json:"bytes_recv"` // 总接收字节
|
||
BytesSentPre uint64 `json:"bytes_sent_pre"` // 单位时间内发送的字节,1分钟
|
||
BytesRecvPre uint64 `json:"bytes_recv_pre"` // 单位时间内接收的字节,1分钟
|
||
Last int64 `json:"-"` // 采集时记录,不做输出
|
||
}
|
||
|
||
func FromModelsSystemMetricsToDTO(m models.SystemMetrics) (SystemMetrics, error) {
|
||
var s SystemMetrics
|
||
if err := json.Unmarshal([]byte(m.Data), &s); err != nil {
|
||
return SystemMetrics{}, err
|
||
}
|
||
return s, nil
|
||
}
|
||
|
||
func (s SystemNetwork) String() string {
|
||
bytes, _ := json.Marshal(s)
|
||
return string(bytes)
|
||
}
|
||
|
||
func (s SystemMetrics) String() string {
|
||
bytes, _ := json.Marshal(s)
|
||
return string(bytes)
|
||
}
|
||
|
||
// Response
|
||
|
||
type SystemMetricsResponse struct {
|
||
Total int `json:"total"`
|
||
Metrics []SystemStatResponse `json:"metrics"`
|
||
}
|
||
|
||
type SystemStatResponse struct {
|
||
Timestamp int64 `json:"timestamp"` // 时间戳
|
||
CpuUsedPercent float64 `json:"cpu_used_percent"` // cpu 使用率百分比
|
||
MemoryTotal uint64 `json:"memory_total"` // 内存使用
|
||
MemoryUsed uint64 `json:"memory_used"` // 内存使用
|
||
MemoryUsedPercent float64 `json:"memory_used_percent"` // 内存使用率
|
||
DiskTotal uint64 `json:"disk_total"`
|
||
DiskUsed uint64 `json:"disk_used"`
|
||
DiskUsedPercent float64 `json:"disk_used_percent"` // 磁盘使用率
|
||
NetSentBytes uint64 `json:"net_sent_bytes"` // 网卡发送字节
|
||
NetRecvBytes uint64 `json:"net_recv_bytes"` // 网卡接收字节
|
||
Openfiles int `json:"openfiles"` // 文件句柄数,linux 才有
|
||
}
|