Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
f492ae74
TDengine
项目概览
taosdata
/
TDengine
大约 2 年 前同步成功
通知
1193
Star
22018
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
f492ae74
编写于
4月 07, 2022
作者:
S
Shengliang Guan
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat: send monitor information in multi-process mode
上级
18446454
变更
14
显示空白变更内容
内联
并排
Showing
14 changed file
with
654 addition
and
265 deletion
+654
-265
include/common/tmsg.h
include/common/tmsg.h
+12
-0
include/common/tmsgdef.h
include/common/tmsgdef.h
+9
-0
include/libs/monitor/monitor.h
include/libs/monitor/monitor.h
+106
-45
include/os/osSysinfo.h
include/os/osSysinfo.h
+2
-2
source/dnode/mgmt/dm/dmHandle.c
source/dnode/mgmt/dm/dmHandle.c
+3
-0
source/dnode/mgmt/dm/dmMonitor.c
source/dnode/mgmt/dm/dmMonitor.c
+33
-1
source/dnode/mgmt/dm/dmWorker.c
source/dnode/mgmt/dm/dmWorker.c
+3
-0
source/dnode/mgmt/inc/dmInt.h
source/dnode/mgmt/inc/dmInt.h
+9
-1
source/libs/monitor/inc/monInt.h
source/libs/monitor/inc/monInt.h
+19
-30
source/libs/monitor/src/monMsg.c
source/libs/monitor/src/monMsg.c
+54
-0
source/libs/monitor/src/monitor.c
source/libs/monitor/src/monitor.c
+237
-89
source/libs/monitor/test/CMakeLists.txt
source/libs/monitor/test/CMakeLists.txt
+4
-4
source/libs/monitor/test/monTest.cpp
source/libs/monitor/test/monTest.cpp
+121
-83
source/os/src/osSysinfo.c
source/os/src/osSysinfo.c
+42
-10
未找到文件。
include/common/tmsg.h
浏览文件 @
f492ae74
...
@@ -679,6 +679,18 @@ typedef struct {
...
@@ -679,6 +679,18 @@ typedef struct {
char
charset
[
TD_LOCALE_LEN
];
// tsCharset
char
charset
[
TD_LOCALE_LEN
];
// tsCharset
}
SClusterCfg
;
}
SClusterCfg
;
typedef
struct
{
int32_t
openVnodes
;
int32_t
totalVnodes
;
int32_t
masterNum
;
int64_t
numOfSelectReqs
;
int64_t
numOfInsertReqs
;
int64_t
numOfInsertSuccessReqs
;
int64_t
numOfBatchInsertReqs
;
int64_t
numOfBatchInsertSuccessReqs
;
int64_t
errors
;
}
SVnodesStat
;
typedef
struct
{
typedef
struct
{
int32_t
vgId
;
int32_t
vgId
;
int8_t
role
;
int8_t
role
;
...
...
include/common/tmsgdef.h
浏览文件 @
f492ae74
...
@@ -216,6 +216,15 @@ enum {
...
@@ -216,6 +216,15 @@ enum {
TD_NEW_MSG_SEG
(
TDMT_SCH_MSG
)
TD_NEW_MSG_SEG
(
TDMT_SCH_MSG
)
TD_DEF_MSG_TYPE
(
TDMT_SCH_LINK_BROKEN
,
"scheduler-link-broken"
,
NULL
,
NULL
)
TD_DEF_MSG_TYPE
(
TDMT_SCH_LINK_BROKEN
,
"scheduler-link-broken"
,
NULL
,
NULL
)
// Monitor info exchange between processes
TD_NEW_MSG_SEG
(
TDMT_MON_MSG
)
TD_DEF_MSG_TYPE
(
TDMT_MON_MM_INFO
,
"monitor-minfo"
,
NULL
,
NULL
)
TD_DEF_MSG_TYPE
(
TDMT_MON_VM_INFO
,
"monitor-vinfo"
,
NULL
,
NULL
)
TD_DEF_MSG_TYPE
(
TDMT_MON_QM_INFO
,
"monitor-qinfo"
,
NULL
,
NULL
)
TD_DEF_MSG_TYPE
(
TDMT_MON_SM_INFO
,
"monitor-sinfo"
,
NULL
,
NULL
)
TD_DEF_MSG_TYPE
(
TDMT_MON_BM_INFO
,
"monitor-binfo"
,
NULL
,
NULL
)
TD_DEF_MSG_TYPE
(
TDMT_MON_VM_LOAD
,
"monitor-vload"
,
NULL
,
NULL
)
#if defined(TD_MSG_NUMBER_)
#if defined(TD_MSG_NUMBER_)
TDMT_MAX
TDMT_MAX
#endif
#endif
...
...
include/libs/monitor/monitor.h
浏览文件 @
f492ae74
...
@@ -19,6 +19,7 @@
...
@@ -19,6 +19,7 @@
#include "tarray.h"
#include "tarray.h"
#include "tdef.h"
#include "tdef.h"
#include "tlog.h"
#include "tlog.h"
#include "tmsg.h"
#ifdef __cplusplus
#ifdef __cplusplus
extern
"C"
{
extern
"C"
{
...
@@ -29,6 +30,44 @@ extern "C" {
...
@@ -29,6 +30,44 @@ extern "C" {
#define MON_VER_LEN 12
#define MON_VER_LEN 12
#define MON_LOG_LEN 1024
#define MON_LOG_LEN 1024
typedef
struct
{
int64_t
ts
;
ELogLevel
level
;
char
content
[
MON_LOG_LEN
];
}
SMonLogItem
;
typedef
struct
{
SArray
*
logs
;
// array of SMonLogItem
int32_t
numOfErrorLogs
;
int32_t
numOfInfoLogs
;
int32_t
numOfDebugLogs
;
int32_t
numOfTraceLogs
;
}
SMonLogs
;
typedef
struct
{
char
name
[
TSDB_FILENAME_LEN
];
int8_t
level
;
SDiskSize
size
;
}
SMonDiskDesc
;
typedef
struct
{
double
cpu_engine
;
double
cpu_system
;
float
cpu_cores
;
int64_t
mem_engine
;
// KB
int64_t
mem_system
;
// KB
int64_t
mem_total
;
// KB
int64_t
disk_engine
;
// Byte
int64_t
disk_used
;
// Byte
int64_t
disk_total
;
// Byte
int64_t
net_in
;
// bytes
int64_t
net_out
;
// bytes
int64_t
io_read
;
// bytes
int64_t
io_write
;
// bytes
int64_t
io_read_disk
;
// bytes
int64_t
io_write_disk
;
// bytes
}
SMonSysInfo
;
typedef
struct
{
typedef
struct
{
int32_t
dnode_id
;
int32_t
dnode_id
;
char
dnode_ep
[
TSDB_EP_LEN
];
char
dnode_ep
[
TSDB_EP_LEN
];
...
@@ -36,6 +75,19 @@ typedef struct {
...
@@ -36,6 +75,19 @@ typedef struct {
int32_t
protocol
;
int32_t
protocol
;
}
SMonBasicInfo
;
}
SMonBasicInfo
;
typedef
struct
{
float
uptime
;
// day
int8_t
has_mnode
;
SMonDiskDesc
logdir
;
SMonDiskDesc
tempdir
;
}
SMonDnodeInfo
;
typedef
struct
{
SMonBasicInfo
basic
;
SMonDnodeInfo
dnode
;
SMonSysInfo
sys
;
}
SMonDmInfo
;
typedef
struct
{
typedef
struct
{
int32_t
dnode_id
;
int32_t
dnode_id
;
char
dnode_ep
[
TSDB_EP_LEN
];
char
dnode_ep
[
TSDB_EP_LEN
];
...
@@ -87,46 +139,57 @@ typedef struct {
...
@@ -87,46 +139,57 @@ typedef struct {
}
SMonGrantInfo
;
}
SMonGrantInfo
;
typedef
struct
{
typedef
struct
{
float
uptime
;
// day
SMonClusterInfo
cluster
;
double
cpu_engine
;
SMonVgroupInfo
vgroup
;
double
cpu_system
;
SMonGrantInfo
grant
;
float
cpu_cores
;
SMonSysInfo
sys
;
int64_t
mem_engine
;
// KB
SMonLogs
logs
;
int64_t
mem_system
;
// KB
}
SMonMmInfo
;
int64_t
mem_total
;
// KB
int64_t
disk_engine
;
// Byte
int64_t
disk_used
;
// Byte
int64_t
disk_total
;
// Byte
int64_t
net_in
;
// bytes
int64_t
net_out
;
// bytes
int64_t
io_read
;
// bytes
int64_t
io_write
;
// bytes
int64_t
io_read_disk
;
// bytes
int64_t
io_write_disk
;
// bytes
int64_t
req_select
;
int64_t
req_insert
;
int64_t
req_insert_success
;
int64_t
req_insert_batch
;
int64_t
req_insert_batch_success
;
int32_t
errors
;
int32_t
vnodes_num
;
int32_t
masters
;
int8_t
has_mnode
;
}
SMonDnodeInfo
;
typedef
struct
{
int32_t
tSerializeSMonMmInfo
(
void
*
buf
,
int32_t
bufLen
,
SMonMmInfo
*
pInfo
);
char
name
[
TSDB_FILENAME_LEN
];
int32_t
tDeserializeSMonMmInfo
(
void
*
buf
,
int32_t
bufLen
,
SMonMmInfo
*
pInfo
);
int8_t
level
;
void
tFreeSMonMmInfo
(
SMonMmInfo
*
pInfo
);
SDiskSize
size
;
}
SMonDiskDesc
;
typedef
struct
{
typedef
struct
{
SArray
*
datadirs
;
// array of SMonDiskDesc
SArray
*
datadirs
;
// array of SMonDiskDesc
SMonDiskDesc
logdir
;
SMonDiskDesc
tempdir
;
}
SMonDiskInfo
;
}
SMonDiskInfo
;
typedef
struct
SMonInfo
SMonInfo
;
typedef
struct
{
SMonDiskInfo
tfs
;
SVnodesStat
vstat
;
SMonSysInfo
sys
;
SMonLogs
logs
;
}
SMonVmInfo
;
int32_t
tSerializeSMonVmInfo
(
void
*
buf
,
int32_t
bufLen
,
SMonVmInfo
*
pInfo
);
int32_t
tDeserializeSMonVMmInfo
(
void
*
buf
,
int32_t
bufLen
,
SMonVmInfo
*
pInfo
);
void
tFreeSMonVmInfo
(
SMonVmInfo
*
pInfo
);
typedef
struct
{
SMonSysInfo
sys
;
SMonLogs
logs
;
}
SMonQmInfo
;
int32_t
tSerializeSMonQmInfo
(
void
*
buf
,
int32_t
bufLen
,
SMonQmInfo
*
pInfo
);
int32_t
tDeserializeSMonQMmInfo
(
void
*
buf
,
int32_t
bufLen
,
SMonQmInfo
*
pInfo
);
void
tFreeSMonQmInfo
(
SMonQmInfo
*
pInfo
);
typedef
struct
{
SMonSysInfo
sys
;
SMonLogs
logs
;
}
SMonSmInfo
;
int32_t
tSerializeSMonSmInfo
(
void
*
buf
,
int32_t
bufLen
,
SMonSmInfo
*
pInfo
);
int32_t
tDeserializeSMonSmInfo
(
void
*
buf
,
int32_t
bufLen
,
SMonSmInfo
*
pInfo
);
void
tFreeSMonSmInfo
(
SMonSmInfo
*
pInfo
);
typedef
struct
{
SMonSysInfo
sys
;
SMonLogs
logs
;
}
SMonBmInfo
;
int32_t
tSerializeSMonBmInfo
(
void
*
buf
,
int32_t
bufLen
,
SMonBmInfo
*
pInfo
);
int32_t
tDeserializeSMonBmInfo
(
void
*
buf
,
int32_t
bufLen
,
SMonBmInfo
*
pInfo
);
void
tFreeSMonBmInfo
(
SMonBmInfo
*
pInfo
);
typedef
struct
{
typedef
struct
{
const
char
*
server
;
const
char
*
server
;
...
@@ -138,16 +201,14 @@ typedef struct {
...
@@ -138,16 +201,14 @@ typedef struct {
int32_t
monInit
(
const
SMonCfg
*
pCfg
);
int32_t
monInit
(
const
SMonCfg
*
pCfg
);
void
monCleanup
();
void
monCleanup
();
void
monRecordLog
(
int64_t
ts
,
ELogLevel
level
,
const
char
*
content
);
void
monRecordLog
(
int64_t
ts
,
ELogLevel
level
,
const
char
*
content
);
int32_t
monGetLogs
(
SMonLogs
*
logs
);
SMonInfo
*
monCreateMonitorInfo
();
void
monSetDmInfo
(
SMonDmInfo
*
pInfo
);
void
monSetBasicInfo
(
SMonInfo
*
pMonitor
,
SMonBasicInfo
*
pInfo
);
void
monSetMmInfo
(
SMonMmInfo
*
pInfo
);
void
monSetClusterInfo
(
SMonInfo
*
pMonitor
,
SMonClusterInfo
*
pInfo
);
void
monSetVmInfo
(
SMonVmInfo
*
pInfo
);
void
monSetVgroupInfo
(
SMonInfo
*
pMonitor
,
SMonVgroupInfo
*
pInfo
);
void
monSetQmInfo
(
SMonQmInfo
*
pInfo
);
void
monSetGrantInfo
(
SMonInfo
*
pMonitor
,
SMonGrantInfo
*
pInfo
);
void
monSetSmInfo
(
SMonSmInfo
*
pInfo
);
void
monSetDnodeInfo
(
SMonInfo
*
pMonitor
,
SMonDnodeInfo
*
pInfo
);
void
monSetBmInfo
(
SMonBmInfo
*
pInfo
);
void
monSetDiskInfo
(
SMonInfo
*
pMonitor
,
SMonDiskInfo
*
pInfo
);
void
monSendReport
();
void
monSendReport
(
SMonInfo
*
pMonitor
);
void
monCleanupMonitorInfo
(
SMonInfo
*
pMonitor
);
#ifdef __cplusplus
#ifdef __cplusplus
}
}
...
...
include/os/osSysinfo.h
浏览文件 @
f492ae74
...
@@ -44,8 +44,8 @@ int32_t taosGetTotalMemory(int64_t *totalKB);
...
@@ -44,8 +44,8 @@ int32_t taosGetTotalMemory(int64_t *totalKB);
int32_t
taosGetProcMemory
(
int64_t
*
usedKB
);
int32_t
taosGetProcMemory
(
int64_t
*
usedKB
);
int32_t
taosGetSysMemory
(
int64_t
*
usedKB
);
int32_t
taosGetSysMemory
(
int64_t
*
usedKB
);
int32_t
taosGetDiskSize
(
char
*
dataDir
,
SDiskSize
*
diskSize
);
int32_t
taosGetDiskSize
(
char
*
dataDir
,
SDiskSize
*
diskSize
);
int32_t
taosGetProcIO
(
int64_t
*
rchars
,
int64_t
*
wchars
,
int64_t
*
read_bytes
,
int64_t
*
write_bytes
);
void
taosGetProcIODelta
(
int64_t
*
rchars
,
int64_t
*
wchars
,
int64_t
*
read_bytes
,
int64_t
*
write_bytes
);
int32_t
taosGetCardInfo
(
int64_t
*
receive_bytes
,
int64_t
*
transmit_bytes
);
void
taosGetCardInfoDelta
(
int64_t
*
receive_bytes
,
int64_t
*
transmit_bytes
);
void
taosKillSystem
();
void
taosKillSystem
();
int32_t
taosGetSystemUUID
(
char
*
uid
,
int32_t
uidlen
);
int32_t
taosGetSystemUUID
(
char
*
uid
,
int32_t
uidlen
);
...
...
source/dnode/mgmt/dm/dmHandle.c
浏览文件 @
f492ae74
...
@@ -212,4 +212,7 @@ void dmInitMsgHandle(SMgmtWrapper *pWrapper) {
...
@@ -212,4 +212,7 @@ void dmInitMsgHandle(SMgmtWrapper *pWrapper) {
dndSetMsgHandle
(
pWrapper
,
TDMT_MND_STATUS_RSP
,
dmProcessStatusMsg
,
DEFAULT_HANDLE
);
dndSetMsgHandle
(
pWrapper
,
TDMT_MND_STATUS_RSP
,
dmProcessStatusMsg
,
DEFAULT_HANDLE
);
dndSetMsgHandle
(
pWrapper
,
TDMT_MND_GRANT_RSP
,
dmProcessMgmtMsg
,
DEFAULT_HANDLE
);
dndSetMsgHandle
(
pWrapper
,
TDMT_MND_GRANT_RSP
,
dmProcessMgmtMsg
,
DEFAULT_HANDLE
);
dndSetMsgHandle
(
pWrapper
,
TDMT_MND_AUTH_RSP
,
dmProcessMgmtMsg
,
DEFAULT_HANDLE
);
dndSetMsgHandle
(
pWrapper
,
TDMT_MND_AUTH_RSP
,
dmProcessMgmtMsg
,
DEFAULT_HANDLE
);
// Monitor info exchange between processes
dndSetMsgHandle
(
pWrapper
,
TDMT_MON_DISK_INFO
,
dmProcessStatusMsg
,
DEFAULT_HANDLE
);
}
}
source/dnode/mgmt/dm/dmMonitor.c
浏览文件 @
f492ae74
...
@@ -14,7 +14,7 @@
...
@@ -14,7 +14,7 @@
*/
*/
#define _DEFAULT_SOURCE
#define _DEFAULT_SOURCE
#include "d
nd
Int.h"
#include "d
m
Int.h"
static
int32_t
dmGetMonitorDiskInfo
(
SDnode
*
pDnode
,
SMonDiskInfo
*
pInfo
)
{
static
int32_t
dmGetMonitorDiskInfo
(
SDnode
*
pDnode
,
SMonDiskInfo
*
pInfo
)
{
tstrncpy
(
pInfo
->
logdir
.
name
,
tsLogDir
,
sizeof
(
pInfo
->
logdir
.
name
));
tstrncpy
(
pInfo
->
logdir
.
name
,
tsLogDir
,
sizeof
(
pInfo
->
logdir
.
name
));
...
@@ -105,3 +105,35 @@ void dmSendMonitorReport(SDnode *pDnode) {
...
@@ -105,3 +105,35 @@ void dmSendMonitorReport(SDnode *pDnode) {
monSendReport
(
pMonitor
);
monSendReport
(
pMonitor
);
monCleanupMonitorInfo
(
pMonitor
);
monCleanupMonitorInfo
(
pMonitor
);
}
}
int32_t
dmSetDiskInfo
(
SDnodeMgmt
*
pMgmt
,
SNodeMsg
*
pMsg
)
{
SDnode
*
pDnode
=
pMgmt
->
pDnode
;
SMonDiskInfo
info
=
{
0
};
if
(
tDeserializeSMonDiskInfo
(
pMsg
->
rpcMsg
.
pCont
,
pMsg
->
rpcMsg
.
contLen
,
&
info
)
!=
0
)
{
dError
(
"failed to parse diskinfo since %s"
,
terrstr
());
return
0
;
}
taosWLockLatch
(
&
pMgmt
->
latch
);
memcpy
(
&
pMgmt
->
diskInfo
,
&
info
,
sizeof
(
SMonDiskInfo
));
taosWUnLockLatch
(
&
pMgmt
->
latch
);
return
0
;
}
int32_t
dmSetVnodeStat
(
SDnodeMgmt
*
pMgmt
,
SNodeMsg
*
pMsg
)
{
SDnode
*
pDnode
=
pMgmt
->
pDnode
;
SVnodesStat
info
=
{
0
};
if
(
tDeserializeSMonDiskInfo
(
pMsg
->
rpcMsg
.
pCont
,
pMsg
->
rpcMsg
.
contLen
,
&
info
)
!=
0
)
{
dError
(
"failed to parse diskinfo since %s"
,
terrstr
());
return
0
;
}
taosWLockLatch
(
&
pMgmt
->
latch
);
memcpy
(
&
pMgmt
->
diskInfo
,
&
info
,
sizeof
(
SMonDiskInfo
));
taosWUnLockLatch
(
&
pMgmt
->
latch
);
return
0
;
}
\ No newline at end of file
source/dnode/mgmt/dm/dmWorker.c
浏览文件 @
f492ae74
...
@@ -78,6 +78,9 @@ static void dmProcessQueue(SQueueInfo *pInfo, SNodeMsg *pMsg) {
...
@@ -78,6 +78,9 @@ static void dmProcessQueue(SQueueInfo *pInfo, SNodeMsg *pMsg) {
case
TDMT_MND_GRANT_RSP
:
case
TDMT_MND_GRANT_RSP
:
code
=
dmProcessGrantRsp
(
pMgmt
,
pMsg
);
code
=
dmProcessGrantRsp
(
pMgmt
,
pMsg
);
break
;
break
;
case
TDMT_MON_DISK_INFO_RSP
:
code
=
dmSetDiskInfo
(
pMgmt
,
pMsg
);
break
;
default:
default:
code
=
dmProcessCDnodeReq
(
pMgmt
->
pDnode
,
pMsg
);
code
=
dmProcessCDnodeReq
(
pMgmt
->
pDnode
,
pMsg
);
break
;
break
;
...
...
source/dnode/mgmt/inc/dmInt.h
浏览文件 @
f492ae74
...
@@ -37,6 +37,11 @@ typedef struct SDnodeMgmt {
...
@@ -37,6 +37,11 @@ typedef struct SDnodeMgmt {
const
char
*
path
;
const
char
*
path
;
SDnode
*
pDnode
;
SDnode
*
pDnode
;
SMgmtWrapper
*
pWrapper
;
SMgmtWrapper
*
pWrapper
;
// monitor infos
SMonDiskInfo
diskInfo
;
SMonVnodesStat
vnodesStat
;
SMonVnodesLoad
vnodesLoad
;
}
SDnodeMgmt
;
}
SDnodeMgmt
;
// dmFile.c
// dmFile.c
...
@@ -54,6 +59,9 @@ int32_t dmProcessGrantRsp(SDnodeMgmt *pMgmt, SNodeMsg *pMsg);
...
@@ -54,6 +59,9 @@ int32_t dmProcessGrantRsp(SDnodeMgmt *pMgmt, SNodeMsg *pMsg);
int32_t
dmProcessCDnodeReq
(
SDnode
*
pDnode
,
SNodeMsg
*
pMsg
);
int32_t
dmProcessCDnodeReq
(
SDnode
*
pDnode
,
SNodeMsg
*
pMsg
);
// dmMonitor.c
// dmMonitor.c
int32_t
dmSetDiskInfo
(
SDnodeMgmt
*
pMgmt
,
SNodeMsg
*
pMsg
);
int32_t
dmSetVnodesStat
(
SDnodeMgmt
*
pMgmt
,
SNodeMsg
*
pMsg
);
int32_t
dmSetVnodesLoad
(
SDnodeMgmt
*
pMgmt
,
SNodeMsg
*
pMsg
);
void
dmSendMonitorReport
(
SDnode
*
pDnode
);
void
dmSendMonitorReport
(
SDnode
*
pDnode
);
// dmWorker.c
// dmWorker.c
...
...
source/libs/monitor/inc/monInt.h
浏览文件 @
f492ae74
...
@@ -18,43 +18,32 @@
...
@@ -18,43 +18,32 @@
#include "monitor.h"
#include "monitor.h"
#include "tarray.h"
#include "tjson.h"
#include "tjson.h"
typedef
struct
{
typedef
struct
{
int64_t
ts
;
ELogLevel
level
;
char
content
[
MON_LOG_LEN
];
}
SMonLogItem
;
typedef
struct
{
int64_t
time
;
int64_t
req_select
;
int64_t
req_insert
;
int64_t
req_insert_batch
;
int64_t
net_in
;
int64_t
net_out
;
int64_t
io_read
;
int64_t
io_write
;
int64_t
io_read_disk
;
int64_t
io_write_disk
;
}
SMonState
;
typedef
struct
SMonInfo
{
int64_t
curTime
;
int64_t
curTime
;
SMonState
lastState
;
int64_t
lastTime
;
SArray
*
logs
;
// array of SMonLogItem
SJson
*
pJson
;
SJson
*
pJson
;
SMonLogs
logs
;
SMonDmInfo
dmInfo
;
SMonMmInfo
mmInfo
;
SMonVmInfo
vmInfo
;
SMonSmInfo
smInfo
;
SMonQmInfo
qmInfo
;
SMonBmInfo
bmInfo
;
}
SMonInfo
;
}
SMonInfo
;
typedef
struct
{
typedef
struct
{
TdThreadMutex
lock
;
TdThreadMutex
lock
;
SArray
*
logs
;
// array of SMonLogItem
SArray
*
logs
;
// array of SMonLogItem
int32_t
maxLogs
;
SMonCfg
cfg
;
const
char
*
server
;
int64_t
lastTime
;
uint16_t
port
;
SMonDmInfo
dmInfo
;
bool
comp
;
SMonMmInfo
mmInfo
;
SMonState
state
;
SMonVmInfo
vmInfo
;
SMonSmInfo
smInfo
;
SMonQmInfo
qmInfo
;
SMonBmInfo
bmInfo
;
}
SMonitor
;
}
SMonitor
;
#ifdef __cplusplus
#ifdef __cplusplus
...
...
source/libs/monitor/src/monMsg.c
0 → 100644
浏览文件 @
f492ae74
/*
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
*
* This program is free software: you can use, redistribute, and/or modify
* it under the terms of the GNU Affero General Public License, version 3
* or later ("AGPL"), as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#define _DEFAULT_SOURCE
#include "monInt.h"
#include "tcoding.h"
#include "tencode.h"
int32_t
tSerializeSMonMmInfo
(
void
*
buf
,
int32_t
bufLen
,
SMonMmInfo
*
pInfo
);
int32_t
tDeserializeSMonMmInfo
(
void
*
buf
,
int32_t
bufLen
,
SMonMmInfo
*
pInfo
);
void
tFreeSMonMmInfo
(
SMonMmInfo
*
pInfo
)
{
taosArrayDestroy
(
pInfo
->
logs
.
logs
);
pInfo
->
logs
.
logs
=
NULL
;
}
int32_t
tSerializeSMonVmInfo
(
void
*
buf
,
int32_t
bufLen
,
SMonVmInfo
*
pInfo
);
int32_t
tDeserializeSMonVMmInfo
(
void
*
buf
,
int32_t
bufLen
,
SMonVmInfo
*
pInfo
);
void
tFreeSMonVmInfo
(
SMonVmInfo
*
pInfo
)
{
taosArrayDestroy
(
pInfo
->
logs
.
logs
);
pInfo
->
logs
.
logs
=
NULL
;
}
int32_t
tSerializeSMonQmInfo
(
void
*
buf
,
int32_t
bufLen
,
SMonQmInfo
*
pInfo
);
int32_t
tDeserializeSMonQMmInfo
(
void
*
buf
,
int32_t
bufLen
,
SMonQmInfo
*
pInfo
);
void
tFreeSMonQmInfo
(
SMonQmInfo
*
pInfo
)
{
taosArrayDestroy
(
pInfo
->
logs
.
logs
);
pInfo
->
logs
.
logs
=
NULL
;
}
int32_t
tSerializeSMonSmInfo
(
void
*
buf
,
int32_t
bufLen
,
SMonSmInfo
*
pInfo
);
int32_t
tDeserializeSMonSmInfo
(
void
*
buf
,
int32_t
bufLen
,
SMonSmInfo
*
pInfo
);
void
tFreeSMonSmInfo
(
SMonSmInfo
*
pInfo
)
{
taosArrayDestroy
(
pInfo
->
logs
.
logs
);
pInfo
->
logs
.
logs
=
NULL
;
}
int32_t
tSerializeSMonBmInfo
(
void
*
buf
,
int32_t
bufLen
,
SMonBmInfo
*
pInfo
);
int32_t
tDeserializeSMonBmInfo
(
void
*
buf
,
int32_t
bufLen
,
SMonBmInfo
*
pInfo
);
void
tFreeSMonBmInfo
(
SMonBmInfo
*
pInfo
)
{
taosArrayDestroy
(
pInfo
->
logs
.
logs
);
pInfo
->
logs
.
logs
=
NULL
;
}
\ No newline at end of file
source/libs/monitor/src/monitor.c
浏览文件 @
f492ae74
...
@@ -17,7 +17,6 @@
...
@@ -17,7 +17,6 @@
#include "monInt.h"
#include "monInt.h"
#include "taoserror.h"
#include "taoserror.h"
#include "thttp.h"
#include "thttp.h"
#include "tlog.h"
#include "ttime.h"
#include "ttime.h"
static
SMonitor
tsMonitor
=
{
0
};
static
SMonitor
tsMonitor
=
{
0
};
...
@@ -25,7 +24,7 @@ static SMonitor tsMonitor = {0};
...
@@ -25,7 +24,7 @@ static SMonitor tsMonitor = {0};
void
monRecordLog
(
int64_t
ts
,
ELogLevel
level
,
const
char
*
content
)
{
void
monRecordLog
(
int64_t
ts
,
ELogLevel
level
,
const
char
*
content
)
{
taosThreadMutexLock
(
&
tsMonitor
.
lock
);
taosThreadMutexLock
(
&
tsMonitor
.
lock
);
int32_t
size
=
taosArrayGetSize
(
tsMonitor
.
logs
);
int32_t
size
=
taosArrayGetSize
(
tsMonitor
.
logs
);
if
(
size
<
tsMonitor
.
maxLogs
)
{
if
(
size
<
tsMonitor
.
cfg
.
maxLogs
)
{
SMonLogItem
item
=
{.
ts
=
ts
,
.
level
=
level
};
SMonLogItem
item
=
{.
ts
=
ts
,
.
level
=
level
};
SMonLogItem
*
pItem
=
taosArrayPush
(
tsMonitor
.
logs
,
&
item
);
SMonLogItem
*
pItem
=
taosArrayPush
(
tsMonitor
.
logs
,
&
item
);
if
(
pItem
!=
NULL
)
{
if
(
pItem
!=
NULL
)
{
...
@@ -35,6 +34,68 @@ void monRecordLog(int64_t ts, ELogLevel level, const char *content) {
...
@@ -35,6 +34,68 @@ void monRecordLog(int64_t ts, ELogLevel level, const char *content) {
taosThreadMutexUnlock
(
&
tsMonitor
.
lock
);
taosThreadMutexUnlock
(
&
tsMonitor
.
lock
);
}
}
int32_t
monGetLogs
(
SMonLogs
*
logs
)
{
taosThreadMutexLock
(
&
tsMonitor
.
lock
);
logs
->
logs
=
taosArrayDup
(
tsMonitor
.
logs
);
logs
->
numOfInfoLogs
=
tsNumOfInfoLogs
;
logs
->
numOfErrorLogs
=
tsNumOfErrorLogs
;
logs
->
numOfDebugLogs
=
tsNumOfDebugLogs
;
logs
->
numOfTraceLogs
=
tsNumOfTraceLogs
;
tsNumOfInfoLogs
=
0
;
tsNumOfErrorLogs
=
0
;
tsNumOfDebugLogs
=
0
;
tsNumOfTraceLogs
=
0
;
taosArrayClear
(
tsMonitor
.
logs
);
taosThreadMutexUnlock
(
&
tsMonitor
.
lock
);
if
(
logs
->
logs
==
NULL
)
{
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
return
-
1
;
}
return
0
;
}
void
monSetDmInfo
(
SMonDmInfo
*
pInfo
)
{
taosThreadMutexLock
(
&
tsMonitor
.
lock
);
memcpy
(
&
tsMonitor
.
dmInfo
,
pInfo
,
sizeof
(
SMonDmInfo
));
taosThreadMutexUnlock
(
&
tsMonitor
.
lock
);
memset
(
pInfo
,
0
,
sizeof
(
SMonDmInfo
));
}
void
monSetMmInfo
(
SMonMmInfo
*
pInfo
)
{
taosThreadMutexLock
(
&
tsMonitor
.
lock
);
memcpy
(
&
tsMonitor
.
mmInfo
,
pInfo
,
sizeof
(
SMonMmInfo
));
taosThreadMutexUnlock
(
&
tsMonitor
.
lock
);
memset
(
pInfo
,
0
,
sizeof
(
SMonMmInfo
));
}
void
monSetVmInfo
(
SMonVmInfo
*
pInfo
)
{
taosThreadMutexLock
(
&
tsMonitor
.
lock
);
memcpy
(
&
tsMonitor
.
vmInfo
,
pInfo
,
sizeof
(
SMonVmInfo
));
taosThreadMutexUnlock
(
&
tsMonitor
.
lock
);
memset
(
pInfo
,
0
,
sizeof
(
SMonVmInfo
));
}
void
monSetQmInfo
(
SMonQmInfo
*
pInfo
)
{
taosThreadMutexLock
(
&
tsMonitor
.
lock
);
memcpy
(
&
tsMonitor
.
qmInfo
,
pInfo
,
sizeof
(
SMonQmInfo
));
taosThreadMutexUnlock
(
&
tsMonitor
.
lock
);
memset
(
pInfo
,
0
,
sizeof
(
SMonQmInfo
));
}
void
monSetSmInfo
(
SMonSmInfo
*
pInfo
)
{
taosThreadMutexLock
(
&
tsMonitor
.
lock
);
memcpy
(
&
tsMonitor
.
smInfo
,
pInfo
,
sizeof
(
SMonSmInfo
));
taosThreadMutexUnlock
(
&
tsMonitor
.
lock
);
memset
(
pInfo
,
0
,
sizeof
(
SMonSmInfo
));
}
void
monSetBmInfo
(
SMonBmInfo
*
pInfo
)
{
taosThreadMutexLock
(
&
tsMonitor
.
lock
);
memcpy
(
&
tsMonitor
.
bmInfo
,
pInfo
,
sizeof
(
SMonBmInfo
));
taosThreadMutexUnlock
(
&
tsMonitor
.
lock
);
memset
(
pInfo
,
0
,
sizeof
(
SMonBmInfo
));
}
int32_t
monInit
(
const
SMonCfg
*
pCfg
)
{
int32_t
monInit
(
const
SMonCfg
*
pCfg
)
{
tsMonitor
.
logs
=
taosArrayInit
(
16
,
sizeof
(
SMonLogItem
));
tsMonitor
.
logs
=
taosArrayInit
(
16
,
sizeof
(
SMonLogItem
));
if
(
tsMonitor
.
logs
==
NULL
)
{
if
(
tsMonitor
.
logs
==
NULL
)
{
...
@@ -42,12 +103,9 @@ int32_t monInit(const SMonCfg *pCfg) {
...
@@ -42,12 +103,9 @@ int32_t monInit(const SMonCfg *pCfg) {
return
-
1
;
return
-
1
;
}
}
tsMonitor
.
maxLogs
=
pCfg
->
maxLogs
;
tsMonitor
.
cfg
=
*
pCfg
;
tsMonitor
.
server
=
pCfg
->
server
;
tsMonitor
.
port
=
pCfg
->
port
;
tsMonitor
.
comp
=
pCfg
->
comp
;
tsLogFp
=
monRecordLog
;
tsLogFp
=
monRecordLog
;
tsMonitor
.
state
.
t
ime
=
taosGetTimestampMs
();
tsMonitor
.
lastT
ime
=
taosGetTimestampMs
();
taosThreadMutexInit
(
&
tsMonitor
.
lock
,
NULL
);
taosThreadMutexInit
(
&
tsMonitor
.
lock
,
NULL
);
return
0
;
return
0
;
}
}
...
@@ -56,42 +114,65 @@ void monCleanup() {
...
@@ -56,42 +114,65 @@ void monCleanup() {
tsLogFp
=
NULL
;
tsLogFp
=
NULL
;
taosArrayDestroy
(
tsMonitor
.
logs
);
taosArrayDestroy
(
tsMonitor
.
logs
);
tsMonitor
.
logs
=
NULL
;
tsMonitor
.
logs
=
NULL
;
tFreeSMonMmInfo
(
&
tsMonitor
.
mmInfo
);
tFreeSMonVmInfo
(
&
tsMonitor
.
vmInfo
);
tFreeSMonSmInfo
(
&
tsMonitor
.
smInfo
);
tFreeSMonQmInfo
(
&
tsMonitor
.
qmInfo
);
tFreeSMonBmInfo
(
&
tsMonitor
.
bmInfo
);
taosThreadMutexDestroy
(
&
tsMonitor
.
lock
);
taosThreadMutexDestroy
(
&
tsMonitor
.
lock
);
}
}
SMonInfo
*
monCreateMonitorInfo
()
{
static
void
monCleanupMonitorInfo
(
SMonInfo
*
pMonitor
)
{
tsMonitor
.
lastTime
=
pMonitor
->
curTime
;
taosArrayDestroy
(
pMonitor
->
logs
.
logs
);
tFreeSMonMmInfo
(
&
pMonitor
->
mmInfo
);
tFreeSMonVmInfo
(
&
pMonitor
->
vmInfo
);
tFreeSMonSmInfo
(
&
pMonitor
->
smInfo
);
tFreeSMonQmInfo
(
&
pMonitor
->
qmInfo
);
tFreeSMonBmInfo
(
&
pMonitor
->
bmInfo
);
tjsonDelete
(
pMonitor
->
pJson
);
taosMemoryFree
(
pMonitor
);
}
static
SMonInfo
*
monCreateMonitorInfo
()
{
SMonInfo
*
pMonitor
=
taosMemoryCalloc
(
1
,
sizeof
(
SMonInfo
));
SMonInfo
*
pMonitor
=
taosMemoryCalloc
(
1
,
sizeof
(
SMonInfo
));
if
(
pMonitor
==
NULL
)
{
if
(
pMonitor
==
NULL
)
{
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
return
NULL
;
return
NULL
;
}
}
monGetLogs
(
&
pMonitor
->
logs
);
taosThreadMutexLock
(
&
tsMonitor
.
lock
);
taosThreadMutexLock
(
&
tsMonitor
.
lock
);
pMonitor
->
logs
=
taosArrayDup
(
tsMonitor
.
logs
);
memcpy
(
&
pMonitor
->
dmInfo
,
&
tsMonitor
.
dmInfo
,
sizeof
(
SMonDmInfo
));
taosArrayClear
(
tsMonitor
.
logs
);
memcpy
(
&
pMonitor
->
mmInfo
,
&
tsMonitor
.
mmInfo
,
sizeof
(
SMonMmInfo
));
memcpy
(
&
pMonitor
->
vmInfo
,
&
tsMonitor
.
vmInfo
,
sizeof
(
SMonVmInfo
));
memcpy
(
&
pMonitor
->
smInfo
,
&
tsMonitor
.
smInfo
,
sizeof
(
SMonSmInfo
));
memcpy
(
&
pMonitor
->
qmInfo
,
&
tsMonitor
.
qmInfo
,
sizeof
(
SMonQmInfo
));
memcpy
(
&
pMonitor
->
bmInfo
,
&
tsMonitor
.
bmInfo
,
sizeof
(
SMonBmInfo
));
memset
(
&
tsMonitor
.
dmInfo
,
0
,
sizeof
(
SMonDmInfo
));
memset
(
&
tsMonitor
.
mmInfo
,
0
,
sizeof
(
SMonMmInfo
));
memset
(
&
tsMonitor
.
vmInfo
,
0
,
sizeof
(
SMonVmInfo
));
memset
(
&
tsMonitor
.
smInfo
,
0
,
sizeof
(
SMonSmInfo
));
memset
(
&
tsMonitor
.
qmInfo
,
0
,
sizeof
(
SMonQmInfo
));
memset
(
&
tsMonitor
.
bmInfo
,
0
,
sizeof
(
SMonBmInfo
));
taosThreadMutexUnlock
(
&
tsMonitor
.
lock
);
taosThreadMutexUnlock
(
&
tsMonitor
.
lock
);
pMonitor
->
pJson
=
tjsonCreateObject
();
pMonitor
->
pJson
=
tjsonCreateObject
();
if
(
pMonitor
->
pJson
==
NULL
||
pMonitor
->
logs
==
NULL
)
{
if
(
pMonitor
->
pJson
==
NULL
||
pMonitor
->
logs
.
logs
==
NULL
)
{
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
monCleanupMonitorInfo
(
pMonitor
);
monCleanupMonitorInfo
(
pMonitor
);
return
NULL
;
return
NULL
;
}
}
pMonitor
->
curTime
=
taosGetTimestampMs
();
pMonitor
->
curTime
=
taosGetTimestampMs
();
pMonitor
->
last
State
=
tsMonitor
.
stat
e
;
pMonitor
->
last
Time
=
tsMonitor
.
lastTim
e
;
return
pMonitor
;
return
pMonitor
;
}
}
void
monCleanupMonitorInfo
(
SMonInfo
*
pMonitor
)
{
static
void
monGenBasicJson
(
SMonInfo
*
pMonitor
)
{
tsMonitor
.
state
=
pMonitor
->
lastState
;
SMonBasicInfo
*
pInfo
=
&
pMonitor
->
dmInfo
.
basic
;
tsMonitor
.
state
.
time
=
pMonitor
->
curTime
;
taosArrayDestroy
(
pMonitor
->
logs
);
tjsonDelete
(
pMonitor
->
pJson
);
taosMemoryFree
(
pMonitor
);
}
void
monSetBasicInfo
(
SMonInfo
*
pMonitor
,
SMonBasicInfo
*
pInfo
)
{
SJson
*
pJson
=
pMonitor
->
pJson
;
SJson
*
pJson
=
pMonitor
->
pJson
;
char
buf
[
40
]
=
{
0
};
char
buf
[
40
]
=
{
0
};
taosFormatUtcTime
(
buf
,
sizeof
(
buf
),
pMonitor
->
curTime
,
TSDB_TIME_PRECISION_MILLI
);
taosFormatUtcTime
(
buf
,
sizeof
(
buf
),
pMonitor
->
curTime
,
TSDB_TIME_PRECISION_MILLI
);
...
@@ -104,7 +185,9 @@ void monSetBasicInfo(SMonInfo *pMonitor, SMonBasicInfo *pInfo) {
...
@@ -104,7 +185,9 @@ void monSetBasicInfo(SMonInfo *pMonitor, SMonBasicInfo *pInfo) {
tjsonAddDoubleToObject
(
pJson
,
"protocol"
,
pInfo
->
protocol
);
tjsonAddDoubleToObject
(
pJson
,
"protocol"
,
pInfo
->
protocol
);
}
}
void
monSetClusterInfo
(
SMonInfo
*
pMonitor
,
SMonClusterInfo
*
pInfo
)
{
static
void
monGenClusterJson
(
SMonInfo
*
pMonitor
)
{
SMonClusterInfo
*
pInfo
=
&
pMonitor
->
mmInfo
.
cluster
;
SJson
*
pJson
=
tjsonCreateObject
();
SJson
*
pJson
=
tjsonCreateObject
();
if
(
pJson
==
NULL
)
return
;
if
(
pJson
==
NULL
)
return
;
if
(
tjsonAddItemToObject
(
pMonitor
->
pJson
,
"cluster_info"
,
pJson
)
!=
0
)
{
if
(
tjsonAddItemToObject
(
pMonitor
->
pJson
,
"cluster_info"
,
pJson
)
!=
0
)
{
...
@@ -154,7 +237,9 @@ void monSetClusterInfo(SMonInfo *pMonitor, SMonClusterInfo *pInfo) {
...
@@ -154,7 +237,9 @@ void monSetClusterInfo(SMonInfo *pMonitor, SMonClusterInfo *pInfo) {
}
}
}
}
void
monSetVgroupInfo
(
SMonInfo
*
pMonitor
,
SMonVgroupInfo
*
pInfo
)
{
static
void
monGenVgroupJson
(
SMonInfo
*
pMonitor
)
{
SMonVgroupInfo
*
pInfo
=
&
pMonitor
->
mmInfo
.
vgroup
;
SJson
*
pJson
=
tjsonAddArrayToObject
(
pMonitor
->
pJson
,
"vgroup_infos"
);
SJson
*
pJson
=
tjsonAddArrayToObject
(
pMonitor
->
pJson
,
"vgroup_infos"
);
if
(
pJson
==
NULL
)
return
;
if
(
pJson
==
NULL
)
return
;
...
@@ -190,7 +275,9 @@ void monSetVgroupInfo(SMonInfo *pMonitor, SMonVgroupInfo *pInfo) {
...
@@ -190,7 +275,9 @@ void monSetVgroupInfo(SMonInfo *pMonitor, SMonVgroupInfo *pInfo) {
}
}
}
}
void
monSetGrantInfo
(
SMonInfo
*
pMonitor
,
SMonGrantInfo
*
pInfo
)
{
static
void
monGenGrantJson
(
SMonInfo
*
pMonitor
)
{
SMonGrantInfo
*
pInfo
=
&
pMonitor
->
mmInfo
.
grant
;
SJson
*
pJson
=
tjsonCreateObject
();
SJson
*
pJson
=
tjsonCreateObject
();
if
(
pJson
==
NULL
)
return
;
if
(
pJson
==
NULL
)
return
;
if
(
tjsonAddItemToObject
(
pMonitor
->
pJson
,
"grant_info"
,
pJson
)
!=
0
)
{
if
(
tjsonAddItemToObject
(
pMonitor
->
pJson
,
"grant_info"
,
pJson
)
!=
0
)
{
...
@@ -203,7 +290,11 @@ void monSetGrantInfo(SMonInfo *pMonitor, SMonGrantInfo *pInfo) {
...
@@ -203,7 +290,11 @@ void monSetGrantInfo(SMonInfo *pMonitor, SMonGrantInfo *pInfo) {
tjsonAddDoubleToObject
(
pJson
,
"timeseries_total"
,
pInfo
->
timeseries_total
);
tjsonAddDoubleToObject
(
pJson
,
"timeseries_total"
,
pInfo
->
timeseries_total
);
}
}
void
monSetDnodeInfo
(
SMonInfo
*
pMonitor
,
SMonDnodeInfo
*
pInfo
)
{
static
void
monGenDnodeJson
(
SMonInfo
*
pMonitor
)
{
SMonDnodeInfo
*
pInfo
=
&
pMonitor
->
dmInfo
.
dnode
;
SMonSysInfo
*
pSys
=
&
pMonitor
->
dmInfo
.
sys
;
SVnodesStat
*
pStat
=
&
pMonitor
->
vmInfo
.
vstat
;
SJson
*
pJson
=
tjsonCreateObject
();
SJson
*
pJson
=
tjsonCreateObject
();
if
(
pJson
==
NULL
)
return
;
if
(
pJson
==
NULL
)
return
;
if
(
tjsonAddItemToObject
(
pMonitor
->
pJson
,
"dnode_info"
,
pJson
)
!=
0
)
{
if
(
tjsonAddItemToObject
(
pMonitor
->
pJson
,
"dnode_info"
,
pJson
)
!=
0
)
{
...
@@ -211,58 +302,83 @@ void monSetDnodeInfo(SMonInfo *pMonitor, SMonDnodeInfo *pInfo) {
...
@@ -211,58 +302,83 @@ void monSetDnodeInfo(SMonInfo *pMonitor, SMonDnodeInfo *pInfo) {
return
;
return
;
}
}
SMonState
*
pLast
=
&
pMonitor
->
lastState
;
double
interval
=
(
pMonitor
->
curTime
-
pMonitor
->
lastTime
)
/
1000
.
0
;
double
interval
=
(
pMonitor
->
curTime
-
pLast
->
time
)
/
1000
.
0
;
if
(
pMonitor
->
curTime
-
pMonitor
->
lastTime
==
0
)
{
double
req_select_rate
=
(
pInfo
->
req_select
-
pLast
->
req_select
)
/
interval
;
interval
=
1
;
double
req_insert_rate
=
(
pInfo
->
req_insert
-
pLast
->
req_insert
)
/
interval
;
}
double
req_insert_batch_rate
=
(
pInfo
->
req_insert_batch
-
pLast
->
req_insert_batch
)
/
interval
;
double
net_in_rate
=
(
pInfo
->
net_in
-
pLast
->
net_in
)
/
interval
;
double
cpu_engine
=
0
;
double
net_out_rate
=
(
pInfo
->
net_out
-
pLast
->
net_out
)
/
interval
;
double
mem_engine
=
0
;
double
io_read_rate
=
(
pInfo
->
io_read
-
pLast
->
io_read
)
/
interval
;
double
net_in
=
0
;
double
io_write_rate
=
(
pInfo
->
io_write
-
pLast
->
io_write
)
/
interval
;
double
net_out
=
0
;
double
io_read_disk_rate
=
(
pInfo
->
io_read_disk
-
pLast
->
io_read_disk
)
/
interval
;
double
io_read
=
0
;
double
io_write_disk_rate
=
(
pInfo
->
io_write_disk
-
pLast
->
io_write_disk
)
/
interval
;
double
io_write
=
0
;
pLast
->
req_select
=
pInfo
->
req_select
;
double
io_read_disk
=
0
;
pLast
->
req_insert
=
pInfo
->
req_insert
;
double
io_write_disk
=
0
;
pLast
->
req_insert_batch
=
pInfo
->
req_insert_batch
;
pLast
->
net_in
=
pInfo
->
net_in
;
SMonSysInfo
*
sysArrays
[
6
];
pLast
->
net_out
=
pInfo
->
net_out
;
sysArrays
[
0
]
=
&
pMonitor
->
dmInfo
.
sys
;
pLast
->
io_read
=
pInfo
->
io_read
;
sysArrays
[
1
]
=
&
pMonitor
->
mmInfo
.
sys
;
pLast
->
io_write
=
pInfo
->
io_write
;
sysArrays
[
2
]
=
&
pMonitor
->
vmInfo
.
sys
;
pLast
->
io_read_disk
=
pInfo
->
io_read_disk
;
sysArrays
[
3
]
=
&
pMonitor
->
qmInfo
.
sys
;
pLast
->
io_write_disk
=
pInfo
->
io_write_disk
;
sysArrays
[
4
]
=
&
pMonitor
->
smInfo
.
sys
;
sysArrays
[
5
]
=
&
pMonitor
->
bmInfo
.
sys
;
for
(
int32_t
i
=
0
;
i
<
6
;
++
i
)
{
cpu_engine
+=
sysArrays
[
i
]
->
cpu_engine
;
mem_engine
+=
sysArrays
[
i
]
->
mem_engine
;
net_in
+=
sysArrays
[
i
]
->
net_in
;
net_out
+=
sysArrays
[
i
]
->
net_out
;
io_read
+=
sysArrays
[
i
]
->
io_read
;
io_write
+=
sysArrays
[
i
]
->
io_write
;
io_read_disk
+=
sysArrays
[
i
]
->
io_read_disk
;
io_write_disk
+=
sysArrays
[
i
]
->
io_write_disk
;
}
double
req_select_rate
=
pStat
->
numOfSelectReqs
/
interval
;
double
req_insert_rate
=
pStat
->
numOfInsertReqs
/
interval
;
double
req_insert_batch_rate
=
pStat
->
numOfBatchInsertReqs
/
interval
;
double
net_in_rate
=
net_in
/
interval
;
double
net_out_rate
=
net_out
/
interval
;
double
io_read_rate
=
io_read
/
interval
;
double
io_write_rate
=
io_write
/
interval
;
double
io_read_disk_rate
=
io_read_disk
/
interval
;
double
io_write_disk_rate
=
io_write_disk
/
interval
;
tjsonAddDoubleToObject
(
pJson
,
"uptime"
,
pInfo
->
uptime
);
tjsonAddDoubleToObject
(
pJson
,
"uptime"
,
pInfo
->
uptime
);
tjsonAddDoubleToObject
(
pJson
,
"cpu_engine"
,
pInfo
->
cpu_engine
);
tjsonAddDoubleToObject
(
pJson
,
"cpu_engine"
,
cpu_engine
);
tjsonAddDoubleToObject
(
pJson
,
"cpu_system"
,
p
Info
->
cpu_system
);
tjsonAddDoubleToObject
(
pJson
,
"cpu_system"
,
p
Sys
->
cpu_system
);
tjsonAddDoubleToObject
(
pJson
,
"cpu_cores"
,
p
Info
->
cpu_cores
);
tjsonAddDoubleToObject
(
pJson
,
"cpu_cores"
,
p
Sys
->
cpu_cores
);
tjsonAddDoubleToObject
(
pJson
,
"mem_engine"
,
pInfo
->
mem_engine
);
tjsonAddDoubleToObject
(
pJson
,
"mem_engine"
,
mem_engine
);
tjsonAddDoubleToObject
(
pJson
,
"mem_system"
,
p
Info
->
mem_system
);
tjsonAddDoubleToObject
(
pJson
,
"mem_system"
,
p
Sys
->
mem_system
);
tjsonAddDoubleToObject
(
pJson
,
"mem_total"
,
p
Info
->
mem_total
);
tjsonAddDoubleToObject
(
pJson
,
"mem_total"
,
p
Sys
->
mem_total
);
tjsonAddDoubleToObject
(
pJson
,
"disk_engine"
,
p
Info
->
disk_engine
);
tjsonAddDoubleToObject
(
pJson
,
"disk_engine"
,
p
Sys
->
disk_engine
);
tjsonAddDoubleToObject
(
pJson
,
"disk_used"
,
p
Info
->
disk_used
);
tjsonAddDoubleToObject
(
pJson
,
"disk_used"
,
p
Sys
->
disk_used
);
tjsonAddDoubleToObject
(
pJson
,
"disk_total"
,
p
Info
->
disk_total
);
tjsonAddDoubleToObject
(
pJson
,
"disk_total"
,
p
Sys
->
disk_total
);
tjsonAddDoubleToObject
(
pJson
,
"net_in"
,
net_in_rate
);
tjsonAddDoubleToObject
(
pJson
,
"net_in"
,
net_in_rate
);
tjsonAddDoubleToObject
(
pJson
,
"net_out"
,
net_out_rate
);
tjsonAddDoubleToObject
(
pJson
,
"net_out"
,
net_out_rate
);
tjsonAddDoubleToObject
(
pJson
,
"io_read"
,
io_read_rate
);
tjsonAddDoubleToObject
(
pJson
,
"io_read"
,
io_read_rate
);
tjsonAddDoubleToObject
(
pJson
,
"io_write"
,
io_write_rate
);
tjsonAddDoubleToObject
(
pJson
,
"io_write"
,
io_write_rate
);
tjsonAddDoubleToObject
(
pJson
,
"io_read_disk"
,
io_read_disk_rate
);
tjsonAddDoubleToObject
(
pJson
,
"io_read_disk"
,
io_read_disk_rate
);
tjsonAddDoubleToObject
(
pJson
,
"io_write_disk"
,
io_write_disk_rate
);
tjsonAddDoubleToObject
(
pJson
,
"io_write_disk"
,
io_write_disk_rate
);
tjsonAddDoubleToObject
(
pJson
,
"req_select"
,
p
Info
->
req_select
);
tjsonAddDoubleToObject
(
pJson
,
"req_select"
,
p
Stat
->
numOfSelectReqs
);
tjsonAddDoubleToObject
(
pJson
,
"req_select_rate"
,
req_select_rate
);
tjsonAddDoubleToObject
(
pJson
,
"req_select_rate"
,
req_select_rate
);
tjsonAddDoubleToObject
(
pJson
,
"req_insert"
,
p
Info
->
req_insert
);
tjsonAddDoubleToObject
(
pJson
,
"req_insert"
,
p
Stat
->
numOfInsertReqs
);
tjsonAddDoubleToObject
(
pJson
,
"req_insert_success"
,
p
Info
->
req_insert_succes
s
);
tjsonAddDoubleToObject
(
pJson
,
"req_insert_success"
,
p
Stat
->
numOfInsertSuccessReq
s
);
tjsonAddDoubleToObject
(
pJson
,
"req_insert_rate"
,
req_insert_rate
);
tjsonAddDoubleToObject
(
pJson
,
"req_insert_rate"
,
req_insert_rate
);
tjsonAddDoubleToObject
(
pJson
,
"req_insert_batch"
,
p
Info
->
req_insert_batch
);
tjsonAddDoubleToObject
(
pJson
,
"req_insert_batch"
,
p
Stat
->
numOfBatchInsertReqs
);
tjsonAddDoubleToObject
(
pJson
,
"req_insert_batch_success"
,
p
Info
->
req_insert_batch_succes
s
);
tjsonAddDoubleToObject
(
pJson
,
"req_insert_batch_success"
,
p
Stat
->
numOfBatchInsertSuccessReq
s
);
tjsonAddDoubleToObject
(
pJson
,
"req_insert_batch_rate"
,
req_insert_batch_rate
);
tjsonAddDoubleToObject
(
pJson
,
"req_insert_batch_rate"
,
req_insert_batch_rate
);
tjsonAddDoubleToObject
(
pJson
,
"errors"
,
p
Info
->
errors
);
tjsonAddDoubleToObject
(
pJson
,
"errors"
,
p
Stat
->
errors
);
tjsonAddDoubleToObject
(
pJson
,
"vnodes_num"
,
p
Info
->
vnodes_num
);
tjsonAddDoubleToObject
(
pJson
,
"vnodes_num"
,
p
Stat
->
totalVnodes
);
tjsonAddDoubleToObject
(
pJson
,
"masters"
,
p
Info
->
masters
);
tjsonAddDoubleToObject
(
pJson
,
"masters"
,
p
Stat
->
masterNum
);
tjsonAddDoubleToObject
(
pJson
,
"has_mnode"
,
pInfo
->
has_mnode
);
tjsonAddDoubleToObject
(
pJson
,
"has_mnode"
,
pInfo
->
has_mnode
);
}
}
void
monSetDiskInfo
(
SMonInfo
*
pMonitor
,
SMonDiskInfo
*
pInfo
)
{
static
void
monGenDiskJson
(
SMonInfo
*
pMonitor
)
{
SMonDiskInfo
*
pInfo
=
&
pMonitor
->
vmInfo
.
tfs
;
SMonDiskDesc
*
pLogDesc
=
&
pMonitor
->
dmInfo
.
dnode
.
logdir
;
SMonDiskDesc
*
pTempDesc
=
&
pMonitor
->
dmInfo
.
dnode
.
tempdir
;
SJson
*
pJson
=
tjsonCreateObject
();
SJson
*
pJson
=
tjsonCreateObject
();
if
(
pJson
==
NULL
)
return
;
if
(
pJson
==
NULL
)
return
;
if
(
tjsonAddItemToObject
(
pMonitor
->
pJson
,
"disk_infos"
,
pJson
)
!=
0
)
{
if
(
tjsonAddItemToObject
(
pMonitor
->
pJson
,
"disk_infos"
,
pJson
)
!=
0
)
{
...
@@ -290,18 +406,18 @@ void monSetDiskInfo(SMonInfo *pMonitor, SMonDiskInfo *pInfo) {
...
@@ -290,18 +406,18 @@ void monSetDiskInfo(SMonInfo *pMonitor, SMonDiskInfo *pInfo) {
SJson
*
pLogdirJson
=
tjsonCreateObject
();
SJson
*
pLogdirJson
=
tjsonCreateObject
();
if
(
pLogdirJson
==
NULL
)
return
;
if
(
pLogdirJson
==
NULL
)
return
;
if
(
tjsonAddItemToObject
(
pJson
,
"logdir"
,
pLogdirJson
)
!=
0
)
return
;
if
(
tjsonAddItemToObject
(
pJson
,
"logdir"
,
pLogdirJson
)
!=
0
)
return
;
tjsonAddStringToObject
(
pLogdirJson
,
"name"
,
p
Info
->
logdir
.
name
);
tjsonAddStringToObject
(
pLogdirJson
,
"name"
,
p
LogDesc
->
name
);
tjsonAddDoubleToObject
(
pLogdirJson
,
"avail"
,
p
Info
->
logdir
.
size
.
avail
);
tjsonAddDoubleToObject
(
pLogdirJson
,
"avail"
,
p
LogDesc
->
size
.
avail
);
tjsonAddDoubleToObject
(
pLogdirJson
,
"used"
,
p
Info
->
logdir
.
size
.
used
);
tjsonAddDoubleToObject
(
pLogdirJson
,
"used"
,
p
LogDesc
->
size
.
used
);
tjsonAddDoubleToObject
(
pLogdirJson
,
"total"
,
p
Info
->
logdir
.
size
.
total
);
tjsonAddDoubleToObject
(
pLogdirJson
,
"total"
,
p
LogDesc
->
size
.
total
);
SJson
*
pTempdirJson
=
tjsonCreateObject
();
SJson
*
pTempdirJson
=
tjsonCreateObject
();
if
(
pTempdirJson
==
NULL
)
return
;
if
(
pTempdirJson
==
NULL
)
return
;
if
(
tjsonAddItemToObject
(
pJson
,
"tempdir"
,
pTempdirJson
)
!=
0
)
return
;
if
(
tjsonAddItemToObject
(
pJson
,
"tempdir"
,
pTempdirJson
)
!=
0
)
return
;
tjsonAddStringToObject
(
pTempdirJson
,
"name"
,
p
Info
->
tempdir
.
name
);
tjsonAddStringToObject
(
pTempdirJson
,
"name"
,
p
TempDesc
->
name
);
tjsonAddDoubleToObject
(
pTempdirJson
,
"avail"
,
p
Info
->
tempdir
.
size
.
avail
);
tjsonAddDoubleToObject
(
pTempdirJson
,
"avail"
,
p
TempDesc
->
size
.
avail
);
tjsonAddDoubleToObject
(
pTempdirJson
,
"used"
,
p
Info
->
tempdir
.
size
.
used
);
tjsonAddDoubleToObject
(
pTempdirJson
,
"used"
,
p
TempDesc
->
size
.
used
);
tjsonAddDoubleToObject
(
pTempdirJson
,
"total"
,
p
Info
->
tempdir
.
size
.
total
);
tjsonAddDoubleToObject
(
pTempdirJson
,
"total"
,
p
TempDesc
->
size
.
total
);
}
}
static
const
char
*
monLogLevelStr
(
ELogLevel
level
)
{
static
const
char
*
monLogLevelStr
(
ELogLevel
level
)
{
...
@@ -319,7 +435,7 @@ static const char *monLogLevelStr(ELogLevel level) {
...
@@ -319,7 +435,7 @@ static const char *monLogLevelStr(ELogLevel level) {
}
}
}
}
static
void
mon
SetLogInfo
(
SMonInfo
*
pMonitor
)
{
static
void
mon
GenLogJson
(
SMonInfo
*
pMonitor
)
{
SJson
*
pJson
=
tjsonCreateObject
();
SJson
*
pJson
=
tjsonCreateObject
();
if
(
pJson
==
NULL
)
return
;
if
(
pJson
==
NULL
)
return
;
if
(
tjsonAddItemToObject
(
pMonitor
->
pJson
,
"log_infos"
,
pJson
)
!=
0
)
{
if
(
tjsonAddItemToObject
(
pMonitor
->
pJson
,
"log_infos"
,
pJson
)
!=
0
)
{
...
@@ -330,11 +446,31 @@ static void monSetLogInfo(SMonInfo *pMonitor) {
...
@@ -330,11 +446,31 @@ static void monSetLogInfo(SMonInfo *pMonitor) {
SJson
*
pLogsJson
=
tjsonAddArrayToObject
(
pJson
,
"logs"
);
SJson
*
pLogsJson
=
tjsonAddArrayToObject
(
pJson
,
"logs"
);
if
(
pLogsJson
==
NULL
)
return
;
if
(
pLogsJson
==
NULL
)
return
;
for
(
int32_t
i
=
0
;
i
<
taosArrayGetSize
(
pMonitor
->
logs
);
++
i
)
{
SMonLogs
*
logs
[
6
];
logs
[
0
]
=
&
pMonitor
->
logs
;
logs
[
1
]
=
&
pMonitor
->
mmInfo
.
logs
;
logs
[
2
]
=
&
pMonitor
->
vmInfo
.
logs
;
logs
[
3
]
=
&
pMonitor
->
smInfo
.
logs
;
logs
[
4
]
=
&
pMonitor
->
qmInfo
.
logs
;
logs
[
5
]
=
&
pMonitor
->
bmInfo
.
logs
;
int32_t
numOfErrorLogs
=
0
;
int32_t
numOfInfoLogs
=
0
;
int32_t
numOfDebugLogs
=
0
;
int32_t
numOfTraceLogs
=
0
;
for
(
int32_t
j
=
0
;
j
<
6
;
j
++
)
{
SMonLogs
*
pLogs
=
logs
[
j
];
numOfErrorLogs
+=
pLogs
->
numOfErrorLogs
;
numOfInfoLogs
+=
pLogs
->
numOfInfoLogs
;
numOfDebugLogs
+=
pLogs
->
numOfDebugLogs
;
numOfTraceLogs
+=
pLogs
->
numOfTraceLogs
;
for
(
int32_t
i
=
0
;
i
<
taosArrayGetSize
(
pLogs
->
logs
);
++
i
)
{
SJson
*
pLogJson
=
tjsonCreateObject
();
SJson
*
pLogJson
=
tjsonCreateObject
();
if
(
pLogJson
==
NULL
)
continue
;
if
(
pLogJson
==
NULL
)
continue
;
SMonLogItem
*
pLogItem
=
taosArrayGet
(
pMonitor
->
logs
,
i
);
SMonLogItem
*
pLogItem
=
taosArrayGet
(
pLogs
->
logs
,
i
);
char
buf
[
40
]
=
{
0
};
char
buf
[
40
]
=
{
0
};
taosFormatUtcTime
(
buf
,
sizeof
(
buf
),
pLogItem
->
ts
,
TSDB_TIME_PRECISION_MILLI
);
taosFormatUtcTime
(
buf
,
sizeof
(
buf
),
pLogItem
->
ts
,
TSDB_TIME_PRECISION_MILLI
);
...
@@ -345,6 +481,7 @@ static void monSetLogInfo(SMonInfo *pMonitor) {
...
@@ -345,6 +481,7 @@ static void monSetLogInfo(SMonInfo *pMonitor) {
if
(
tjsonAddItemToArray
(
pLogsJson
,
pLogJson
)
!=
0
)
tjsonDelete
(
pLogJson
);
if
(
tjsonAddItemToArray
(
pLogsJson
,
pLogJson
)
!=
0
)
tjsonDelete
(
pLogJson
);
}
}
}
SJson
*
pSummaryJson
=
tjsonAddArrayToObject
(
pJson
,
"summary"
);
SJson
*
pSummaryJson
=
tjsonAddArrayToObject
(
pJson
,
"summary"
);
if
(
pSummaryJson
==
NULL
)
return
;
if
(
pSummaryJson
==
NULL
)
return
;
...
@@ -352,35 +489,46 @@ static void monSetLogInfo(SMonInfo *pMonitor) {
...
@@ -352,35 +489,46 @@ static void monSetLogInfo(SMonInfo *pMonitor) {
SJson
*
pLogError
=
tjsonCreateObject
();
SJson
*
pLogError
=
tjsonCreateObject
();
if
(
pLogError
==
NULL
)
return
;
if
(
pLogError
==
NULL
)
return
;
tjsonAddStringToObject
(
pLogError
,
"level"
,
"error"
);
tjsonAddStringToObject
(
pLogError
,
"level"
,
"error"
);
tjsonAddDoubleToObject
(
pLogError
,
"total"
,
tsN
umOfErrorLogs
);
tjsonAddDoubleToObject
(
pLogError
,
"total"
,
n
umOfErrorLogs
);
if
(
tjsonAddItemToArray
(
pSummaryJson
,
pLogError
)
!=
0
)
tjsonDelete
(
pLogError
);
if
(
tjsonAddItemToArray
(
pSummaryJson
,
pLogError
)
!=
0
)
tjsonDelete
(
pLogError
);
SJson
*
pLogInfo
=
tjsonCreateObject
();
SJson
*
pLogInfo
=
tjsonCreateObject
();
if
(
pLogInfo
==
NULL
)
return
;
if
(
pLogInfo
==
NULL
)
return
;
tjsonAddStringToObject
(
pLogInfo
,
"level"
,
"info"
);
tjsonAddStringToObject
(
pLogInfo
,
"level"
,
"info"
);
tjsonAddDoubleToObject
(
pLogInfo
,
"total"
,
tsN
umOfInfoLogs
);
tjsonAddDoubleToObject
(
pLogInfo
,
"total"
,
n
umOfInfoLogs
);
if
(
tjsonAddItemToArray
(
pSummaryJson
,
pLogInfo
)
!=
0
)
tjsonDelete
(
pLogInfo
);
if
(
tjsonAddItemToArray
(
pSummaryJson
,
pLogInfo
)
!=
0
)
tjsonDelete
(
pLogInfo
);
SJson
*
pLogDebug
=
tjsonCreateObject
();
SJson
*
pLogDebug
=
tjsonCreateObject
();
if
(
pLogDebug
==
NULL
)
return
;
if
(
pLogDebug
==
NULL
)
return
;
tjsonAddStringToObject
(
pLogDebug
,
"level"
,
"debug"
);
tjsonAddStringToObject
(
pLogDebug
,
"level"
,
"debug"
);
tjsonAddDoubleToObject
(
pLogDebug
,
"total"
,
tsN
umOfDebugLogs
);
tjsonAddDoubleToObject
(
pLogDebug
,
"total"
,
n
umOfDebugLogs
);
if
(
tjsonAddItemToArray
(
pSummaryJson
,
pLogDebug
)
!=
0
)
tjsonDelete
(
pLogDebug
);
if
(
tjsonAddItemToArray
(
pSummaryJson
,
pLogDebug
)
!=
0
)
tjsonDelete
(
pLogDebug
);
SJson
*
pLogTrace
=
tjsonCreateObject
();
SJson
*
pLogTrace
=
tjsonCreateObject
();
if
(
pLogTrace
==
NULL
)
return
;
if
(
pLogTrace
==
NULL
)
return
;
tjsonAddStringToObject
(
pLogTrace
,
"level"
,
"trace"
);
tjsonAddStringToObject
(
pLogTrace
,
"level"
,
"trace"
);
tjsonAddDoubleToObject
(
pLogTrace
,
"total"
,
tsN
umOfTraceLogs
);
tjsonAddDoubleToObject
(
pLogTrace
,
"total"
,
n
umOfTraceLogs
);
if
(
tjsonAddItemToArray
(
pSummaryJson
,
pLogTrace
)
!=
0
)
tjsonDelete
(
pLogTrace
);
if
(
tjsonAddItemToArray
(
pSummaryJson
,
pLogTrace
)
!=
0
)
tjsonDelete
(
pLogTrace
);
}
}
void
monSendReport
(
SMonInfo
*
pMonitor
)
{
void
monSendReport
()
{
monSetLogInfo
(
pMonitor
);
SMonInfo
*
pMonitor
=
monCreateMonitorInfo
();
if
(
pMonitor
==
NULL
)
return
;
monGenBasicJson
(
pMonitor
);
monGenClusterJson
(
pMonitor
);
monGenVgroupJson
(
pMonitor
);
monGenGrantJson
(
pMonitor
);
monGenDnodeJson
(
pMonitor
);
monGenDiskJson
(
pMonitor
);
monGenLogJson
(
pMonitor
);
char
*
pCont
=
tjsonToString
(
pMonitor
->
pJson
);
char
*
pCont
=
tjsonToString
(
pMonitor
->
pJson
);
if
(
pCont
!=
NULL
)
{
if
(
pCont
!=
NULL
)
{
EHttpCompFlag
flag
=
tsMonitor
.
comp
?
HTTP_GZIP
:
HTTP_FLAT
;
EHttpCompFlag
flag
=
tsMonitor
.
c
fg
.
c
omp
?
HTTP_GZIP
:
HTTP_FLAT
;
taosSendHttpReport
(
tsMonitor
.
server
,
tsMonitor
.
port
,
pCont
,
strlen
(
pCont
),
flag
);
taosSendHttpReport
(
tsMonitor
.
cfg
.
server
,
tsMonitor
.
cfg
.
port
,
pCont
,
strlen
(
pCont
),
flag
);
taosMemoryFree
(
pCont
);
taosMemoryFree
(
pCont
);
}
}
monCleanupMonitorInfo
(
pMonitor
);
}
}
source/libs/monitor/test/CMakeLists.txt
浏览文件 @
f492ae74
enable_testing
()
enable_testing
()
aux_source_directory
(
. MONITOR_TEST_SRC
)
aux_source_directory
(
. MONITOR_TEST_SRC
)
add_executable
(
monitor
_t
est
${
MONITOR_TEST_SRC
}
)
add_executable
(
monitor
T
est
${
MONITOR_TEST_SRC
}
)
target_link_libraries
(
target_link_libraries
(
monitor
_t
est
monitor
T
est
PUBLIC monitor
PUBLIC monitor
PUBLIC gtest_main
PUBLIC gtest_main
)
)
add_test
(
add_test
(
NAME monitor
_t
est
NAME monitor
T
est
COMMAND monitor
_t
est
COMMAND monitor
T
est
)
)
source/libs/monitor/test/monTest.cpp
浏览文件 @
f492ae74
...
@@ -22,7 +22,7 @@ class MonitorTest : public ::testing::Test {
...
@@ -22,7 +22,7 @@ class MonitorTest : public ::testing::Test {
cfg
.
maxLogs
=
2
;
cfg
.
maxLogs
=
2
;
cfg
.
port
=
80
;
cfg
.
port
=
80
;
cfg
.
server
=
"localhost"
;
cfg
.
server
=
"localhost"
;
cfg
.
comp
=
0
;
cfg
.
comp
=
1
;
monInit
(
&
cfg
);
monInit
(
&
cfg
);
}
}
...
@@ -32,24 +32,64 @@ class MonitorTest : public ::testing::Test {
...
@@ -32,24 +32,64 @@ class MonitorTest : public ::testing::Test {
void
SetUp
()
override
{}
void
SetUp
()
override
{}
void
TearDown
()
override
{}
void
TearDown
()
override
{}
void
GetBasicInfo
(
SMonInfo
*
pMonitor
,
SMonBasicInfo
*
pInfo
);
void
GetBasicInfo
(
SMonBasicInfo
*
pInfo
);
void
GetClusterInfo
(
SMonInfo
*
pMonitor
,
SMonClusterInfo
*
pInfo
);
void
GetDnodeInfo
(
SMonDnodeInfo
*
pInfo
);
void
GetVgroupInfo
(
SMonInfo
*
pMonitor
,
SMonVgroupInfo
*
pInfo
);
void
GetSysInfo
(
SMonSysInfo
*
pInfo
);
void
GetGrantInfo
(
SMonInfo
*
pMonitor
,
SMonGrantInfo
*
pInfo
);
void
GetDnodeInfo
(
SMonInfo
*
pMonitor
,
SMonDnodeInfo
*
pInfo
);
void
GetClusterInfo
(
SMonClusterInfo
*
pInfo
);
void
GetDiskInfo
(
SMonInfo
*
pMonitor
,
SMonDiskInfo
*
pInfo
);
void
GetVgroupInfo
(
SMonVgroupInfo
*
pInfo
);
void
GetGrantInfo
(
SMonGrantInfo
*
pInfo
);
void
GetVnodeStat
(
SVnodesStat
*
pStat
);
void
GetDiskInfo
(
SMonDiskInfo
*
pInfo
);
void
GetLogInfo
(
SMonLogs
*
logs
);
void
AddLogInfo1
();
void
AddLogInfo1
();
void
AddLogInfo2
();
void
AddLogInfo2
();
};
};
void
MonitorTest
::
GetBasicInfo
(
SMon
Info
*
pMonitor
,
SMon
BasicInfo
*
pInfo
)
{
void
MonitorTest
::
GetBasicInfo
(
SMonBasicInfo
*
pInfo
)
{
pInfo
->
dnode_id
=
1
;
pInfo
->
dnode_id
=
1
;
strcpy
(
pInfo
->
dnode_ep
,
"localhost"
);
strcpy
(
pInfo
->
dnode_ep
,
"localhost"
);
pInfo
->
cluster_id
=
6980428120398645172
;
pInfo
->
cluster_id
=
6980428120398645172
;
pInfo
->
protocol
=
1
;
pInfo
->
protocol
=
1
;
}
}
void
MonitorTest
::
GetClusterInfo
(
SMonInfo
*
pMonitor
,
SMonClusterInfo
*
pInfo
)
{
void
MonitorTest
::
GetDnodeInfo
(
SMonDnodeInfo
*
pInfo
)
{
pInfo
->
uptime
=
1.2
;
pInfo
->
has_mnode
=
1
;
strcpy
(
pInfo
->
logdir
.
name
,
"/log/dir/d"
);
pInfo
->
logdir
.
size
.
avail
=
41
;
pInfo
->
logdir
.
size
.
total
=
42
;
pInfo
->
logdir
.
size
.
used
=
43
;
strcpy
(
pInfo
->
tempdir
.
name
,
"/data/dir/d"
);
pInfo
->
tempdir
.
size
.
avail
=
51
;
pInfo
->
tempdir
.
size
.
total
=
52
;
pInfo
->
tempdir
.
size
.
used
=
53
;
}
void
MonitorTest
::
GetSysInfo
(
SMonSysInfo
*
pInfo
)
{
pInfo
->
cpu_engine
=
2.1
;
pInfo
->
cpu_system
=
2.1
;
pInfo
->
cpu_cores
=
2
;
pInfo
->
mem_engine
=
3.1
;
pInfo
->
mem_system
=
3.2
;
pInfo
->
mem_total
=
3.3
;
pInfo
->
disk_engine
=
4.1
;
pInfo
->
disk_used
=
4.2
;
pInfo
->
disk_total
=
4.3
;
pInfo
->
net_in
=
5.1
;
pInfo
->
net_out
=
5.2
;
pInfo
->
io_read
=
6.1
;
pInfo
->
io_write
=
6.2
;
pInfo
->
io_read_disk
=
7.1
;
pInfo
->
io_write_disk
=
7.2
;
}
void
MonitorTest
::
GetClusterInfo
(
SMonClusterInfo
*
pInfo
)
{
strcpy
(
pInfo
->
first_ep
,
"localhost:6030"
);
strcpy
(
pInfo
->
first_ep
,
"localhost:6030"
);
pInfo
->
first_ep_dnode_id
=
1
;
pInfo
->
first_ep_dnode_id
=
1
;
strcpy
(
pInfo
->
version
,
"3.0.0.0"
);
strcpy
(
pInfo
->
version
,
"3.0.0.0"
);
...
@@ -86,7 +126,7 @@ void MonitorTest::GetClusterInfo(SMonInfo *pMonitor, SMonClusterInfo *pInfo) {
...
@@ -86,7 +126,7 @@ void MonitorTest::GetClusterInfo(SMonInfo *pMonitor, SMonClusterInfo *pInfo) {
taosArrayPush
(
pInfo
->
mnodes
,
&
m2
);
taosArrayPush
(
pInfo
->
mnodes
,
&
m2
);
}
}
void
MonitorTest
::
GetVgroupInfo
(
SMon
Info
*
pMonitor
,
SMon
VgroupInfo
*
pInfo
)
{
void
MonitorTest
::
GetVgroupInfo
(
SMonVgroupInfo
*
pInfo
)
{
pInfo
->
vgroups
=
taosArrayInit
(
4
,
sizeof
(
SMonVgroupDesc
));
pInfo
->
vgroups
=
taosArrayInit
(
4
,
sizeof
(
SMonVgroupDesc
));
SMonVgroupDesc
vg1
=
{
0
};
SMonVgroupDesc
vg1
=
{
0
};
...
@@ -121,41 +161,24 @@ void MonitorTest::GetVgroupInfo(SMonInfo *pMonitor, SMonVgroupInfo *pInfo) {
...
@@ -121,41 +161,24 @@ void MonitorTest::GetVgroupInfo(SMonInfo *pMonitor, SMonVgroupInfo *pInfo) {
taosArrayPush
(
pInfo
->
vgroups
,
&
vg3
);
taosArrayPush
(
pInfo
->
vgroups
,
&
vg3
);
}
}
void
MonitorTest
::
GetGrantInfo
(
SMon
Info
*
pMonitor
,
SMon
GrantInfo
*
pInfo
)
{
void
MonitorTest
::
GetGrantInfo
(
SMonGrantInfo
*
pInfo
)
{
pInfo
->
expire_time
=
1234567
;
pInfo
->
expire_time
=
1234567
;
pInfo
->
timeseries_total
=
234567
;
pInfo
->
timeseries_total
=
234567
;
pInfo
->
timeseries_used
=
34567
;
pInfo
->
timeseries_used
=
34567
;
}
}
void
MonitorTest
::
GetDnodeInfo
(
SMonInfo
*
pMonitor
,
SMonDnodeInfo
*
pInfo
)
{
void
MonitorTest
::
GetVnodeStat
(
SVnodesStat
*
pInfo
)
{
pInfo
->
uptime
=
1.2
;
pInfo
->
numOfSelectReqs
=
8
;
pInfo
->
cpu_engine
=
2.1
;
pInfo
->
numOfInsertReqs
=
9
;
pInfo
->
cpu_system
=
2.1
;
pInfo
->
numOfInsertSuccessReqs
=
10
;
pInfo
->
cpu_cores
=
2
;
pInfo
->
numOfBatchInsertReqs
=
11
;
pInfo
->
mem_engine
=
3.1
;
pInfo
->
numOfBatchInsertSuccessReqs
=
12
;
pInfo
->
mem_system
=
3.2
;
pInfo
->
mem_total
=
3.3
;
pInfo
->
disk_engine
=
4.1
;
pInfo
->
disk_used
=
4.2
;
pInfo
->
disk_total
=
4.3
;
pInfo
->
net_in
=
5.1
;
pInfo
->
net_out
=
5.2
;
pInfo
->
io_read
=
6.1
;
pInfo
->
io_write
=
6.2
;
pInfo
->
io_read_disk
=
7.1
;
pInfo
->
io_write_disk
=
7.2
;
pInfo
->
req_select
=
8
;
pInfo
->
req_insert
=
9
;
pInfo
->
req_insert_success
=
10
;
pInfo
->
req_insert_batch
=
11
;
pInfo
->
req_insert_batch_success
=
12
;
pInfo
->
errors
=
4
;
pInfo
->
errors
=
4
;
pInfo
->
vnodes_num
=
5
;
pInfo
->
totalVnodes
=
5
;
pInfo
->
masters
=
6
;
pInfo
->
masterNum
=
6
;
pInfo
->
has_mnode
=
1
;
}
}
void
MonitorTest
::
GetDiskInfo
(
SMon
Info
*
pMonitor
,
SMon
DiskInfo
*
pInfo
)
{
void
MonitorTest
::
GetDiskInfo
(
SMonDiskInfo
*
pInfo
)
{
pInfo
->
datadirs
=
taosArrayInit
(
2
,
sizeof
(
SMonDiskDesc
));
pInfo
->
datadirs
=
taosArrayInit
(
2
,
sizeof
(
SMonDiskDesc
));
SMonDiskDesc
d1
=
{
0
};
SMonDiskDesc
d1
=
{
0
};
strcpy
(
d1
.
name
,
"/t1/d1/d"
);
strcpy
(
d1
.
name
,
"/t1/d1/d"
);
...
@@ -180,16 +203,25 @@ void MonitorTest::GetDiskInfo(SMonInfo *pMonitor, SMonDiskInfo *pInfo) {
...
@@ -180,16 +203,25 @@ void MonitorTest::GetDiskInfo(SMonInfo *pMonitor, SMonDiskInfo *pInfo) {
d3
.
size
.
total
=
32
;
d3
.
size
.
total
=
32
;
d3
.
size
.
used
=
33
;
d3
.
size
.
used
=
33
;
taosArrayPush
(
pInfo
->
datadirs
,
&
d3
);
taosArrayPush
(
pInfo
->
datadirs
,
&
d3
);
}
strcpy
(
pInfo
->
logdir
.
name
,
"/log/dir/d"
);
void
MonitorTest
::
GetLogInfo
(
SMonLogs
*
logs
)
{
pInfo
->
logdir
.
size
.
avail
=
41
;
logs
->
logs
=
taosArrayInit
(
4
,
sizeof
(
SMonLogItem
));
pInfo
->
logdir
.
size
.
total
=
42
;
pInfo
->
logdir
.
size
.
used
=
43
;
strcpy
(
pInfo
->
tempdir
.
name
,
"/data/dir/d"
);
SMonLogItem
item1
=
{.
level
=
DEBUG_INFO
};
pInfo
->
tempdir
.
size
.
avail
=
51
;
item1
.
ts
=
taosGetTimestampMs
();
pInfo
->
tempdir
.
size
.
total
=
52
;
strcpy
(
item1
.
content
,
"log test1"
);
pInfo
->
tempdir
.
size
.
used
=
53
;
taosArrayPush
(
logs
->
logs
,
&
item1
);
SMonLogItem
item2
=
{.
level
=
DEBUG_ERROR
};
item2
.
ts
=
taosGetTimestampMs
();
strcpy
(
item2
.
content
,
"log test2"
);
taosArrayPush
(
logs
->
logs
,
&
item2
);
logs
->
numOfErrorLogs
=
1
;
logs
->
numOfInfoLogs
=
2
;
logs
->
numOfDebugLogs
=
3
;
logs
->
numOfTraceLogs
=
4
;
}
}
void
MonitorTest
::
AddLogInfo1
()
{
void
MonitorTest
::
AddLogInfo1
()
{
...
@@ -206,46 +238,52 @@ void MonitorTest::AddLogInfo2() {
...
@@ -206,46 +238,52 @@ void MonitorTest::AddLogInfo2() {
TEST_F
(
MonitorTest
,
01
_Full
)
{
TEST_F
(
MonitorTest
,
01
_Full
)
{
AddLogInfo1
();
AddLogInfo1
();
SMonInfo
*
pMonitor
=
monCreateMonitorInfo
();
SMonDmInfo
dmInfo
=
{
0
};
if
(
pMonitor
==
NULL
)
return
;
GetBasicInfo
(
&
dmInfo
.
basic
);
GetDnodeInfo
(
&
dmInfo
.
dnode
);
SMonBasicInfo
basicInfo
=
{
0
};
GetSysInfo
(
&
dmInfo
.
sys
);
GetBasicInfo
(
pMonitor
,
&
basicInfo
);
monSetBasicInfo
(
pMonitor
,
&
basicInfo
);
SMonMmInfo
mmInfo
=
{
0
};
GetClusterInfo
(
&
mmInfo
.
cluster
);
SMonClusterInfo
clusterInfo
=
{
0
};
GetVgroupInfo
(
&
mmInfo
.
vgroup
);
SMonVgroupInfo
vgroupInfo
=
{
0
};
GetGrantInfo
(
&
mmInfo
.
grant
);
SMonGrantInfo
grantInfo
=
{
0
};
GetSysInfo
(
&
mmInfo
.
sys
);
GetClusterInfo
(
pMonitor
,
&
clusterInfo
);
GetLogInfo
(
&
mmInfo
.
logs
);
GetVgroupInfo
(
pMonitor
,
&
vgroupInfo
);
GetGrantInfo
(
pMonitor
,
&
grantInfo
);
SMonVmInfo
vmInfo
=
{
0
};
monSetClusterInfo
(
pMonitor
,
&
clusterInfo
);
GetDiskInfo
(
&
vmInfo
.
tfs
);
monSetVgroupInfo
(
pMonitor
,
&
vgroupInfo
);
GetVnodeStat
(
&
vmInfo
.
vstat
);
monSetGrantInfo
(
pMonitor
,
&
grantInfo
);
GetSysInfo
(
&
vmInfo
.
sys
);
GetLogInfo
(
&
vmInfo
.
logs
);
SMonDnodeInfo
dnodeInfo
=
{
0
};
GetDnodeInfo
(
pMonitor
,
&
dnodeInfo
);
SMonQmInfo
qmInfo
=
{
0
};
monSetDnodeInfo
(
pMonitor
,
&
dnodeInfo
);
GetSysInfo
(
&
qmInfo
.
sys
);
GetLogInfo
(
&
qmInfo
.
logs
);
SMonDiskInfo
diskInfo
=
{
0
};
GetDiskInfo
(
pMonitor
,
&
diskInfo
);
SMonSmInfo
smInfo
=
{
0
};
monSetDiskInfo
(
pMonitor
,
&
diskInfo
);
GetSysInfo
(
&
smInfo
.
sys
);
GetLogInfo
(
&
smInfo
.
logs
);
monSendReport
(
pMonitor
);
monCleanupMonitorInfo
(
pMonitor
);
SMonBmInfo
bmInfo
=
{
0
};
GetSysInfo
(
&
bmInfo
.
sys
);
taosArrayDestroy
(
clusterInfo
.
dnodes
);
GetLogInfo
(
&
bmInfo
.
logs
);
taosArrayDestroy
(
clusterInfo
.
mnodes
);
taosArrayDestroy
(
vgroupInfo
.
vgroups
);
monSetDmInfo
(
&
dmInfo
);
taosArrayDestroy
(
diskInfo
.
datadirs
);
monSetMmInfo
(
&
mmInfo
);
monSetVmInfo
(
&
vmInfo
);
monSetQmInfo
(
&
qmInfo
);
monSetSmInfo
(
&
smInfo
);
monSetBmInfo
(
&
bmInfo
);
tFreeSMonMmInfo
(
&
mmInfo
);
tFreeSMonVmInfo
(
&
vmInfo
);
tFreeSMonSmInfo
(
&
smInfo
);
tFreeSMonQmInfo
(
&
qmInfo
);
tFreeSMonBmInfo
(
&
bmInfo
);
monSendReport
();
}
}
TEST_F
(
MonitorTest
,
02
_Log
)
{
TEST_F
(
MonitorTest
,
02
_Log
)
{
AddLogInfo2
();
AddLogInfo2
();
monSendReport
();
SMonInfo
*
pMonitor
=
monCreateMonitorInfo
();
if
(
pMonitor
==
NULL
)
return
;
monSendReport
(
pMonitor
);
monCleanupMonitorInfo
(
pMonitor
);
}
}
source/os/src/osSysinfo.c
浏览文件 @
f492ae74
...
@@ -129,14 +129,12 @@ static void taosGetProcIOnfos() {
...
@@ -129,14 +129,12 @@ static void taosGetProcIOnfos() {
static
int32_t
taosGetSysCpuInfo
(
SysCpuInfo
*
cpuInfo
)
{
static
int32_t
taosGetSysCpuInfo
(
SysCpuInfo
*
cpuInfo
)
{
TdFilePtr
pFile
=
taosOpenFile
(
tsSysCpuFile
,
TD_FILE_READ
|
TD_FILE_STREAM
);
TdFilePtr
pFile
=
taosOpenFile
(
tsSysCpuFile
,
TD_FILE_READ
|
TD_FILE_STREAM
);
if
(
pFile
==
NULL
)
{
if
(
pFile
==
NULL
)
{
// printf("open file:%s failed", tsSysCpuFile);
return
-
1
;
return
-
1
;
}
}
char
*
line
=
NULL
;
char
*
line
=
NULL
;
ssize_t
_bytes
=
taosGetLineFile
(
pFile
,
&
line
);
ssize_t
_bytes
=
taosGetLineFile
(
pFile
,
&
line
);
if
((
_bytes
<
0
)
||
(
line
==
NULL
))
{
if
((
_bytes
<
0
)
||
(
line
==
NULL
))
{
// printf("read file:%s failed", tsSysCpuFile);
taosCloseFile
(
&
pFile
);
taosCloseFile
(
&
pFile
);
return
-
1
;
return
-
1
;
}
}
...
@@ -153,14 +151,12 @@ static int32_t taosGetSysCpuInfo(SysCpuInfo *cpuInfo) {
...
@@ -153,14 +151,12 @@ static int32_t taosGetSysCpuInfo(SysCpuInfo *cpuInfo) {
static
int32_t
taosGetProcCpuInfo
(
ProcCpuInfo
*
cpuInfo
)
{
static
int32_t
taosGetProcCpuInfo
(
ProcCpuInfo
*
cpuInfo
)
{
TdFilePtr
pFile
=
taosOpenFile
(
tsProcCpuFile
,
TD_FILE_READ
|
TD_FILE_STREAM
);
TdFilePtr
pFile
=
taosOpenFile
(
tsProcCpuFile
,
TD_FILE_READ
|
TD_FILE_STREAM
);
if
(
pFile
==
NULL
)
{
if
(
pFile
==
NULL
)
{
// printf("open file:%s failed", tsProcCpuFile);
return
-
1
;
return
-
1
;
}
}
char
*
line
=
NULL
;
char
*
line
=
NULL
;
ssize_t
_bytes
=
taosGetLineFile
(
pFile
,
&
line
);
ssize_t
_bytes
=
taosGetLineFile
(
pFile
,
&
line
);
if
((
_bytes
<
0
)
||
(
line
==
NULL
))
{
if
((
_bytes
<
0
)
||
(
line
==
NULL
))
{
// printf("read file:%s failed", tsProcCpuFile);
taosCloseFile
(
&
pFile
);
taosCloseFile
(
&
pFile
);
return
-
1
;
return
-
1
;
}
}
...
@@ -182,12 +178,12 @@ static int32_t taosGetProcCpuInfo(ProcCpuInfo *cpuInfo) {
...
@@ -182,12 +178,12 @@ static int32_t taosGetProcCpuInfo(ProcCpuInfo *cpuInfo) {
#endif
#endif
bool
taosCheckSystemIsSmallEnd
()
{
bool
taosCheckSystemIsSmallEnd
()
{
union
check
{
union
check
{
int16_t
i
;
int16_t
i
;
char
ch
[
2
];
char
ch
[
2
];
}
c
;
}
c
;
c
.
i
=
1
;
c
.
i
=
1
;
return
c
.
ch
[
0
]
==
1
;
return
c
.
ch
[
0
]
==
1
;
}
}
void
taosGetSystemInfo
()
{
void
taosGetSystemInfo
()
{
...
@@ -617,6 +613,28 @@ int32_t taosGetProcIO(int64_t *rchars, int64_t *wchars, int64_t *read_bytes, int
...
@@ -617,6 +613,28 @@ int32_t taosGetProcIO(int64_t *rchars, int64_t *wchars, int64_t *read_bytes, int
#endif
#endif
}
}
void
taosGetProcIODelta
(
int64_t
*
rchars
,
int64_t
*
wchars
,
int64_t
*
read_bytes
,
int64_t
*
write_bytes
)
{
static
int64_t
last_rchars
=
0
;
static
int64_t
last_wchars
=
0
;
static
int64_t
last_read_bytes
=
0
;
static
int64_t
last_write_bytes
=
0
;
static
int64_t
cur_rchars
=
0
;
static
int64_t
cur_wchars
=
0
;
static
int64_t
cur_read_bytes
=
0
;
static
int64_t
cur_write_bytes
=
0
;
if
(
taosGetProcIO
(
&
cur_rchars
,
&
cur_wchars
,
&
cur_read_bytes
,
&
cur_write_bytes
)
!=
0
)
{
*
rchars
=
cur_rchars
-
last_rchars
;
*
wchars
=
cur_wchars
-
last_wchars
;
*
read_bytes
=
cur_read_bytes
-
last_read_bytes
;
*
write_bytes
=
cur_write_bytes
-
last_write_bytes
;
last_rchars
=
cur_rchars
;
last_wchars
=
cur_wchars
;
last_read_bytes
=
cur_read_bytes
;
last_write_bytes
=
cur_write_bytes
;
}
}
int32_t
taosGetCardInfo
(
int64_t
*
receive_bytes
,
int64_t
*
transmit_bytes
)
{
int32_t
taosGetCardInfo
(
int64_t
*
receive_bytes
,
int64_t
*
transmit_bytes
)
{
#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
*
receive_bytes
=
0
;
*
receive_bytes
=
0
;
...
@@ -672,6 +690,20 @@ int32_t taosGetCardInfo(int64_t *receive_bytes, int64_t *transmit_bytes) {
...
@@ -672,6 +690,20 @@ int32_t taosGetCardInfo(int64_t *receive_bytes, int64_t *transmit_bytes) {
#endif
#endif
}
}
void
taosGetCardInfoDelta
(
int64_t
*
receive_bytes
,
int64_t
*
transmit_bytes
)
{
static
int64_t
last_receive_bytes
=
0
;
static
int64_t
last_transmit_bytes
=
0
;
static
int64_t
cur_receive_bytes
=
0
;
static
int64_t
cur_transmit_bytes
=
0
;
if
(
taosGetCardInfo
(
&
cur_receive_bytes
,
&
cur_transmit_bytes
)
!=
0
)
{
*
receive_bytes
=
cur_receive_bytes
-
last_receive_bytes
;
*
transmit_bytes
=
cur_transmit_bytes
-
last_transmit_bytes
;
last_receive_bytes
=
cur_receive_bytes
;
last_transmit_bytes
=
cur_transmit_bytes
;
}
}
void
taosKillSystem
()
{
void
taosKillSystem
()
{
#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
printf
(
"function taosKillSystem, exit!"
);
printf
(
"function taosKillSystem, exit!"
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录