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 才有
|
|||
|
}
|