### Description

From the nodes stats API, we should extract the `thread_pool` stats into their own endpoint. This endpoint can then be non-node-centric, and present a global view of the number of completed, rejected, and failed operations for each of the threadpools in the system.
server/src/test/java/org/elasticsearch/action/admin/cluster/node/stats/NodeStatsTests.java
randomLongBetween(0, maxStatValue),
                randomLongBetween(0, maxStatValue)
            );
            List<IngestStats.PipelineStat> ingestPipelineStats = new ArrayList<>(numPipelines);
            Map<String, List<IngestStats.ProcessorStat>> ingestProcessorStats = Maps.newMapWithExpectedSize(numPipelines);
            for (int i = 0; i < numPipelines; i++) {
                String pipelineId = randomAlphaOfLengthBetween(3, 10);
                ingestPipelineStats.add(
                    new IngestStats.PipelineStat(
                        pipelineId,
                        new IngestStats.Stats(
                            randomLongBetween(0, maxStatValue),
                            randomLongBetween(0, maxStatValue),
                            randomLongBetween(0, maxStatValue),
                            randomLongBetween(0, maxStatValue)
                        )
                    )
                );
                List<IngestStats.ProcessorStat> processorPerPipeline = new ArrayList<>(numProcessors);
                for (int j = 0; j < numProcessors; j++) {
                    IngestStats.Stats processorStats = new IngestStats.Stats(
                        randomLongBetween(0, maxStatValue),
                        randomLongBetween(0, maxStatValue),
                        randomLongBetween(0, maxStatValue),
                        randomLongBetween(0, maxStatValue)
                    );
                    processorPerPipeline.add(
                        new IngestStats.ProcessorStat(randomAlphaOfLengthBetween(3, 10), randomAlphaOfLengthBetween(3, 10), processorStats)
                    );
                }