mirror of
https://github.com/ibm-s390-linux/s390-tools.git
synced 2026-08-05 02:14:52 +00:00
zpcimon: Allow setting output format and use JSON Lines in systemd unit
Introduce separate '--format' option to set output format. Use the new JSON Lines format explicitly in the systemd unit. Since JSON Lines format only uses printable characters this removes the need for passing '-a' to systemctl status. At the same time JSON-SEQ is more easily parsable using 'jq --seq' so keep it the default for easier scripting. Reviewed-by: Jan Höppner <hoeppner@linux.ibm.com> Signed-off-by: Niklas Schnelle <schnelle@linux.ibm.com> Signed-off-by: Jan Höppner <hoeppner@linux.ibm.com>
This commit is contained in:
committed by
Jan Höppner
parent
8a4a4e0557
commit
2c63c69af4
@@ -13,7 +13,7 @@ Description=Monitor health of directly attached PCI NIC optical modules
|
|||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=exec
|
Type=exec
|
||||||
ExecStart=@usrsbin_path@/zpcimon --send-report --monitor --interval 86400
|
ExecStart=@usrsbin_path@/zpcimon --send-report --monitor --format jsonl --interval 86400
|
||||||
KillMode=control-group
|
KillMode=control-group
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
|
|||||||
@@ -84,6 +84,14 @@ on".
|
|||||||
.PP
|
.PP
|
||||||
.PP
|
.PP
|
||||||
.
|
.
|
||||||
|
.SS Output Format Options
|
||||||
|
.OD format "" <FORMAT>
|
||||||
|
Set the output format out of json, json-seq, jsonl, pairs, and csv. Note that
|
||||||
|
only json-seq and jsonl sequence formats are supported for monitoring mode as
|
||||||
|
they handle a continuous stream of updates well. While they are not supported
|
||||||
|
in query mode.
|
||||||
|
.PP
|
||||||
|
.
|
||||||
.SS General Options
|
.SS General Options
|
||||||
.OD help "h" ""
|
.OD help "h" ""
|
||||||
Print usage information, then exit.
|
Print usage information, then exit.
|
||||||
|
|||||||
@@ -40,6 +40,8 @@ struct options {
|
|||||||
bool report;
|
bool report;
|
||||||
bool module_info;
|
bool module_info;
|
||||||
bool quiet;
|
bool quiet;
|
||||||
|
enum util_fmt_t format;
|
||||||
|
bool explicit_format;
|
||||||
|
|
||||||
uint32_t interval_seconds;
|
uint32_t interval_seconds;
|
||||||
};
|
};
|
||||||
@@ -63,6 +65,7 @@ static const struct util_prg prg = {
|
|||||||
|
|
||||||
static void parse_cmdline(int argc, char *argv[], struct options *opts)
|
static void parse_cmdline(int argc, char *argv[], struct options *opts)
|
||||||
{
|
{
|
||||||
|
enum util_fmt_t fmt;
|
||||||
uint32_t seconds;
|
uint32_t seconds;
|
||||||
int cmd, ret;
|
int cmd, ret;
|
||||||
|
|
||||||
@@ -85,6 +88,12 @@ static void parse_cmdline(int argc, char *argv[], struct options *opts)
|
|||||||
case OPT_DUMP:
|
case OPT_DUMP:
|
||||||
opts->module_info = true;
|
opts->module_info = true;
|
||||||
break;
|
break;
|
||||||
|
case OPT_FORMAT:
|
||||||
|
if (!util_fmt_name_to_type(optarg, &fmt))
|
||||||
|
errx(EXIT_FAILURE, "Unknown format %s", optarg);
|
||||||
|
opts->format = fmt;
|
||||||
|
opts->explicit_format = true;
|
||||||
|
break;
|
||||||
case 'i':
|
case 'i':
|
||||||
ret = sscanf(optarg, "%u", &seconds);
|
ret = sscanf(optarg, "%u", &seconds);
|
||||||
if (ret != 1) {
|
if (ret != 1) {
|
||||||
@@ -224,7 +233,7 @@ static void dump_all_adapter_data(struct opticsmon_ctx *ctx)
|
|||||||
|
|
||||||
static int oneshot_mode(struct opticsmon_ctx *ctx)
|
static int oneshot_mode(struct opticsmon_ctx *ctx)
|
||||||
{
|
{
|
||||||
util_fmt_init(stdout, FMT_JSON, FMT_DEFAULT, API_LEVEL);
|
util_fmt_init(stdout, ctx->opts.format, FMT_DEFAULT, API_LEVEL);
|
||||||
if (!ctx->opts.quiet)
|
if (!ctx->opts.quiet)
|
||||||
util_fmt_obj_start(FMT_LIST, "adapters");
|
util_fmt_obj_start(FMT_LIST, "adapters");
|
||||||
dump_all_adapter_data(ctx);
|
dump_all_adapter_data(ctx);
|
||||||
@@ -375,7 +384,7 @@ static int monitor_mode(struct opticsmon_ctx *ctx)
|
|||||||
goto close_timerfd;
|
goto close_timerfd;
|
||||||
}
|
}
|
||||||
|
|
||||||
util_fmt_init(stdout, FMT_JSONSEQ, FMT_DEFAULT, API_LEVEL);
|
util_fmt_init(stdout, ctx->opts.format, FMT_DEFAULT, API_LEVEL);
|
||||||
ret = link_mon_nl_waitfd_create(&ctx->lctx, on_link_change, ctx);
|
ret = link_mon_nl_waitfd_create(&ctx->lctx, on_link_change, ctx);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
fprintf(stderr, "Failed to create link monitoring socket\n");
|
fprintf(stderr, "Failed to create link monitoring socket\n");
|
||||||
@@ -393,12 +402,42 @@ close_timerfd:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool is_supported_fmt(enum util_fmt_t fmt, bool monitor)
|
||||||
|
{
|
||||||
|
switch (fmt) {
|
||||||
|
case FMT_JSON:
|
||||||
|
case FMT_PAIRS:
|
||||||
|
return monitor ? false : true;
|
||||||
|
case FMT_JSONL:
|
||||||
|
case FMT_JSONSEQ:
|
||||||
|
return monitor ? true : false;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_format(struct options *opts)
|
||||||
|
{
|
||||||
|
if (!opts->explicit_format)
|
||||||
|
opts->format = (opts->monitor) ? FMT_JSONSEQ : FMT_JSON;
|
||||||
|
|
||||||
|
if (!is_supported_fmt(opts->format, opts->monitor)) {
|
||||||
|
warnx("Format %s is not supported in %s mode",
|
||||||
|
util_fmt_type_to_name(opts->format), (opts->monitor) ? "monitor" : "query");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
struct opticsmon_ctx ctx = { .opts = { .interval_seconds = 86400 } };
|
struct opticsmon_ctx ctx = { .opts = { .interval_seconds = 86400 } };
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
parse_cmdline(argc, argv, &ctx.opts);
|
parse_cmdline(argc, argv, &ctx.opts);
|
||||||
|
ret = set_format(&ctx.opts);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
ret = ethtool_nl_connect(&ctx.ethtool_ctx);
|
ret = ethtool_nl_connect(&ctx.ethtool_ctx);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
@@ -7,9 +7,11 @@
|
|||||||
#ifndef OPTICSMON_CLI_H
|
#ifndef OPTICSMON_CLI_H
|
||||||
#define OPTICSMON_CLI_H
|
#define OPTICSMON_CLI_H
|
||||||
|
|
||||||
|
#include "lib/util_fmt.h"
|
||||||
#include "lib/util_opt.h"
|
#include "lib/util_opt.h"
|
||||||
|
|
||||||
#define OPT_DUMP 128
|
#define OPT_DUMP 128
|
||||||
|
#define OPT_FORMAT 129
|
||||||
|
|
||||||
static struct util_opt opt_vec[] = {
|
static struct util_opt opt_vec[] = {
|
||||||
UTIL_OPT_SECTION("OPERATION OPTIONS"),
|
UTIL_OPT_SECTION("OPERATION OPTIONS"),
|
||||||
@@ -41,6 +43,13 @@ static struct util_opt opt_vec[] = {
|
|||||||
"in the absence of link state changes. A value larger than "
|
"in the absence of link state changes. A value larger than "
|
||||||
"24 hours (86400 seconds) is clamped down to 24 hours.",
|
"24 hours (86400 seconds) is clamped down to 24 hours.",
|
||||||
},
|
},
|
||||||
|
UTIL_OPT_SECTION("OUTPUT FORMAT OPTIONS"),
|
||||||
|
{
|
||||||
|
.option = { "format", required_argument, NULL, OPT_FORMAT },
|
||||||
|
.argument = "FORMAT",
|
||||||
|
.flags = UTIL_OPT_FLAG_NOSHORT,
|
||||||
|
.desc = "Output format (" FMT_TYPE_NAMES ")",
|
||||||
|
},
|
||||||
UTIL_OPT_SECTION("GENERAL OPTIONS"),
|
UTIL_OPT_SECTION("GENERAL OPTIONS"),
|
||||||
UTIL_OPT_HELP,
|
UTIL_OPT_HELP,
|
||||||
UTIL_OPT_VERSION,
|
UTIL_OPT_VERSION,
|
||||||
|
|||||||
Reference in New Issue
Block a user