• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

taosdata / TDengine / #4829

30 Oct 2025 09:25AM UTC coverage: 49.734% (-11.3%) from 61.071%
#4829

push

travis-ci

web-flow
Merge pull request #33435 from taosdata/3.0

merge 3.0

123072 of 323930 branches covered (37.99%)

Branch coverage included in aggregate %.

7 of 25 new or added lines in 3 files covered. (28.0%)

35232 existing lines in 327 files now uncovered.

172062 of 269495 relevant lines covered (63.85%)

70709785.06 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

6.59
/source/dnode/mnode/impl/src/mndTelem.c
1
/*
2
 * Copyright (c) 2020 TAOS Data, Inc. <jhtao@taosdata.com>
3
 *
4
 * This program is free software: you can use, redistribute, and/or modify
5
 * it under the terms of the GNU Affero General Public License, version 3
6
 * or later ("AGPL"), as published by the Free Software Foundation.
7
 *
8
 * This program is distributed in the hope that it will be useful, but WITHOUT
9
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10
 * FITNESS FOR A PARTICULAR PURPOSE.
11
 *
12
 * You should have received a copy of the GNU Affero General Public License
13
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14
 */
15

16
#define _DEFAULT_SOURCE
17
#include "mndTelem.h"
18
#include "mndCluster.h"
19
#include "mndSync.h"
20
#include "thttp.h"
21
#include "tjson.h"
22
#include "mndAnode.h"
23

24

25
typedef struct {
26
  int64_t numOfDnode;
27
  int64_t numOfMnode;
28
  int64_t numOfVgroup;
29
  int64_t numOfDatabase;
30
  int64_t numOfSuperTable;
31
  int64_t numOfChildTable;
32
  int64_t numOfNormalTable;
33
  int64_t numOfColumn;
34
  int64_t totalPoints;
35
  int64_t totalStorage;
36
  int64_t compStorage;
37
  int32_t numOfAnalysisAlgos;
38
} SMnodeStat;
39

UNCOV
40
static void mndGetStat(SMnode* pMnode, SMnodeStat* pStat) {
×
UNCOV
41
  memset(pStat, 0, sizeof(SMnodeStat));
×
42

UNCOV
43
  SSdb* pSdb = pMnode->pSdb;
×
UNCOV
44
  pStat->numOfDnode = sdbGetSize(pSdb, SDB_DNODE);
×
UNCOV
45
  pStat->numOfMnode = sdbGetSize(pSdb, SDB_MNODE);
×
UNCOV
46
  pStat->numOfVgroup = sdbGetSize(pSdb, SDB_VGROUP);
×
UNCOV
47
  pStat->numOfDatabase = sdbGetSize(pSdb, SDB_DB);
×
UNCOV
48
  pStat->numOfSuperTable = sdbGetSize(pSdb, SDB_STB);
×
49

UNCOV
50
  void* pIter = NULL;
×
UNCOV
51
  while (1) {
×
UNCOV
52
    SVgObj* pVgroup = NULL;
×
UNCOV
53
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void**)&pVgroup);
×
UNCOV
54
    if (pIter == NULL) break;
×
55

UNCOV
56
    if (pVgroup->mountVgId) {
×
57
      sdbRelease(pSdb, pVgroup);
×
58
      continue;
×
59
    }
UNCOV
60
    pStat->numOfChildTable += pVgroup->numOfTables;
×
UNCOV
61
    pStat->numOfColumn += pVgroup->numOfTimeSeries;
×
UNCOV
62
    pStat->totalPoints += pVgroup->pointsWritten;
×
UNCOV
63
    pStat->totalStorage += pVgroup->totalStorage;
×
UNCOV
64
    pStat->compStorage += pVgroup->compStorage;
×
65

UNCOV
66
    sdbRelease(pSdb, pVgroup);
×
67
  }
UNCOV
68
}
×
69

70
static int32_t algoToJson(const void* pObj, SJson* pJson) {
×
71
  const SAnodeAlgo* pNode = (const SAnodeAlgo*)pObj;
×
72
  int32_t code = tjsonAddStringToObject(pJson, "name", pNode->name);
×
73
  return code;
×
74
}
75

UNCOV
76
static void mndBuildRuntimeInfo(SMnode* pMnode, SJson* pJson) {
×
UNCOV
77
  SMnodeStat mstat = {0};
×
UNCOV
78
  int32_t    code = 0;
×
UNCOV
79
  int32_t    lino = 0;
×
UNCOV
80
  SArray*    pFcList = NULL;
×
UNCOV
81
  SArray*    pAdList = NULL;
×
82

UNCOV
83
  mndGetStat(pMnode, &mstat);
×
84

UNCOV
85
  TAOS_CHECK_GOTO(tjsonAddDoubleToObject(pJson, "numOfDnode", mstat.numOfDnode), &lino, _OVER);
×
UNCOV
86
  TAOS_CHECK_GOTO(tjsonAddDoubleToObject(pJson, "numOfMnode", mstat.numOfMnode), &lino, _OVER);
×
UNCOV
87
  TAOS_CHECK_GOTO(tjsonAddDoubleToObject(pJson, "numOfVgroup", mstat.numOfVgroup), &lino, _OVER);
×
UNCOV
88
  TAOS_CHECK_GOTO(tjsonAddDoubleToObject(pJson, "numOfDatabase", mstat.numOfDatabase), &lino, _OVER);
×
UNCOV
89
  TAOS_CHECK_GOTO(tjsonAddDoubleToObject(pJson, "numOfSuperTable", mstat.numOfSuperTable), &lino, _OVER);
×
UNCOV
90
  TAOS_CHECK_GOTO(tjsonAddDoubleToObject(pJson, "numOfChildTable", mstat.numOfChildTable), &lino, _OVER);
×
UNCOV
91
  TAOS_CHECK_GOTO(tjsonAddDoubleToObject(pJson, "numOfColumn", mstat.numOfColumn), &lino, _OVER);
×
UNCOV
92
  TAOS_CHECK_GOTO(tjsonAddDoubleToObject(pJson, "numOfPoint", mstat.totalPoints), &lino, _OVER);
×
UNCOV
93
  TAOS_CHECK_GOTO(tjsonAddDoubleToObject(pJson, "totalStorage", mstat.totalStorage), &lino, _OVER);
×
UNCOV
94
  TAOS_CHECK_GOTO(tjsonAddDoubleToObject(pJson, "compStorage", mstat.compStorage), &lino, _OVER);
×
95

UNCOV
96
  pFcList = taosArrayInit(4, sizeof(SAnodeAlgo));
×
UNCOV
97
  pAdList = taosArrayInit(4, sizeof(SAnodeAlgo));
×
UNCOV
98
  if (pFcList == NULL || pAdList == NULL) {
×
99
    lino = __LINE__;
×
100
    goto _OVER;
×
101
  }
102

UNCOV
103
  mndRetrieveAlgoList(pMnode, pFcList, pAdList);
×
104

UNCOV
105
  if (taosArrayGetSize(pFcList) > 0) {
×
106
    SJson* items = tjsonAddArrayToObject(pJson, "forecast");
×
107
    TSDB_CHECK_NULL(items, code, lino, _OVER, terrno);
×
108

109
    for (int32_t i = 0; i < taosArrayGetSize(pFcList); ++i) {
×
110
      SJson* item = tjsonCreateObject();
×
111

112
      TSDB_CHECK_NULL(item, code, lino, _OVER, terrno);
×
113
      TAOS_CHECK_GOTO(tjsonAddItemToArray(items, item), &lino, _OVER);
×
114

115
      SAnodeAlgo* p = taosArrayGet(pFcList, i);
×
116
      TSDB_CHECK_NULL(p, code, lino, _OVER, terrno);
×
117
      TAOS_CHECK_GOTO(tjsonAddStringToObject(item, "name", p->name), &lino, _OVER);
×
118
    }
119
  }
120

UNCOV
121
  if (taosArrayGetSize(pAdList) > 0) {
×
122
    SJson* items1 = tjsonAddArrayToObject(pJson, "anomaly_detection");
×
123
    TSDB_CHECK_NULL(items1, code, lino, _OVER, terrno);
×
124

125
    for (int32_t i = 0; i < taosArrayGetSize(pAdList); ++i) {
×
126
      SJson* item = tjsonCreateObject();
×
127

128
      TSDB_CHECK_NULL(item, code, lino, _OVER, terrno);
×
129
      TAOS_CHECK_GOTO(tjsonAddItemToArray(items1, item), &lino, _OVER);
×
130

131
      SAnodeAlgo* p = taosArrayGet(pAdList, i);
×
132
      TSDB_CHECK_NULL(p, code, lino, _OVER, terrno);
×
133
      TAOS_CHECK_GOTO(tjsonAddStringToObject(item, "name", p->name), &lino, _OVER);
×
134
    }
135
  }
136

UNCOV
137
_OVER:
×
UNCOV
138
  taosArrayDestroy(pFcList);
×
UNCOV
139
  taosArrayDestroy(pAdList);
×
140

UNCOV
141
  if (code != 0) {
×
142
    mError("failed to mndBuildRuntimeInfo at line:%d since %s", lino, tstrerror(code));
×
143
  }
UNCOV
144
}
×
145

UNCOV
146
static char* mndBuildTelemetryReport(SMnode* pMnode) {
×
UNCOV
147
  char        tmp[4096] = {0};
×
UNCOV
148
  STelemMgmt* pMgmt = &pMnode->telemMgmt;
×
UNCOV
149
  int32_t     code = 0;
×
UNCOV
150
  int32_t     lino = 0;
×
151

UNCOV
152
  SJson* pJson = tjsonCreateObject();
×
UNCOV
153
  if (pJson == NULL) return NULL;
×
154

UNCOV
155
  char clusterName[64] = {0};
×
UNCOV
156
  if ((terrno = mndGetClusterName(pMnode, clusterName, sizeof(clusterName))) != 0) return NULL;
×
UNCOV
157
  TAOS_CHECK_GOTO(tjsonAddStringToObject(pJson, "instanceId", clusterName), &lino, _OVER);
×
UNCOV
158
  TAOS_CHECK_GOTO(tjsonAddDoubleToObject(pJson, "reportVersion", 1), &lino, _OVER);
×
159

UNCOV
160
  if (taosGetOsReleaseName(tmp, NULL, NULL, sizeof(tmp)) == 0) {
×
UNCOV
161
    TAOS_CHECK_GOTO(tjsonAddStringToObject(pJson, "os", tmp), &lino, _OVER);
×
162
  }
163

UNCOV
164
  float numOfCores = 0;
×
UNCOV
165
  if (taosGetCpuInfo(tmp, sizeof(tmp), &numOfCores) == 0) {
×
UNCOV
166
    TAOS_CHECK_GOTO(tjsonAddStringToObject(pJson, "cpuModel", tmp), &lino, _OVER);
×
UNCOV
167
    TAOS_CHECK_GOTO(tjsonAddDoubleToObject(pJson, "numOfCpu", numOfCores), &lino, _OVER);
×
168
  } else {
169
    TAOS_CHECK_GOTO(tjsonAddDoubleToObject(pJson, "numOfCpu", tsNumOfCores), &lino, _OVER);
×
170
  }
171

UNCOV
172
  snprintf(tmp, sizeof(tmp), "%" PRId64 " kB", tsTotalMemoryKB);
×
UNCOV
173
  TAOS_CHECK_GOTO(tjsonAddStringToObject(pJson, "memory", tmp), &lino, _OVER);
×
174

UNCOV
175
  TAOS_CHECK_GOTO(tjsonAddStringToObject(pJson, "version", td_version), &lino, _OVER);
×
UNCOV
176
  TAOS_CHECK_GOTO(tjsonAddStringToObject(pJson, "buildInfo", td_buildinfo), &lino, _OVER);
×
UNCOV
177
  TAOS_CHECK_GOTO(tjsonAddStringToObject(pJson, "gitInfo", td_gitinfo), &lino, _OVER);
×
UNCOV
178
  TAOS_CHECK_GOTO(tjsonAddStringToObject(pJson, "email", pMgmt->email), &lino, _OVER);
×
179

UNCOV
180
  mndBuildRuntimeInfo(pMnode, pJson);
×
181

UNCOV
182
_OVER:
×
UNCOV
183
  if (code != 0) {
×
184
    mError("failed to build telemetry report at lino:%d, since %s", lino, tstrerror(code));
×
185
  }
UNCOV
186
  char* pCont = tjsonToString(pJson);
×
UNCOV
187
  tjsonDelete(pJson);
×
UNCOV
188
  return pCont;
×
189
}
190

UNCOV
191
static int32_t mndProcessTelemTimer(SRpcMsg* pReq) {
×
UNCOV
192
  int32_t     code = 0;
×
UNCOV
193
  int32_t     line = 0;
×
UNCOV
194
  SMnode*     pMnode = pReq->info.node;
×
UNCOV
195
  STelemMgmt* pMgmt = &pMnode->telemMgmt;
×
196

UNCOV
197
  if (!tsEnableTelem) {
×
198
    return 0;
×
199
  }
200

UNCOV
201
  (void)taosThreadMutexLock(&pMgmt->lock);
×
UNCOV
202
  char* pCont = mndBuildTelemetryReport(pMnode);
×
UNCOV
203
  (void)taosThreadMutexUnlock(&pMgmt->lock);
×
204

UNCOV
205
  TSDB_CHECK_NULL(pCont, code, line, _end, terrno);
×
206

UNCOV
207
  code = taosSendTelemReport(&pMgmt->addrMgt, tsTelemUri, tsTelemPort, pCont, strlen(pCont), HTTP_FLAT);
×
UNCOV
208
  taosMemoryFree(pCont);
×
UNCOV
209
  return code;
×
210

211
_end:
×
212
  if (code != 0) {
×
213
    mError("%s failed to send telemetry report, line %d since %s", __func__, line, tstrerror(code));
×
214
  }
215
  taosMemoryFree(pCont);
×
216
  return code;
×
217
}
218

219
int32_t mndInitTelem(SMnode* pMnode) {
122,150✔
220
  int32_t     code = 0;
122,150✔
221
  STelemMgmt* pMgmt = &pMnode->telemMgmt;
122,150✔
222

223
  (void)taosThreadMutexInit(&pMgmt->lock, NULL);
122,150✔
224
  if ((code = taosGetEmail(pMgmt->email, sizeof(pMgmt->email))) != 0) {
122,150!
225
    mWarn("failed to get email since %s", tstrerror(code));
122,150!
226
  }
227

228
  code = taosTelemetryMgtInit(&pMgmt->addrMgt, tsTelemServer);
122,150✔
229
  if (code != 0) {
122,150!
230
    mError("failed to init telemetry management since %s", tstrerror(code));
×
231
    return code;
×
232
  }
233

234
  mndSetMsgHandle(pMnode, TDMT_MND_TELEM_TIMER, mndProcessTelemTimer);
122,150✔
235
  return 0;
122,150✔
236
}
237

238
void mndCleanupTelem(SMnode* pMnode) {
122,080✔
239
  STelemMgmt* pMgmt = &pMnode->telemMgmt;
122,080✔
240
  taosTelemetryDestroy(&pMgmt->addrMgt);
122,080✔
241
  (void)taosThreadMutexDestroy(&pMgmt->lock);
122,080✔
242
}
122,080✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc