This diff adds the two entries from the hrSWRunPerfTable:
hrSWRunPerfCPU, and hrSWRunPerfMem. This allows snmptop from the
net-snmp package to work. Math stolen^Wcopied from top/machine.c.

OK?

martijn@

Index: mib.c
===================================================================
RCS file: /cvs/src/libexec/snmpd/snmpd_metrics/mib.c,v
retrieving revision 1.4
diff -u -p -r1.4 mib.c
--- mib.c       4 Jul 2023 11:34:19 -0000       1.4
+++ mib.c       18 Oct 2023 09:52:07 -0000
@@ -69,6 +69,10 @@ struct event          connev;
 const char             *agentxsocket = NULL;
 int                     agentxfd = -1;
 
+int                     pageshift;
+#define pagetok(size) ((size) << pageshift)
+
+void            pageshift_init(void);
 void            snmp_connect(struct agentx *, void *, int);
 void            snmp_tryconnect(int, short, void *);
 void            snmp_read(int, short, void *);
@@ -89,6 +93,7 @@ struct agentx_object *hrProcessorLoad;
 struct agentx_index *hrSWRunIdx;
 struct agentx_object *hrSWRunIndex, *hrSWRunName, *hrSWRunID, *hrSWRunPath;
 struct agentx_object *hrSWRunParameters, *hrSWRunType, *hrSWRunStatus;
+struct agentx_object *hrSWRunPerfCPU, *hrSWRunPerfMem;
 
 void    mib_hrsystemuptime(struct agentx_varbind *);
 void    mib_hrsystemdate(struct agentx_varbind *);
@@ -634,6 +639,7 @@ mib_hrswrun(struct agentx_varbind *vb)
        struct agentx_object            *obj;
        enum agentx_request_type         req;
        int32_t                          idx;
+       int32_t                          time;
        struct kinfo_proc               *kinfo;
        char                            *s;
 
@@ -711,6 +717,13 @@ mib_hrswrun(struct agentx_varbind *vb)
                        agentx_varbind_integer(vb, 4);
                        break;
                }
+       } else if (obj == hrSWRunPerfCPU) {
+               time = kinfo->p_rtime_sec * 100;
+               time += (kinfo->p_rtime_usec + 5000) / 10000;
+               agentx_varbind_integer(vb, time);
+       } else if (obj == hrSWRunPerfMem) {
+               agentx_varbind_integer(vb, pagetok(kinfo->p_vm_tsize +
+                   kinfo->p_vm_dsize + kinfo->p_vm_ssize));
        } else
                fatal("%s: Unexpected object", __func__);
 }
@@ -3278,6 +3291,7 @@ main(int argc, char *argv[])
        kr_init();
        pf_init();
        timer_init();
+       pageshift_init();
 
        if (agentxsocket != NULL) {
                if (strlcpy(agentxsocketdir, agentxsocket,
@@ -3375,6 +3389,10 @@ main(int argc, char *argv[])
            (hrSWRunType = agentx_object(host, AGENTX_OID(HRSWRUNTYPE),
            &hrSWRunIdx, 1, 0, mib_hrswrun)) == NULL ||
            (hrSWRunStatus = agentx_object(host, AGENTX_OID(HRSWRUNSTATUS),
+           &hrSWRunIdx, 1, 0, mib_hrswrun)) == NULL ||
+           (hrSWRunPerfCPU = agentx_object(host, AGENTX_OID(HRSWRUNPERFCPU),
+           &hrSWRunIdx, 1, 0, mib_hrswrun)) == NULL ||
+           (hrSWRunPerfMem = agentx_object(host, AGENTX_OID(HRSWRUNPERFMEM),
            &hrSWRunIdx, 1, 0, mib_hrswrun)) == NULL)
                fatal("agentx_object");
 
@@ -4318,6 +4336,22 @@ main(int argc, char *argv[])
        log_setverbose(verbose);
 
        event_dispatch();
+}
+
+#define LOG1024                 10
+void
+pageshift_init(void)
+{
+       long pagesize;
+
+       if ((pagesize = sysconf(_SC_PAGESIZE)) == -1)
+               fatal("sysconf(_SC_PAGESIZE)");
+       while (pagesize > 1) {
+               pageshift++;
+               pagesize >>= 1;
+       }
+       /* we only need the amount of log(2)1024 for our conversion */
+       pageshift -= LOG1024;
 }
 
 void

Reply via email to