collectd-nagios: Be more verbose before bailing out with usage().
[collectd.git] / src / collectd-nagios.c
index 1d989cb..b995b1c 100644 (file)
@@ -273,7 +273,7 @@ static void usage (const char *name)
                        "  -d <ds>        Select the DS to examine. May be repeated to examine multiple\n"
                        "                 DSes. By default all DSes are used.\n"
                        "  -g <consol>    Method to use to consolidate several DSes.\n"
-                       "                 Valid arguments are `none', `average' and `sum'\n"
+                       "                 See below for a list of valid arguments.\n"
                        "  -H <host>      Hostname to query the values for.\n"
                        "  -c <range>     Critical range\n"
                        "  -w <range>     Warning range\n"
@@ -284,6 +284,8 @@ static void usage (const char *name)
                        "  average:       Calculate the average of all matching DSes and apply the\n"
                        "                 warning- and critical-ranges to the calculated average.\n"
                        "  sum:           Apply the ranges to the sum of all DSes.\n"
+                       "  percentage:    Apply the ranges to the ratio (in percent) of the first value\n"
+                       "                 and the sum of all values."
                        "\n", name);
        exit (1);
 } /* void usage */
@@ -447,37 +449,54 @@ static int do_check_con_sum (size_t values_num,
        return (status_code);
 } /* int do_check_con_sum */
 
-static int do_check_con_percentage (int values_num, double *values, char **values_names)
+static int do_check_con_percentage (size_t values_num,
+               double *values, char **values_names)
 {
-        int i;
+       int i;
+       double sum = 0.0;
        double percentage;
 
-       if (values_num != 2)
-               return (RET_WARNING);
-       if (isnan (values[0]) || isnan (values[1]))
-               return (RET_WARNING);
-       if ((values[0] + values[1]) == 0)
-               return (RET_WARNING);
+       const char *status_str  = "UNKNOWN";
+       int         status_code = RET_UNKNOWN;
 
-        percentage = 100 * values[1] / ( values[0] + values[1] );
+       if ((values_num < 1) || (isnan (values[0])))
+       {
+               printf ("WARNING: The first value is not defined\n");
+               return (RET_WARNING);
+       }
 
-       printf ("%lf percentage |", percentage);
        for (i = 0; i < values_num; i++)
-               printf (" %s=%lf;;;;", values_names[i], values[i]);
+               if (!isnan (values[i]))
+                       sum += values[i];
+
+       if (sum == 0.0)
+       {
+               printf ("WARNING: Values sum up to zero\n");
+               return (RET_WARNING);
+       }
+
+       percentage = 100.0 * values[0] / sum;
 
        if (match_range (&range_critical_g, percentage) != 0)
        {
-               printf ("CRITICAL: percentage = %lf\n", percentage);
-               return (RET_CRITICAL);
+               status_str  = "CRITICAL";
+               status_code = RET_CRITICAL;
        }
        else if (match_range (&range_warning_g, percentage) != 0)
        {
-               printf ("WARNING: percentage = %lf\n", percentage);
-               return (RET_WARNING);
-        }
+               status_str  = "WARNING";
+               status_code = RET_WARNING;
+       }
+       else
+       {
+               status_str  = "OKAY";
+               status_code = RET_OKAY;
+       }
 
-        printf ("OKAY: percentage = %lf\n", percentage);
-        return (RET_OKAY);
+       printf ("%s: %lf percent |", status_str, percentage);
+       for (i = 0; i < values_num; i++)
+               printf (" %s=%lf;;;;", values_names[i], values[i]);
+       return (status_code);
 } /* int do_check_con_percentage */
 
 static int do_check (void)
@@ -598,7 +617,11 @@ int main (int argc, char **argv)
                                else if (strcasecmp (optarg, "percentage") == 0)
                                        consolitation_g = CON_PERCENTAGE;
                                else
+                               {
+                                       fprintf (stderr, "Unknown consolidation function `%s'.\n",
+                                                       optarg);
                                        usage (argv[0]);
+                               }
                                break;
                        case 'd':
                        {
@@ -630,7 +653,10 @@ int main (int argc, char **argv)
 
        if ((socket_file_g == NULL) || (value_string_g == NULL)
                        || (hostname_g == NULL))
+       {
+               fprintf (stderr, "Missing required arguments.\n");
                usage (argv[0]);
+       }
 
        return (do_check ());
 } /* int main */