mirror of
https://github.com/TeaOSLab/EdgeCommon.git
synced 2025-11-03 20:40:25 +08:00
291 lines
7.3 KiB
Go
291 lines
7.3 KiB
Go
// Copyright 2021 GoEdge CDN goedge.cdn@gmail.com. All rights reserved.
|
||
|
||
package serverconfigs
|
||
|
||
import "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared"
|
||
|
||
// MetricItemCategory 指标分类
|
||
type MetricItemCategory = string
|
||
|
||
const (
|
||
MetricItemCategoryHTTP MetricItemCategory = "http"
|
||
MetricItemCategoryTCP MetricItemCategory = "tcp"
|
||
MetricItemCategoryUDP MetricItemCategory = "udp"
|
||
)
|
||
|
||
func FindAllMetricItemCategoryCodes() []MetricItemCategory {
|
||
return []MetricItemCategory{MetricItemCategoryHTTP, MetricItemCategoryTCP, MetricItemCategoryUDP}
|
||
}
|
||
|
||
// MetricItemPeriodUnit 指标周期单位
|
||
type MetricItemPeriodUnit = string
|
||
|
||
const (
|
||
MetricItemPeriodUnitMinute MetricItemPeriodUnit = "minute"
|
||
MetricItemPeriodUnitHour MetricItemPeriodUnit = "hour"
|
||
MetricItemPeriodUnitDay MetricItemPeriodUnit = "day"
|
||
MetricItemPeriodUnitWeek MetricItemPeriodUnit = "week"
|
||
MetricItemPeriodUnitMonth MetricItemPeriodUnit = "month"
|
||
)
|
||
|
||
// MetricItemValueType 值类型
|
||
type MetricItemValueType = string
|
||
|
||
const (
|
||
MetricItemValueTypeCount MetricItemValueType = "count" // 数量
|
||
MetricItemValueTypeByte MetricItemValueType = "byte" // 字节
|
||
)
|
||
|
||
// FindAllMetricKeyDefinitions 指标对象定义
|
||
func FindAllMetricKeyDefinitions(category MetricItemCategory) []*shared.Definition {
|
||
switch category {
|
||
case MetricItemCategoryHTTP:
|
||
return []*shared.Definition{
|
||
{
|
||
Name: "客户端地址(IP)",
|
||
Code: "${remoteAddr}",
|
||
Description: "会依次根据X-Forwarded-For、X-Real-IP、RemoteAddr获取,适用于前端可能有别的反向代理的情形,存在被伪造的可能",
|
||
},
|
||
{
|
||
Name: "直接客户端地址(IP)",
|
||
Code: "${rawRemoteAddr}",
|
||
Description: "返回直接连接服务的客户端原始IP地址",
|
||
},
|
||
{
|
||
Name: "客户端用户名",
|
||
Code: "${remoteUser}",
|
||
Description: "通过基本认证填入的用户名",
|
||
},
|
||
{
|
||
Name: "请求URI",
|
||
Code: "${requestURI}",
|
||
Description: "包含参数,比如/hello?name=lily",
|
||
},
|
||
{
|
||
Name: "请求路径",
|
||
Code: "${requestPath}",
|
||
Description: "不包含参数,比如/hello",
|
||
},
|
||
{
|
||
Name: "完整URL",
|
||
Code: "${requestURL}",
|
||
Description: "比如https://example.com/hello?name=lily",
|
||
},
|
||
{
|
||
Name: "请求方法",
|
||
Code: "${requestMethod}",
|
||
Description: "比如GET、POST等",
|
||
},
|
||
{
|
||
Name: "请求协议Scheme",
|
||
Code: "${scheme}",
|
||
Description: "http或https",
|
||
},
|
||
{
|
||
Name: "文件扩展名",
|
||
Code: "${requestPathExtension}",
|
||
Description: "请求路径中的文件扩展名,包括点符号,比如.html、.png",
|
||
},
|
||
{
|
||
Name: "小写文件扩展名",
|
||
Code: "${requestPathLowerExtension}",
|
||
Description: "请求路径中的文件扩展名小写形式,包括点符号,比如.html、.png",
|
||
},
|
||
{
|
||
Name: "主机名",
|
||
Code: "${host}",
|
||
Description: "通常是请求的域名",
|
||
},
|
||
|
||
{
|
||
Name: "HTTP协议",
|
||
Code: "${proto}",
|
||
Description: "包含版本的HTTP请求协议,类似于HTTP/1.0",
|
||
},
|
||
{
|
||
Name: "URL参数值",
|
||
Code: "${arg.NAME}",
|
||
Description: "单个URL参数值",
|
||
},
|
||
{
|
||
Name: "请求来源URL",
|
||
Code: "${referer}",
|
||
Description: "请求来源Referer URL",
|
||
},
|
||
{
|
||
Name: "请求来源URL域名",
|
||
Code: "${referer.host}",
|
||
Description: "请求来源Referer URL域名",
|
||
},
|
||
{
|
||
Name: "Header值",
|
||
Code: "${header.NAME}",
|
||
Description: "单个Header值,比如${header.User-Agent}",
|
||
},
|
||
{
|
||
Name: "Cookie值",
|
||
Code: "${cookie.NAME}",
|
||
Description: "单个cookie值,比如${cookie.sid}",
|
||
},
|
||
|
||
// ========= 以下是响应 =========
|
||
{
|
||
Name: "状态码",
|
||
Code: "${status}",
|
||
},
|
||
{
|
||
Name: "响应的Content-Type值",
|
||
Code: "${response.contentType}",
|
||
},
|
||
}
|
||
case MetricItemCategoryTCP:
|
||
// TODO
|
||
return []*shared.Definition{}
|
||
case MetricItemCategoryUDP:
|
||
// TODO
|
||
return []*shared.Definition{}
|
||
}
|
||
return []*shared.Definition{}
|
||
}
|
||
|
||
// MetricValueDefinition 指标数值定义
|
||
type MetricValueDefinition struct {
|
||
Name string `json:"name"`
|
||
Code string `json:"code"`
|
||
Description string `json:"description"`
|
||
Icon string `json:"icon"`
|
||
Type string `json:"type"`
|
||
}
|
||
|
||
// FindAllMetricValueDefinitions 指标数值定义
|
||
func FindAllMetricValueDefinitions(category MetricItemCategory) []*MetricValueDefinition {
|
||
switch category {
|
||
case MetricItemCategoryHTTP:
|
||
return []*MetricValueDefinition{
|
||
{
|
||
Name: "请求数",
|
||
Code: "${countRequest}",
|
||
Type: MetricItemValueTypeCount,
|
||
},
|
||
{
|
||
Name: "连接数",
|
||
Code: "${countConnection}",
|
||
Type: MetricItemValueTypeCount,
|
||
},
|
||
{
|
||
Name: "下行流量",
|
||
Code: "${countTrafficOut}",
|
||
Type: MetricItemValueTypeByte,
|
||
},
|
||
{
|
||
Name: "上行流量",
|
||
Code: "${countTrafficIn}",
|
||
Type: MetricItemValueTypeByte,
|
||
},
|
||
}
|
||
case MetricItemCategoryTCP:
|
||
return []*MetricValueDefinition{
|
||
{
|
||
Name: "连接数",
|
||
Code: "${countConnection}",
|
||
Type: MetricItemValueTypeCount,
|
||
},
|
||
{
|
||
Name: "下行流量",
|
||
Code: "${countTrafficOut}",
|
||
Type: MetricItemValueTypeByte,
|
||
},
|
||
{
|
||
Name: "上行流量",
|
||
Code: "${countTrafficIn}",
|
||
Type: MetricItemValueTypeByte,
|
||
},
|
||
}
|
||
case MetricItemCategoryUDP:
|
||
return []*MetricValueDefinition{
|
||
{
|
||
Name: "连接数",
|
||
Code: "${countConnection}",
|
||
Type: MetricItemValueTypeCount,
|
||
},
|
||
{
|
||
Name: "下行流量",
|
||
Code: "${countTrafficOut}",
|
||
Type: MetricItemValueTypeByte,
|
||
},
|
||
{
|
||
Name: "上行流量",
|
||
Code: "${countTrafficIn}",
|
||
Type: MetricItemValueTypeByte,
|
||
},
|
||
}
|
||
}
|
||
return []*MetricValueDefinition{}
|
||
}
|
||
|
||
func FindMetricValueName(category MetricItemCategory, code string) string {
|
||
for _, def := range FindAllMetricValueDefinitions(category) {
|
||
if def.Code == code {
|
||
return def.Name
|
||
}
|
||
}
|
||
return code
|
||
}
|
||
|
||
func FindMetricValueType(category MetricItemCategory, code string) string {
|
||
for _, def := range FindAllMetricValueDefinitions(category) {
|
||
if def.Code == code {
|
||
return def.Type
|
||
}
|
||
}
|
||
return MetricItemValueTypeCount
|
||
}
|
||
|
||
// HumanMetricTime 格式化时间,让时间更易读
|
||
func HumanMetricTime(periodUnit MetricItemPeriodUnit, time string) string {
|
||
switch periodUnit {
|
||
case MetricItemPeriodUnitMonth:
|
||
if len(time) != 6 {
|
||
return time
|
||
}
|
||
return time[:4] + "-" + time[4:]
|
||
case MetricItemPeriodUnitWeek:
|
||
if len(time) != 6 {
|
||
return time
|
||
}
|
||
return time[:4] + "-" + time[4:]
|
||
case MetricItemPeriodUnitDay:
|
||
if len(time) != 8 {
|
||
return time
|
||
}
|
||
return time[:4] + "-" + time[4:6] + "-" + time[6:]
|
||
case MetricItemPeriodUnitHour:
|
||
if len(time) != 10 {
|
||
return time
|
||
}
|
||
return time[:4] + "-" + time[4:6] + "-" + time[6:8] + " " + time[8:]
|
||
case MetricItemPeriodUnitMinute:
|
||
if len(time) != 12 {
|
||
return time
|
||
}
|
||
return time[:4] + "-" + time[4:6] + "-" + time[6:8] + " " + time[8:10] + ":" + time[10:]
|
||
}
|
||
return time
|
||
}
|
||
|
||
func FindMetricPeriodUnitName(unit string) string {
|
||
switch unit {
|
||
case MetricItemPeriodUnitMonth:
|
||
return "月"
|
||
case MetricItemPeriodUnitWeek:
|
||
return "周"
|
||
case MetricItemPeriodUnitDay:
|
||
return "天"
|
||
case MetricItemPeriodUnitHour:
|
||
return "小时"
|
||
case MetricItemPeriodUnitMinute:
|
||
return "分钟"
|
||
}
|
||
return ""
|
||
}
|