afsmonitor: add fs callback xstats collection
[openafs.git] / src / afsmonitor / afsmon-output.c
index 7b4cb37..a6e8447 100644 (file)
@@ -21,8 +21,6 @@
 #include <afs/param.h>
 #include <string.h>
 
-RCSID
-    ("$Header$");
 
 #include <afs/xstat_fs.h>
 #include <afs/xstat_cm.h>
@@ -86,6 +84,25 @@ static char *xferOpNames[] = {
     "StoreData"
 };
 
+static char *CbCounterStrings[] = {
+    "DeleteFiles",
+    "DeleteCallBacks",
+    "BreakCallBacks",
+    "AddCallBack",
+    "GotSomeSpaces",
+    "DeleteAllCallBacks",
+    "nFEs",
+    "nCBs",
+    "nblks",
+    "CBsTimedOut",
+    "nbreakers",
+    "GSS1",
+    "GSS2",
+    "GSS3",
+    "GSS4",
+    "GSS5"
+};
+
 /*________________________________________________________________________
                                FS STATS ROUTINES 
  *_______________________________________________________________________*/
@@ -255,11 +272,11 @@ Print_fs_OpTiming(int a_opIdx, struct fs_stats_opTimingData *a_opTimeP)
 {                              /*Print_fs_OpTiming */
 
     fprintf(fs_outFD,
-           "%15s: %d ops (%d OK); sum=%d.%06d, min=%d.%06d, max=%d.%06d\n",
+           "%15s: %d ops (%d OK); sum=%ld.%06ld, min=%ld.%06ld, max=%ld.%06ld\n",
            fsOpNames[a_opIdx], a_opTimeP->numOps, a_opTimeP->numSuccesses,
-           a_opTimeP->sumTime.tv_sec, a_opTimeP->sumTime.tv_usec,
-           a_opTimeP->minTime.tv_sec, a_opTimeP->minTime.tv_usec,
-           a_opTimeP->maxTime.tv_sec, a_opTimeP->maxTime.tv_usec);
+           (long)a_opTimeP->sumTime.tv_sec, (long)a_opTimeP->sumTime.tv_usec,
+           (long)a_opTimeP->minTime.tv_sec, (long)a_opTimeP->minTime.tv_usec,
+           (long)a_opTimeP->maxTime.tv_sec, (long)a_opTimeP->maxTime.tv_usec);
 
 }                              /*Print_fs_OpTiming */
 
@@ -289,11 +306,11 @@ Print_fs_XferTiming(int a_opIdx, struct fs_stats_xferData *a_xferP)
 {                              /*Print_fs_XferTiming */
 
     fprintf(fs_outFD,
-           "%s: %d xfers (%d OK), time sum=%d.%06d, min=%d.%06d, max=%d.%06d\n",
+           "%s: %d xfers (%d OK), time sum=%ld.%06ld, min=%ld.%06ld, max=%ld.%06ld\n",
            xferOpNames[a_opIdx], a_xferP->numXfers, a_xferP->numSuccesses,
-           a_xferP->sumTime.tv_sec, a_xferP->sumTime.tv_usec,
-           a_xferP->minTime.tv_sec, a_xferP->minTime.tv_usec,
-           a_xferP->maxTime.tv_sec, a_xferP->maxTime.tv_usec);
+           (long)a_xferP->sumTime.tv_sec, (long)a_xferP->sumTime.tv_usec,
+           (long)a_xferP->minTime.tv_sec, (long)a_xferP->minTime.tv_usec,
+           (long)a_xferP->maxTime.tv_sec, (long)a_xferP->maxTime.tv_usec);
     fprintf(fs_outFD, "\t[bytes: sum=%d, min=%d, max=%d]\n",
            a_xferP->sumBytes, a_xferP->minBytes, a_xferP->maxBytes);
     fprintf(fs_outFD,
@@ -330,7 +347,7 @@ Print_fs_DetailedPerfInfo(struct fs_stats_DetailedStats *a_detP)
 
     int currIdx;               /*Loop variable */
 
-    fprintf(fs_outFD, "\t%10d epoch\n", a_detP->epoch);
+    fprintf(fs_outFD, "\t%10ld epoch\n", (long)a_detP->epoch.tv_sec);
 
     for (currIdx = 0; currIdx < FS_STATS_NUM_RPC_OPS; currIdx++)
        Print_fs_OpTiming(currIdx, &(a_detP->rpcOpTimes[currIdx]));
@@ -370,14 +387,6 @@ Print_fs_FullPerfInfo(struct xstat_fs_ProbeResults *a_fs_Results)
     char *printableTime;       /*Ptr to printable time string */
     time_t probeTime;
 
-    numLongs = a_fs_Results->data.AFS_CollData_len;
-    if (numLongs != fullPerfLongs) {
-       fprintf(fs_outFD,
-               " ** Data size mismatch in full performance collection!\n");
-       fprintf(fs_outFD, " ** Expecting %d, got %d\n", fullPerfLongs,
-               numLongs);
-       return;
-    }
 
     probeTime = a_fs_Results->probeTime;
     printableTime = ctime(&probeTime);
@@ -390,11 +399,68 @@ Print_fs_FullPerfInfo(struct xstat_fs_ProbeResults *a_fs_Results)
            a_fs_Results->collectionNumber, a_fs_Results->connP->hostName,
            a_fs_Results->probeNum, printableTime);
 
-    Print_fs_OverallPerfInfo(&(fullPerfP->overall));
-    Print_fs_DetailedPerfInfo(&(fullPerfP->det));
+    numLongs = a_fs_Results->data.AFS_CollData_len;
+    if (numLongs != fullPerfLongs) {
+       fprintf(fs_outFD,
+               " ** Data size mismatch in full performance collection!\n");
+       fprintf(fs_outFD, " ** Expecting %d, got %d\n", fullPerfLongs,
+               numLongs);
+
+       /* Unfortunately, the full perf stats contain timeval structures which
+        * do not have the same size everywhere. At least try to print
+        * the overall stats.
+        */
+       if (numLongs >= (sizeof(struct afs_stats_CMPerf) / sizeof(afs_int32))) {
+           Print_fs_OverallPerfInfo(&(fullPerfP->overall));
+       }
+    } else {
+       Print_fs_OverallPerfInfo(&(fullPerfP->overall));
+       Print_fs_DetailedPerfInfo(&(fullPerfP->det));
+    }
 
 }                              /*Print_fs_FullPerfInfo */
 
+/*------------------------------------------------------------------------
+ * Print_fs_CallbackStats
+ *
+ * Description:
+ *     Print out the AFS_XSTATSCOLL_CBSTATS collection we just
+ *     received.
+ *
+ * Arguments:
+ *     None.
+ *
+ * Returns:
+ *     Nothing.
+ *
+ * Environment:
+ *     All the info we need is nestled into xstat_fs_Results.
+ *
+ * Side Effects:
+ *     As advertised.
+ *------------------------------------------------------------------------*/
+void
+Print_fs_CallBackStats(struct xstat_fs_ProbeResults *a_fs_Results)
+{
+    char *printableTime;
+    time_t probeTime;
+    int numInt32s = xstat_fs_Results.data.AFS_CollData_len;
+    afs_int32 *val = xstat_fs_Results.data.AFS_CollData_val;
+    int i;
+
+    probeTime = a_fs_Results->probeTime;
+    printableTime = ctime(&probeTime);
+    printableTime[strlen(printableTime) - 1] = '\0';
+    fprintf(fs_outFD,
+           "AFS_XSTATSCOLL_CBSTATS (coll %d) for FS %s\n[Probe %d, %s]\n\n",
+           a_fs_Results->collectionNumber, a_fs_Results->connP->hostName,
+           a_fs_Results->probeNum, printableTime);
+
+    numInt32s = min(numInt32s, sizeof(CbCounterStrings)/sizeof(*CbCounterStrings));
+    for (i=0; i<numInt32s; i++) {
+       fprintf(fs_outFD, "\t%10u %s\n", val[i], CbCounterStrings[i]);
+    }
+}                              /*Print_fs_CallbackStats */
 
 /*------------------------------------------------------------------------
  * afsmon_fsOutput()
@@ -470,8 +536,15 @@ afsmon_fsOutput(char *a_outfile,   /* ptr to output file name */
 
     /* print detailed information */
     if (a_detOutput) {
-       Print_fs_FullPerfInfo(&xstat_fs_Results);
-       fflush(fs_outFD);
+       if (xstat_fs_Results.collectionNumber ==
+           AFS_XSTATSCOLL_FULL_PERF_INFO) {
+           Print_fs_FullPerfInfo(&xstat_fs_Results);
+           fflush(fs_outFD);
+       } else if (xstat_fs_Results.collectionNumber ==
+                  AFS_XSTATSCOLL_CBSTATS) {
+           Print_fs_CallBackStats(&xstat_fs_Results);
+           fflush(fs_outFD);
+       }
     }
 
     if (fclose(fs_outFD))
@@ -738,11 +811,11 @@ Print_cm_OpTiming(int a_opIdx, char *a_opNames[],
 {                              /*Print_cm_OpTiming */
 
     fprintf(cm_outFD,
-           "%15s: %d ops (%d OK); sum=%d.%06d, min=%d.%06d, max=%d.%06d\n",
+           "%15s: %d ops (%d OK); sum=%ld.%06ld, min=%ld.%06ld, max=%ld.%06ld\n",
            a_opNames[a_opIdx], a_opTimeP->numOps, a_opTimeP->numSuccesses,
-           a_opTimeP->sumTime.tv_sec, a_opTimeP->sumTime.tv_usec,
-           a_opTimeP->minTime.tv_sec, a_opTimeP->minTime.tv_usec,
-           a_opTimeP->maxTime.tv_sec, a_opTimeP->maxTime.tv_usec);
+           (long)a_opTimeP->sumTime.tv_sec, (long)a_opTimeP->sumTime.tv_usec,
+           (long)a_opTimeP->minTime.tv_sec, (long)a_opTimeP->minTime.tv_usec,
+           (long)a_opTimeP->maxTime.tv_sec, (long)a_opTimeP->maxTime.tv_usec);
 
 }                              /*Print_cm_OpTiming */
 
@@ -773,11 +846,11 @@ Print_cm_XferTiming(int a_opIdx, char *a_opNames[],
 {                              /*Print_cm_XferTiming */
 
     fprintf(cm_outFD,
-           "%s: %d xfers (%d OK), time sum=%d.%06d, min=%d.%06d, max=%d.%06d\n",
+           "%s: %d xfers (%d OK), time sum=%ld.%06ld, min=%ld.%06ld, max=%ld.%06ld\n",
            a_opNames[a_opIdx], a_xferP->numXfers, a_xferP->numSuccesses,
-           a_xferP->sumTime.tv_sec, a_xferP->sumTime.tv_usec,
-           a_xferP->minTime.tv_sec, a_xferP->minTime.tv_usec,
-           a_xferP->maxTime.tv_sec, a_xferP->maxTime.tv_usec);
+           (long)a_xferP->sumTime.tv_sec, (long)a_xferP->sumTime.tv_usec,
+           (long)a_xferP->minTime.tv_sec, (long)a_xferP->minTime.tv_usec,
+           (long)a_xferP->maxTime.tv_sec, (long)a_xferP->maxTime.tv_usec);
     fprintf(cm_outFD, "\t[bytes: sum=%d, min=%d, max=%d]\n",
            a_xferP->sumBytes, a_xferP->minBytes, a_xferP->maxBytes);
     fprintf(cm_outFD,