@Override
  public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
    builder.field(
        "cluster_name", getClusterName().value(), XContentBuilder.FieldCaseConversion.NONE);

    builder.startObject("nodes");
    for (NodeInfo nodeInfo : this) {
      builder.startObject(nodeInfo.getNode().getId(), XContentBuilder.FieldCaseConversion.NONE);

      builder.field("name", nodeInfo.getNode().getName(), XContentBuilder.FieldCaseConversion.NONE);
      builder.field("transport_address", nodeInfo.getNode().getAddress().toString());
      builder.field(
          "host", nodeInfo.getNode().getHostName(), XContentBuilder.FieldCaseConversion.NONE);
      builder.field(
          "ip", nodeInfo.getNode().getHostAddress(), XContentBuilder.FieldCaseConversion.NONE);

      builder.field("version", nodeInfo.getVersion());
      builder.field("build_hash", nodeInfo.getBuild().shortHash());

      if (nodeInfo.getServiceAttributes() != null) {
        for (Map.Entry<String, String> nodeAttribute : nodeInfo.getServiceAttributes().entrySet()) {
          builder.field(
              nodeAttribute.getKey(),
              nodeAttribute.getValue(),
              XContentBuilder.FieldCaseConversion.NONE);
        }
      }

      builder.startArray("roles");
      for (DiscoveryNode.Role role : nodeInfo.getNode().getRoles()) {
        builder.value(role.getRoleName());
      }
      builder.endArray();

      if (!nodeInfo.getNode().getAttributes().isEmpty()) {
        builder.startObject("attributes");
        for (Map.Entry<String, String> entry : nodeInfo.getNode().getAttributes().entrySet()) {
          builder.field(entry.getKey(), entry.getValue(), XContentBuilder.FieldCaseConversion.NONE);
        }
        builder.endObject();
      }

      if (nodeInfo.getSettings() != null) {
        builder.startObject("settings");
        Settings settings = nodeInfo.getSettings();
        settings.toXContent(builder, params);
        builder.endObject();
      }

      if (nodeInfo.getOs() != null) {
        nodeInfo.getOs().toXContent(builder, params);
      }
      if (nodeInfo.getProcess() != null) {
        nodeInfo.getProcess().toXContent(builder, params);
      }
      if (nodeInfo.getJvm() != null) {
        nodeInfo.getJvm().toXContent(builder, params);
      }
      if (nodeInfo.getThreadPool() != null) {
        nodeInfo.getThreadPool().toXContent(builder, params);
      }
      if (nodeInfo.getTransport() != null) {
        nodeInfo.getTransport().toXContent(builder, params);
      }
      if (nodeInfo.getHttp() != null) {
        nodeInfo.getHttp().toXContent(builder, params);
      }
      if (nodeInfo.getPlugins() != null) {
        nodeInfo.getPlugins().toXContent(builder, params);
      }
      if (nodeInfo.getIngest() != null) {
        nodeInfo.getIngest().toXContent(builder, params);
      }

      builder.endObject();
    }
    builder.endObject();
    return builder;
  }