@Override
  public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
    builder.field(Fields.STATUS, getStatus().name().toLowerCase(Locale.ROOT));
    builder.field(Fields.NUMBER_OF_SHARDS, getNumberOfShards());
    builder.field(Fields.NUMBER_OF_REPLICAS, getNumberOfReplicas());
    builder.field(Fields.ACTIVE_PRIMARY_SHARDS, getActivePrimaryShards());
    builder.field(Fields.ACTIVE_SHARDS, getActiveShards());
    builder.field(Fields.RELOCATING_SHARDS, getRelocatingShards());
    builder.field(Fields.INITIALIZING_SHARDS, getInitializingShards());
    builder.field(Fields.UNASSIGNED_SHARDS, getUnassignedShards());

    if (!getValidationFailures().isEmpty()) {
      builder.startArray(Fields.VALIDATION_FAILURES);
      for (String validationFailure : getValidationFailures()) {
        builder.value(validationFailure);
      }
      builder.endArray();
    }

    if ("shards".equals(params.param("level", "indices"))) {
      builder.startObject(Fields.SHARDS);

      for (ClusterShardHealth shardHealth : shards.values()) {
        builder.startObject(Integer.toString(shardHealth.getId()));

        builder.field(Fields.STATUS, shardHealth.getStatus().name().toLowerCase(Locale.ROOT));
        builder.field(Fields.PRIMARY_ACTIVE, shardHealth.isPrimaryActive());
        builder.field(Fields.ACTIVE_SHARDS, shardHealth.getActiveShards());
        builder.field(Fields.RELOCATING_SHARDS, shardHealth.getRelocatingShards());
        builder.field(Fields.INITIALIZING_SHARDS, shardHealth.getInitializingShards());
        builder.field(Fields.UNASSIGNED_SHARDS, shardHealth.getUnassignedShards());

        builder.endObject();
      }

      builder.endObject();
    }
    return builder;
  }