We have a check that enforces the total number of fields needs to be below a certain (configurable) threshold in each index. 

Runtime fields currently do not contribute to the count. There have been misunderstandings around this, caused by runtime fields not having a corresponding lucene field. Object fields and alias fields don't have corresponding lucene fields either yet they count towards the total fields limit.

The original goal of the total fields limit is to prevent a mappings explosion caused by a bogus document being indexed, as it would cause fields being dynamically added to the index mappings, which hinders stability due to the cluster state size of mappings as well as memory footprint of mappings in data nodes.

Runtime fields contribute to cluster state size and memory footprint of mappings like any other field, and they can be created dynamically when [`dynamic` is set to `runtime`](https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic.html#dynamic-parameters). Currently a bogus document can cause a mappings explosion when `dynamic` is set to `runtime` which is a bug. For this reason runtime fields should be counted towards the total fields count.
server/src/main/java/org/elasticsearch/index/mapper/MappingLookup.java
private CacheKey() {}
    }
    /**
     * A lookup representing an empty mapping. It can be used to look up fields, although it won't hold any, but it does not
     * hold a valid {@link DocumentParser}, {@link IndexSettings} or {@link IndexAnalyzers}.
     */
    public static final MappingLookup EMPTY = fromMappers(Mapping.EMPTY, List.of(), List.of(), List.of());
    private final CacheKey cacheKey = new CacheKey();
    
    private final Map<String, Mapper> fieldMappers;
    private final Map<String, ObjectMapper> objectMappers;
    private final NestedLookup nestedLookup;
    private final FieldTypeLookup fieldTypeLookup;
    private final FieldTypeLookup indexTimeLookup;  
    private final Map<String, NamedAnalyzer> indexAnalyzersMap;
    private final List<FieldMapper> indexTimeScriptMappers;
    private final Mapping mapping;
    private final Set<String> completionFields;
    /**
     * Creates a new {@link MappingLookup} instance by parsing the provided mapping and extracting its field definitions.
     *
     * @param mapping the mapping source
     * @return the newly created lookup instance
     */
    public static MappingLookup fromMapping(Mapping mapping) {
        List<ObjectMapper> newObjectMappers = new ArrayList<>();
        List<FieldMapper> newFieldMappers = new ArrayList<>();
        List<FieldAliasMapper> newFieldAliasMappers = new ArrayList<>();
        for (MetadataFieldMapper metadataMapper : mapping.getSortedMetadataMappers()) {
            if (metadataMapper != null) {