2 #include "dnsdist-snmp.hh"
7 #define DNSDIST_OID 1, 3, 6, 1, 4, 1, 43315, 3
8 #define DNSDIST_STATS_OID DNSDIST_OID, 1
9 #define DNSDIST_STATS_TABLE_OID DNSDIST_OID, 2
10 #define DNSDIST_TRAPS_OID DNSDIST_OID, 10, 0
11 #define DNSDIST_TRAP_OBJECTS_OID DNSDIST_OID, 11
13 static const oid queriesOID
[] = { DNSDIST_STATS_OID
, 1 };
14 static const oid responsesOID
[] = { DNSDIST_STATS_OID
, 2 };
15 static const oid servfailResponsesOID
[] = { DNSDIST_STATS_OID
, 3 };
16 static const oid aclDropsOID
[] = { DNSDIST_STATS_OID
, 4 };
17 // 5 was BlockFilter, removed in 1.2.0
18 static const oid ruleDropOID
[] = { DNSDIST_STATS_OID
, 6 };
19 static const oid ruleNXDomainOID
[] = { DNSDIST_STATS_OID
, 7 };
20 static const oid ruleRefusedOID
[] = { DNSDIST_STATS_OID
, 8 };
21 static const oid selfAnsweredOID
[] = { DNSDIST_STATS_OID
, 9 };
22 static const oid downstreamTimeoutsOID
[] = { DNSDIST_STATS_OID
, 10 };
23 static const oid downstreamSendErrorsOID
[] = { DNSDIST_STATS_OID
, 11 };
24 static const oid truncFailOID
[] = { DNSDIST_STATS_OID
, 12 };
25 static const oid noPolicyOID
[] = { DNSDIST_STATS_OID
, 13 };
26 static const oid latency0_1OID
[] = { DNSDIST_STATS_OID
, 14 };
27 static const oid latency1_10OID
[] = { DNSDIST_STATS_OID
, 15 };
28 static const oid latency10_50OID
[] = { DNSDIST_STATS_OID
, 16 };
29 static const oid latency50_100OID
[] = { DNSDIST_STATS_OID
, 17 };
30 static const oid latency100_1000OID
[] = { DNSDIST_STATS_OID
, 18 };
31 static const oid latencySlowOID
[] = { DNSDIST_STATS_OID
, 19 };
32 static const oid latencyAvg100OID
[] = { DNSDIST_STATS_OID
, 20 };
33 static const oid latencyAvg1000OID
[] = { DNSDIST_STATS_OID
, 21 };
34 static const oid latencyAvg10000OID
[] = { DNSDIST_STATS_OID
, 22 };
35 static const oid latencyAvg1000000OID
[] = { DNSDIST_STATS_OID
, 23 };
36 static const oid uptimeOID
[] = { DNSDIST_STATS_OID
, 24 };
37 static const oid realMemoryUsageOID
[] = { DNSDIST_STATS_OID
, 25 };
38 static const oid nonCompliantQueriesOID
[] = { DNSDIST_STATS_OID
, 26 };
39 static const oid nonCompliantResponsesOID
[] = { DNSDIST_STATS_OID
, 27 };
40 static const oid rdQueriesOID
[] = { DNSDIST_STATS_OID
, 28 };
41 static const oid emptyQueriesOID
[] = { DNSDIST_STATS_OID
, 29 };
42 static const oid cacheHitsOID
[] = { DNSDIST_STATS_OID
, 30 };
43 static const oid cacheMissesOID
[] = { DNSDIST_STATS_OID
, 31 };
44 static const oid cpuUserMSecOID
[] = { DNSDIST_STATS_OID
, 32 };
45 static const oid cpuSysMSecOID
[] = { DNSDIST_STATS_OID
, 33 };
46 static const oid fdUsageOID
[] = { DNSDIST_STATS_OID
, 34 };
47 static const oid dynBlockedOID
[] = { DNSDIST_STATS_OID
, 35 };
48 static const oid dynBlockedNMGSizeOID
[] = { DNSDIST_STATS_OID
, 36 };
49 static const oid ruleServFailOID
[] = { DNSDIST_STATS_OID
, 37 };
51 static std::unordered_map
<oid
, DNSDistStats::entry_t
> s_statsMap
;
53 /* We are never called for a GETNEXT if it's registered as a
54 "instance", as it's "magically" handled for us. */
55 /* a instance handler also only hands us one request at a time, so
56 we don't need to loop over a list of requests; we'll only get one. */
58 static int handleCounter64Stats(netsnmp_mib_handler
* handler
,
59 netsnmp_handler_registration
* reginfo
,
60 netsnmp_agent_request_info
* reqinfo
,
61 netsnmp_request_info
* requests
)
63 if (reqinfo
->mode
!= MODE_GET
) {
64 return SNMP_ERR_GENERR
;
67 if (reginfo
->rootoid_len
!= OID_LENGTH(queriesOID
) + 1) {
68 return SNMP_ERR_GENERR
;
71 const auto& it
= s_statsMap
.find(reginfo
->rootoid
[reginfo
->rootoid_len
- 2]);
72 if (it
== s_statsMap
.end()) {
73 return SNMP_ERR_GENERR
;
76 if (const auto& val
= boost::get
<DNSDistStats::stat_t
*>(&it
->second
)) {
77 return DNSDistSNMPAgent::setCounter64Value(requests
, (*val
)->load());
80 return SNMP_ERR_GENERR
;
83 static void registerCounter64Stat(const char* name
, const oid statOID
[], size_t statOIDLength
, std::atomic
<uint64_t>* ptr
)
85 if (statOIDLength
!= OID_LENGTH(queriesOID
)) {
86 errlog("Invalid OID for SNMP Counter64 statistic %s", name
);
90 if (s_statsMap
.find(statOID
[statOIDLength
- 1]) != s_statsMap
.end()) {
91 errlog("OID for SNMP Counter64 statistic %s has already been registered", name
);
95 s_statsMap
[statOID
[statOIDLength
- 1]] = ptr
;
96 netsnmp_register_scalar(netsnmp_create_handler_registration(name
,
103 static int handleFloatStats(netsnmp_mib_handler
* handler
,
104 netsnmp_handler_registration
* reginfo
,
105 netsnmp_agent_request_info
* reqinfo
,
106 netsnmp_request_info
* requests
)
108 if (reqinfo
->mode
!= MODE_GET
) {
109 return SNMP_ERR_GENERR
;
112 if (reginfo
->rootoid_len
!= OID_LENGTH(queriesOID
) + 1) {
113 return SNMP_ERR_GENERR
;
116 const auto& it
= s_statsMap
.find(reginfo
->rootoid
[reginfo
->rootoid_len
- 2]);
117 if (it
== s_statsMap
.end()) {
118 return SNMP_ERR_GENERR
;
121 if (const auto& val
= boost::get
<double*>(&it
->second
)) {
122 std::string
str(std::to_string(**val
));
123 snmp_set_var_typed_value(requests
->requestvb
,
127 return SNMP_ERR_NOERROR
;
130 return SNMP_ERR_GENERR
;
133 static void registerFloatStat(const char* name
, const oid statOID
[], size_t statOIDLength
, double* ptr
)
135 if (statOIDLength
!= OID_LENGTH(queriesOID
)) {
136 errlog("Invalid OID for SNMP Float statistic %s", name
);
140 if (s_statsMap
.find(statOID
[statOIDLength
- 1]) != s_statsMap
.end()) {
141 errlog("OID for SNMP Float statistic %s has already been registered", name
);
145 s_statsMap
[statOID
[statOIDLength
- 1]] = ptr
;
146 netsnmp_register_scalar(netsnmp_create_handler_registration(name
,
153 static int handleGauge64Stats(netsnmp_mib_handler
* handler
,
154 netsnmp_handler_registration
* reginfo
,
155 netsnmp_agent_request_info
* reqinfo
,
156 netsnmp_request_info
* requests
)
158 if (reqinfo
->mode
!= MODE_GET
) {
159 return SNMP_ERR_GENERR
;
162 if (reginfo
->rootoid_len
!= OID_LENGTH(queriesOID
) + 1) {
163 return SNMP_ERR_GENERR
;
166 const auto& it
= s_statsMap
.find(reginfo
->rootoid
[reginfo
->rootoid_len
- 2]);
167 if (it
== s_statsMap
.end()) {
168 return SNMP_ERR_GENERR
;
172 uint64_t value
= (*boost::get
<DNSDistStats::statfunction_t
>(&it
->second
))(str
);
173 return DNSDistSNMPAgent::setCounter64Value(requests
, value
);
176 static void registerGauge64Stat(const char* name
, const oid statOID
[], size_t statOIDLength
, DNSDistStats::statfunction_t ptr
)
178 if (statOIDLength
!= OID_LENGTH(queriesOID
)) {
179 errlog("Invalid OID for SNMP Gauge64 statistic %s", name
);
183 if (s_statsMap
.find(statOID
[statOIDLength
- 1]) != s_statsMap
.end()) {
184 errlog("OID for SNMP Gauge64 statistic %s has already been registered", name
);
188 s_statsMap
[statOID
[statOIDLength
- 1]] = ptr
;
189 netsnmp_register_scalar(netsnmp_create_handler_registration(name
,
196 /* column number definitions for table backendStatTable */
197 #define COLUMN_BACKENDID 1
198 #define COLUMN_BACKENDNAME 2
199 #define COLUMN_BACKENDLATENCY 3
200 #define COLUMN_BACKENDWEIGHT 4
201 #define COLUMN_BACKENDOUTSTANDING 5
202 #define COLUMN_BACKENDQPSLIMIT 6
203 #define COLUMN_BACKENDREUSED 7
204 #define COLUMN_BACKENDSTATE 8
205 #define COLUMN_BACKENDADDRESS 9
206 #define COLUMN_BACKENDPOOLS 10
207 #define COLUMN_BACKENDQPS 11
208 #define COLUMN_BACKENDQUERIES 12
209 #define COLUMN_BACKENDORDER 13
211 static const oid backendStatTableOID
[] = { DNSDIST_STATS_TABLE_OID
};
212 static const oid backendNameOID
[] = { DNSDIST_STATS_TABLE_OID
, 1, 2 };
213 static const oid backendStateOID
[] = { DNSDIST_STATS_TABLE_OID
, 1, 8};
214 static const oid backendAddressOID
[] = { DNSDIST_STATS_TABLE_OID
, 1, 9};
216 static const oid socketFamilyOID
[] = { DNSDIST_TRAP_OBJECTS_OID
, 1, 0 };
217 static const oid socketProtocolOID
[] = { DNSDIST_TRAP_OBJECTS_OID
, 2, 0 };
218 static const oid fromAddressOID
[] = { DNSDIST_TRAP_OBJECTS_OID
, 3, 0 };
219 static const oid toAddressOID
[] = { DNSDIST_TRAP_OBJECTS_OID
, 4, 0 };
220 static const oid queryTypeOID
[] = { DNSDIST_TRAP_OBJECTS_OID
, 5, 0 };
221 static const oid querySizeOID
[] = { DNSDIST_TRAP_OBJECTS_OID
, 6, 0 };
222 static const oid queryIDOID
[] = { DNSDIST_TRAP_OBJECTS_OID
, 7, 0 };
223 static const oid qNameOID
[] = { DNSDIST_TRAP_OBJECTS_OID
, 8, 0 };
224 static const oid qClassOID
[] = { DNSDIST_TRAP_OBJECTS_OID
, 9, 0 };
225 static const oid qTypeOID
[] = { DNSDIST_TRAP_OBJECTS_OID
, 10, 0 };
226 static const oid trapReasonOID
[] = { DNSDIST_TRAP_OBJECTS_OID
, 11, 0 };
228 static const oid backendStatusChangeTrapOID
[] = { DNSDIST_TRAPS_OID
, 1 };
229 static const oid actionTrapOID
[] = { DNSDIST_TRAPS_OID
, 2 };
230 static const oid customTrapOID
[] = { DNSDIST_TRAPS_OID
, 3 };
232 static servers_t s_servers
;
233 static size_t s_currentServerIdx
= 0;
235 static netsnmp_variable_list
* backendStatTable_get_next_data_point(void** loop_context
,
236 void** my_data_context
,
237 netsnmp_variable_list
* put_index_data
,
238 netsnmp_iterator_info
* mydata
)
240 if (s_currentServerIdx
>= s_servers
.size()) {
244 *my_data_context
= (void*) (s_servers
[s_currentServerIdx
]).get();
245 snmp_set_var_typed_integer(put_index_data
, ASN_UNSIGNED
, s_currentServerIdx
);
246 s_currentServerIdx
++;
248 return put_index_data
;
251 static netsnmp_variable_list
* backendStatTable_get_first_data_point(void** loop_context
,
253 netsnmp_variable_list
* put_index_data
,
254 netsnmp_iterator_info
* data
)
256 s_currentServerIdx
= 0;
258 /* get a copy of the shared_ptrs so they are not
259 destroyed while we process the request */
260 const auto& dstates
= g_dstates
.getCopy();
262 s_servers
.reserve(dstates
.size());
263 for (const auto& server
: dstates
) {
264 s_servers
.push_back(server
);
267 return backendStatTable_get_next_data_point(loop_context
,
273 static int backendStatTable_handler(netsnmp_mib_handler
* handler
,
274 netsnmp_handler_registration
* reginfo
,
275 netsnmp_agent_request_info
* reqinfo
,
276 netsnmp_request_info
* requests
)
278 netsnmp_request_info
* request
;
280 switch (reqinfo
->mode
) {
282 for (request
= requests
; request
; request
= request
->next
) {
283 netsnmp_table_request_info
* table_info
= netsnmp_extract_table_info(request
);
284 const DownstreamState
* server
= (const DownstreamState
*) netsnmp_extract_iterator_context(request
);
290 switch (table_info
->colnum
) {
291 case COLUMN_BACKENDNAME
:
292 snmp_set_var_typed_value(request
->requestvb
,
294 server
->name
.c_str(),
295 server
->name
.size());
297 case COLUMN_BACKENDLATENCY
:
298 DNSDistSNMPAgent::setCounter64Value(request
,
299 server
->latencyUsec
/1000.0);
301 case COLUMN_BACKENDWEIGHT
:
302 DNSDistSNMPAgent::setCounter64Value(request
,
305 case COLUMN_BACKENDOUTSTANDING
:
306 DNSDistSNMPAgent::setCounter64Value(request
,
307 server
->outstanding
);
309 case COLUMN_BACKENDQPSLIMIT
:
310 DNSDistSNMPAgent::setCounter64Value(request
,
311 server
->qps
.getRate());
313 case COLUMN_BACKENDREUSED
:
314 DNSDistSNMPAgent::setCounter64Value(request
, server
->reuseds
);
316 case COLUMN_BACKENDSTATE
:
318 std::string
state(server
->getStatus());
319 snmp_set_var_typed_value(request
->requestvb
,
325 case COLUMN_BACKENDADDRESS
:
327 std::string
addr(server
->remote
.toStringWithPort());
328 snmp_set_var_typed_value(request
->requestvb
,
334 case COLUMN_BACKENDPOOLS
:
337 for(auto& p
: server
->pools
) {
342 snmp_set_var_typed_value(request
->requestvb
,
348 case COLUMN_BACKENDQPS
:
349 DNSDistSNMPAgent::setCounter64Value(request
, server
->queryLoad
);
351 case COLUMN_BACKENDQUERIES
:
352 DNSDistSNMPAgent::setCounter64Value(request
, server
->queries
);
354 case COLUMN_BACKENDORDER
:
355 DNSDistSNMPAgent::setCounter64Value(request
, server
->order
);
358 netsnmp_set_request_error(reqinfo
,
366 return SNMP_ERR_NOERROR
;
368 #endif /* HAVE_NET_SNMP */
370 bool DNSDistSNMPAgent::sendBackendStatusChangeTrap(const std::shared_ptr
<DownstreamState
> dss
)
373 const string backendAddress
= dss
->remote
.toStringWithPort();
374 const string backendStatus
= dss
->getStatus();
375 netsnmp_variable_list
* varList
= nullptr;
377 snmp_varlist_add_variable(&varList
,
381 backendStatusChangeTrapOID
,
382 OID_LENGTH(backendStatusChangeTrapOID
) * sizeof(oid
));
385 snmp_varlist_add_variable(&varList
,
387 OID_LENGTH(backendNameOID
),
392 snmp_varlist_add_variable(&varList
,
394 OID_LENGTH(backendAddressOID
),
396 backendAddress
.c_str(),
397 backendAddress
.size());
399 snmp_varlist_add_variable(&varList
,
401 OID_LENGTH(backendStateOID
),
403 backendStatus
.c_str(),
404 backendStatus
.size());
406 return sendTrap(d_trapPipe
[1], varList
);
407 #endif /* HAVE_NET_SNMP */
411 bool DNSDistSNMPAgent::sendCustomTrap(const std::string
& reason
)
414 netsnmp_variable_list
* varList
= nullptr;
416 snmp_varlist_add_variable(&varList
,
421 OID_LENGTH(customTrapOID
) * sizeof(oid
));
423 snmp_varlist_add_variable(&varList
,
425 OID_LENGTH(trapReasonOID
),
430 return sendTrap(d_trapPipe
[1], varList
);
431 #endif /* HAVE_NET_SNMP */
435 bool DNSDistSNMPAgent::sendDNSTrap(const DNSQuestion
& dq
, const std::string
& reason
)
438 std::string local
= dq
.local
->toString();
439 std::string remote
= dq
.remote
->toString();
440 std::string qname
= dq
.qname
->toStringNoDot();
441 const uint32_t socketFamily
= dq
.remote
->isIPv4() ? 1 : 2;
442 const uint32_t socketProtocol
= dq
.tcp
? 2 : 1;
443 const uint32_t queryType
= dq
.dh
->qr
? 2 : 1;
444 const uint32_t querySize
= (uint32_t) dq
.len
;
445 const uint32_t queryID
= (uint32_t) ntohs(dq
.dh
->id
);
446 const uint32_t qType
= (uint32_t) dq
.qtype
;
447 const uint32_t qClass
= (uint32_t) dq
.qclass
;
449 netsnmp_variable_list
* varList
= nullptr;
451 snmp_varlist_add_variable(&varList
,
456 OID_LENGTH(actionTrapOID
) * sizeof(oid
));
458 snmp_varlist_add_variable(&varList
,
460 OID_LENGTH(socketFamilyOID
),
462 (u_char
*) &socketFamily
,
463 sizeof(socketFamily
));
465 snmp_varlist_add_variable(&varList
,
467 OID_LENGTH(socketProtocolOID
),
469 (u_char
*) &socketProtocol
,
470 sizeof(socketProtocol
));
472 snmp_varlist_add_variable(&varList
,
474 OID_LENGTH(fromAddressOID
),
479 snmp_varlist_add_variable(&varList
,
481 OID_LENGTH(toAddressOID
),
486 snmp_varlist_add_variable(&varList
,
488 OID_LENGTH(queryTypeOID
),
490 (u_char
*) &queryType
,
493 snmp_varlist_add_variable(&varList
,
495 OID_LENGTH(querySizeOID
),
497 (u_char
*) &querySize
,
500 snmp_varlist_add_variable(&varList
,
502 OID_LENGTH(queryIDOID
),
507 snmp_varlist_add_variable(&varList
,
509 OID_LENGTH(qNameOID
),
514 snmp_varlist_add_variable(&varList
,
516 OID_LENGTH(qClassOID
),
521 snmp_varlist_add_variable(&varList
,
523 OID_LENGTH(qTypeOID
),
528 snmp_varlist_add_variable(&varList
,
530 OID_LENGTH(trapReasonOID
),
535 return sendTrap(d_trapPipe
[1], varList
);
536 #endif /* HAVE_NET_SNMP */
540 DNSDistSNMPAgent::DNSDistSNMPAgent(const std::string
& name
, const std::string
& masterSocket
): SNMPAgent(name
, masterSocket
)
544 registerCounter64Stat("queries", queriesOID
, OID_LENGTH(queriesOID
), &g_stats
.queries
);
545 registerCounter64Stat("responses", responsesOID
, OID_LENGTH(responsesOID
), &g_stats
.responses
);
546 registerCounter64Stat("servfailResponses", servfailResponsesOID
, OID_LENGTH(servfailResponsesOID
), &g_stats
.servfailResponses
);
547 registerCounter64Stat("aclDrops", aclDropsOID
, OID_LENGTH(aclDropsOID
), &g_stats
.aclDrops
);
548 registerCounter64Stat("ruleDrop", ruleDropOID
, OID_LENGTH(ruleDropOID
), &g_stats
.ruleDrop
);
549 registerCounter64Stat("ruleNXDomain", ruleNXDomainOID
, OID_LENGTH(ruleNXDomainOID
), &g_stats
.ruleNXDomain
);
550 registerCounter64Stat("ruleRefused", ruleRefusedOID
, OID_LENGTH(ruleRefusedOID
), &g_stats
.ruleRefused
);
551 registerCounter64Stat("ruleServFail", ruleServFailOID
, OID_LENGTH(ruleServFailOID
), &g_stats
.ruleServFail
);
552 registerCounter64Stat("selfAnswered", selfAnsweredOID
, OID_LENGTH(selfAnsweredOID
), &g_stats
.selfAnswered
);
553 registerCounter64Stat("downstreamTimeouts", downstreamTimeoutsOID
, OID_LENGTH(downstreamTimeoutsOID
), &g_stats
.downstreamTimeouts
);
554 registerCounter64Stat("downstreamSendErrors", downstreamSendErrorsOID
, OID_LENGTH(downstreamSendErrorsOID
), &g_stats
.downstreamSendErrors
);
555 registerCounter64Stat("truncFail", truncFailOID
, OID_LENGTH(truncFailOID
), &g_stats
.truncFail
);
556 registerCounter64Stat("noPolicy", noPolicyOID
, OID_LENGTH(noPolicyOID
), &g_stats
.noPolicy
);
557 registerCounter64Stat("latency0_1", latency0_1OID
, OID_LENGTH(latency0_1OID
), &g_stats
.latency0_1
);
558 registerCounter64Stat("latency1_10", latency1_10OID
, OID_LENGTH(latency1_10OID
), &g_stats
.latency1_10
);
559 registerCounter64Stat("latency10_50", latency10_50OID
, OID_LENGTH(latency10_50OID
), &g_stats
.latency10_50
);
560 registerCounter64Stat("latency50_100", latency50_100OID
, OID_LENGTH(latency50_100OID
), &g_stats
.latency50_100
);
561 registerCounter64Stat("latency100_1000", latency100_1000OID
, OID_LENGTH(latency100_1000OID
), &g_stats
.latency100_1000
);
562 registerCounter64Stat("latencySlow", latencySlowOID
, OID_LENGTH(latencySlowOID
), &g_stats
.latencySlow
);
563 registerCounter64Stat("nonCompliantQueries", nonCompliantQueriesOID
, OID_LENGTH(nonCompliantQueriesOID
), &g_stats
.nonCompliantQueries
);
564 registerCounter64Stat("nonCompliantResponses", nonCompliantResponsesOID
, OID_LENGTH(nonCompliantResponsesOID
), &g_stats
.nonCompliantResponses
);
565 registerCounter64Stat("rdQueries", rdQueriesOID
, OID_LENGTH(rdQueriesOID
), &g_stats
.rdQueries
);
566 registerCounter64Stat("emptyQueries", emptyQueriesOID
, OID_LENGTH(emptyQueriesOID
), &g_stats
.emptyQueries
);
567 registerCounter64Stat("cacheHits", cacheHitsOID
, OID_LENGTH(cacheHitsOID
), &g_stats
.cacheHits
);
568 registerCounter64Stat("cacheMisses", cacheMissesOID
, OID_LENGTH(cacheMissesOID
), &g_stats
.cacheMisses
);
569 registerCounter64Stat("dynBlocked", dynBlockedOID
, OID_LENGTH(dynBlockedOID
), &g_stats
.dynBlocked
);
570 registerFloatStat("latencyAvg100", latencyAvg100OID
, OID_LENGTH(latencyAvg100OID
), &g_stats
.latencyAvg100
);
571 registerFloatStat("latencyAvg1000", latencyAvg1000OID
, OID_LENGTH(latencyAvg1000OID
), &g_stats
.latencyAvg1000
);
572 registerFloatStat("latencyAvg10000", latencyAvg10000OID
, OID_LENGTH(latencyAvg10000OID
), &g_stats
.latencyAvg10000
);
573 registerFloatStat("latencyAvg1000000", latencyAvg1000000OID
, OID_LENGTH(latencyAvg1000000OID
), &g_stats
.latencyAvg1000000
);
574 registerGauge64Stat("uptime", uptimeOID
, OID_LENGTH(uptimeOID
), &uptimeOfProcess
);
575 registerGauge64Stat("realMemoryUsage", realMemoryUsageOID
, OID_LENGTH(realMemoryUsageOID
), &getRealMemoryUsage
);
576 registerGauge64Stat("cpuUserMSec", cpuUserMSecOID
, OID_LENGTH(cpuUserMSecOID
), &getCPUTimeUser
);
577 registerGauge64Stat("cpuSysMSec", cpuSysMSecOID
, OID_LENGTH(cpuSysMSecOID
), &getCPUTimeSystem
);
578 registerGauge64Stat("fdUsage", fdUsageOID
, OID_LENGTH(fdUsageOID
), &getOpenFileDescriptors
);
579 registerGauge64Stat("dynBlockedNMGSize", dynBlockedNMGSizeOID
, OID_LENGTH(dynBlockedNMGSizeOID
), [](const std::string
&) { return g_dynblockNMG
.getLocal()->size(); });
582 netsnmp_table_registration_info
* table_info
= SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info
);
583 netsnmp_table_helper_add_indexes(table_info
,
584 ASN_GAUGE
, /* index: backendId */
586 table_info
->min_column
= COLUMN_BACKENDNAME
;
587 table_info
->max_column
= COLUMN_BACKENDORDER
;
588 netsnmp_iterator_info
* iinfo
= SNMP_MALLOC_TYPEDEF(netsnmp_iterator_info
);
589 iinfo
->get_first_data_point
= backendStatTable_get_first_data_point
;
590 iinfo
->get_next_data_point
= backendStatTable_get_next_data_point
;
591 iinfo
->table_reginfo
= table_info
;
593 netsnmp_register_table_iterator(netsnmp_create_handler_registration("backendStatTable",
594 backendStatTable_handler
,
596 OID_LENGTH(backendStatTableOID
),
600 #endif /* HAVE_NET_SNMP */