/** * Copyright 2017 Netflix, Inc. * <p> * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * <p> * http://www.apache.org/licenses/LICENSE-2.0 * <p> * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.netflix.raigad.monitoring; import com.google.inject.Inject; import com.google.inject.Singleton; import com.netflix.raigad.configuration.IConfiguration; import com.netflix.raigad.scheduler.SimpleTimer; import com.netflix.raigad.scheduler.Task; import com.netflix.raigad.scheduler.TaskTimer; import com.netflix.raigad.utils.ElasticsearchProcessMonitor; import com.netflix.raigad.utils.ElasticsearchTransportClient; import com.netflix.servo.annotations.DataSourceType; import com.netflix.servo.annotations.Monitor; import com.netflix.servo.monitor.Monitors; import org.elasticsearch.action.admin.cluster.node.stats.NodeStats; import org.elasticsearch.action.admin.cluster.node.stats.NodesStatsResponse; import org.elasticsearch.indices.NodeIndicesStats; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.List; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; /** * Note: percentiles over average latencies * <p> * Currently ES provides only cumulative query & index time along with cumulative query & index count. * Hence percentile values are calculated based on the average between consecutive time * (t1 & t2, t2 & t3, ... , tn-1 & tn) of metrics collection. */ @Singleton public class NodeIndicesStatsMonitor extends Task { private static final Logger logger = LoggerFactory.getLogger(NodeIndicesStatsMonitor.class); public static final String METRIC_NAME = "Elasticsearch_NodeIndicesMonitor"; private final Elasticsearch_NodeIndicesStatsReporter nodeIndicesStatsReporter; private final EstimatedHistogram latencySearchQuery95Histo = new EstimatedHistogram(); private final EstimatedHistogram latencySearchQuery99Histo = new EstimatedHistogram(); private final EstimatedHistogram latencySearchFetch95Histo = new EstimatedHistogram(); private final EstimatedHistogram latencySearchFetch99Histo = new EstimatedHistogram(); private final EstimatedHistogram latencyGet95Histo = new EstimatedHistogram(); private final EstimatedHistogram latencyGet99Histo = new EstimatedHistogram(); private final EstimatedHistogram latencyGetExists95Histo = new EstimatedHistogram(); private final EstimatedHistogram latencyGetExists99Histo = new EstimatedHistogram(); private final EstimatedHistogram latencyGetMissing95Histo = new EstimatedHistogram(); private final EstimatedHistogram latencyGetMissing99Histo = new EstimatedHistogram(); private final EstimatedHistogram latencyIndexing95Histo = new EstimatedHistogram(); private final EstimatedHistogram latencyIndexing99Histo = new EstimatedHistogram(); private final EstimatedHistogram latencyIndexDelete95Histo = new EstimatedHistogram(); private final EstimatedHistogram latencyIndexDelete99Histo = new EstimatedHistogram(); private final double PERCENTILE_95 = 0.95; private final double PERCENTILE_99 = 0.99; private long cachedQueryCount; private long cachedFetchCount; private long cachedGetCount; private long cachedGetExistsCount; private long cachedGetMissingCount; private long cachedIndexingIndexTotal; private long cachedIndexingDeleteTotal; private long cachedSearchQueryTime; private long cachedSearchFetchTime; private long cachedGetTime; private long cachedGetExistsTime; private long cachedGetMissingTime; private long cachedIndexingTime; private long cachedIndexDeleteTime; @Inject public NodeIndicesStatsMonitor(IConfiguration config) { super(config); nodeIndicesStatsReporter = new Elasticsearch_NodeIndicesStatsReporter(); Monitors.registerObject(nodeIndicesStatsReporter); } public static TaskTimer getTimer(String name) { return new SimpleTimer(name, 60 * 1000); } @Override public void execute() throws Exception { // Only start monitoring if Elasticsearch is started if (!ElasticsearchProcessMonitor.isElasticsearchRunning()) { String exceptionMsg = "Elasticsearch is not yet started, check back again later"; logger.info(exceptionMsg); return; } NodeIndicesStatsBean nodeIndicesStatsBean = new NodeIndicesStatsBean(); try { NodesStatsResponse nodesStatsResponse = ElasticsearchTransportClient.getNodesStatsResponse(config); NodeStats nodeStats = null; List<NodeStats> nodeStatsList = nodesStatsResponse.getNodes(); if (nodeStatsList.size() > 0) { nodeStats = nodeStatsList.get(0); } if (nodeStats == null) { logger.info("Node indices stats is not available (node stats is not available)"); return; } NodeIndicesStats nodeIndicesStats = nodeStats.getIndices(); if (nodeIndicesStats == null) { logger.info("Node indices stats is not available"); return; } updateStoreDocs(nodeIndicesStatsBean, nodeIndicesStats); updateRefreshFlush(nodeIndicesStatsBean, nodeIndicesStats); updateMerge(nodeIndicesStatsBean, nodeIndicesStats); updateCache(nodeIndicesStatsBean, nodeIndicesStats); updateSearch(nodeIndicesStatsBean, nodeIndicesStats); updateGet(nodeIndicesStatsBean, nodeIndicesStats); updateIndexing(nodeIndicesStatsBean, nodeIndicesStats); } catch (Exception e) { logger.warn("Failed to load indices stats data", e); } nodeIndicesStatsReporter.nodeIndicesStatsBean.set(nodeIndicesStatsBean); } private void updateStoreDocs(NodeIndicesStatsBean nodeIndicesStatsBean, NodeIndicesStats nodeIndicesStats) { nodeIndicesStatsBean.storeSize = nodeIndicesStats.getStore().getSizeInBytes(); nodeIndicesStatsBean.storeThrottleTime = nodeIndicesStats.getStore().getThrottleTime().millis(); nodeIndicesStatsBean.docsCount = nodeIndicesStats.getDocs().getCount(); nodeIndicesStatsBean.docsDeleted = nodeIndicesStats.getDocs().getDeleted(); } private void updateRefreshFlush(NodeIndicesStatsBean nodeIndicesStatsBean, NodeIndicesStats nodeIndicesStats) { nodeIndicesStatsBean.refreshTotal = nodeIndicesStats.getRefresh().getTotal(); nodeIndicesStatsBean.refreshTotalTime = nodeIndicesStats.getRefresh().getTotalTimeInMillis(); if (nodeIndicesStatsBean.refreshTotal != 0) { nodeIndicesStatsBean.refreshAvgTimeInMillisPerRequest = nodeIndicesStatsBean.refreshTotalTime / nodeIndicesStatsBean.refreshTotal; } nodeIndicesStatsBean.flushTotal = nodeIndicesStats.getFlush().getTotal(); nodeIndicesStatsBean.flushTotalTime = nodeIndicesStats.getFlush().getTotalTimeInMillis(); if (nodeIndicesStatsBean.flushTotal != 0) { nodeIndicesStatsBean.flushAvgTimeInMillisPerRequest = nodeIndicesStatsBean.flushTotalTime / nodeIndicesStatsBean.flushTotal; } } private void updateMerge(NodeIndicesStatsBean nodeIndicesStatsBean, NodeIndicesStats nodeIndicesStats) { nodeIndicesStatsBean.mergesCurrent = nodeIndicesStats.getMerge().getCurrent(); nodeIndicesStatsBean.mergesCurrentDocs = nodeIndicesStats.getMerge().getCurrentNumDocs(); nodeIndicesStatsBean.mergesCurrentSize = nodeIndicesStats.getMerge().getCurrentSizeInBytes(); nodeIndicesStatsBean.mergesTotal = nodeIndicesStats.getMerge().getTotal(); nodeIndicesStatsBean.mergesTotalTime = nodeIndicesStats.getMerge().getTotalTimeInMillis(); nodeIndicesStatsBean.mergesTotalSize = nodeIndicesStats.getMerge().getTotalSizeInBytes(); } private void updateCache(NodeIndicesStatsBean nodeIndicesStatsBean, NodeIndicesStats nodeIndicesStats) { nodeIndicesStatsBean.cacheFieldEvictions = nodeIndicesStats.getFieldData().getEvictions(); nodeIndicesStatsBean.cacheFieldSize = nodeIndicesStats.getFieldData().getMemorySizeInBytes(); } private void updateSearch(NodeIndicesStatsBean nodeIndicesStatsBean, NodeIndicesStats nodeIndicesStats) { nodeIndicesStatsBean.searchQueryTotal = nodeIndicesStats.getSearch().getTotal().getQueryCount(); nodeIndicesStatsBean.searchFetchTotal = nodeIndicesStats.getSearch().getTotal().getFetchCount(); nodeIndicesStatsBean.searchQueryCurrent = nodeIndicesStats.getSearch().getTotal().getQueryCurrent(); long tmpSearchQueryDelta = nodeIndicesStatsBean.searchQueryTotal - cachedQueryCount; nodeIndicesStatsBean.searchQueryDelta = tmpSearchQueryDelta < 0 ? 0 : tmpSearchQueryDelta; long tmpSearchFetchDelta = nodeIndicesStatsBean.searchFetchTotal - cachedFetchCount; nodeIndicesStatsBean.searchFetchDelta = tmpSearchFetchDelta < 0 ? 0 : tmpSearchFetchDelta; nodeIndicesStatsBean.searchQueryTime = nodeIndicesStats.getSearch().getTotal().getQueryTimeInMillis(); nodeIndicesStatsBean.searchFetchTime = nodeIndicesStats.getSearch().getTotal().getFetchTimeInMillis(); long searchQueryDeltaTimeInMillis = (nodeIndicesStatsBean.searchQueryTime - cachedSearchQueryTime); if (nodeIndicesStatsBean.searchQueryDelta != 0) { recordSearchQueryLatencies(searchQueryDeltaTimeInMillis / nodeIndicesStatsBean.searchQueryDelta, TimeUnit.MILLISECONDS); nodeIndicesStatsBean.latencySearchQuery95 = latencySearchQuery95Histo.percentile(PERCENTILE_95); nodeIndicesStatsBean.latencySearchQuery99 = latencySearchQuery99Histo.percentile(PERCENTILE_99); } else { nodeIndicesStatsBean.latencySearchQuery95 = 0; nodeIndicesStatsBean.latencySearchQuery99 = 0; } if (nodeIndicesStatsBean.searchQueryTotal != 0) { nodeIndicesStatsBean.searchQueryAvgTimeInMillisPerRequest = nodeIndicesStatsBean.searchQueryTime / nodeIndicesStatsBean.searchQueryTotal; } long searchFetchDeltaTimeInMillis = (nodeIndicesStatsBean.searchFetchTime - cachedSearchFetchTime); if (nodeIndicesStatsBean.searchFetchDelta != 0) { recordSearchFetchLatencies(searchFetchDeltaTimeInMillis / nodeIndicesStatsBean.searchFetchDelta, TimeUnit.MILLISECONDS); nodeIndicesStatsBean.latencySearchFetch95 = latencySearchFetch95Histo.percentile(PERCENTILE_95); nodeIndicesStatsBean.latencySearchFetch99 = latencySearchFetch99Histo.percentile(PERCENTILE_99); } else { nodeIndicesStatsBean.latencySearchFetch95 = 0; nodeIndicesStatsBean.latencySearchFetch99 = 0; } if (nodeIndicesStatsBean.searchFetchTotal != 0) { nodeIndicesStatsBean.searchFetchAvgTimeInMillisPerRequest = nodeIndicesStatsBean.searchFetchTime / nodeIndicesStatsBean.searchFetchTotal; } nodeIndicesStatsBean.searchFetchCurrent = nodeIndicesStats.getSearch().getTotal().getFetchCurrent(); cachedQueryCount += nodeIndicesStatsBean.searchQueryDelta; cachedFetchCount += nodeIndicesStatsBean.searchFetchDelta; cachedSearchQueryTime += searchQueryDeltaTimeInMillis; cachedSearchFetchTime += searchFetchDeltaTimeInMillis; } private void updateGet(NodeIndicesStatsBean nodeIndicesStatsBean, NodeIndicesStats nodeIndicesStats) { nodeIndicesStatsBean.getTotal = nodeIndicesStats.getGet().getCount(); nodeIndicesStatsBean.getExistsTotal = nodeIndicesStats.getGet().getExistsCount(); nodeIndicesStatsBean.getMissingTotal = nodeIndicesStats.getGet().getMissingCount(); nodeIndicesStatsBean.getTime = nodeIndicesStats.getGet().getTimeInMillis(); nodeIndicesStatsBean.getExistsTime = nodeIndicesStats.getGet().getExistsTimeInMillis(); nodeIndicesStatsBean.getMissingTime = nodeIndicesStats.getGet().getMissingTimeInMillis(); long tmpGetTotalDelta = nodeIndicesStatsBean.getTotal - cachedGetCount; nodeIndicesStatsBean.getTotalDelta = tmpGetTotalDelta < 0 ? 0 : tmpGetTotalDelta; long tmpGetExistsDelta = nodeIndicesStatsBean.getExistsTotal - cachedGetExistsCount; nodeIndicesStatsBean.getExistsDelta = tmpGetExistsDelta < 0 ? 0 : tmpGetExistsDelta; long tmpGetMissingDelta = nodeIndicesStatsBean.getMissingTotal - cachedGetMissingCount; nodeIndicesStatsBean.getMissingDelta = tmpGetMissingDelta < 0 ? 0 : tmpGetMissingDelta; long getDeltaTimeInMillis = (nodeIndicesStatsBean.getTime - cachedGetTime); if (nodeIndicesStatsBean.getTotalDelta != 0) { recordGetLatencies(getDeltaTimeInMillis / nodeIndicesStatsBean.getTotalDelta, TimeUnit.MILLISECONDS); nodeIndicesStatsBean.latencyGet95 = latencyGet95Histo.percentile(PERCENTILE_95); nodeIndicesStatsBean.latencyGet99 = latencyGet99Histo.percentile(PERCENTILE_99); } else { nodeIndicesStatsBean.latencyGet95 = 0; nodeIndicesStatsBean.latencyGet99 = 0; } if (nodeIndicesStatsBean.getTotal != 0) nodeIndicesStatsBean.getTotalAvgTimeInMillisPerRequest = nodeIndicesStatsBean.getTime / nodeIndicesStatsBean.getTotal; nodeIndicesStatsBean.getCurrent = nodeIndicesStats.getGet().current(); long getExistsDeltaTimeInMillies = (nodeIndicesStatsBean.getExistsTime - cachedGetExistsTime); if (nodeIndicesStatsBean.getExistsDelta != 0) { recordGetExistsLatencies(getExistsDeltaTimeInMillies / nodeIndicesStatsBean.getExistsDelta, TimeUnit.MILLISECONDS); nodeIndicesStatsBean.latencyGetExists95 = latencyGetExists95Histo.percentile(PERCENTILE_95); nodeIndicesStatsBean.latencyGetExists99 = latencyGetExists99Histo.percentile(PERCENTILE_99); } else { nodeIndicesStatsBean.latencyGetExists95 = 0; nodeIndicesStatsBean.latencyGetExists99 = 0; } if (nodeIndicesStatsBean.getExistsTotal != 0) nodeIndicesStatsBean.getExistsAvgTimeInMillisPerRequest = nodeIndicesStatsBean.getExistsTime / nodeIndicesStatsBean.getExistsTotal; long getMissingDeltaTimeInMillies = (nodeIndicesStatsBean.getMissingTime - cachedGetMissingTime); if (nodeIndicesStatsBean.getMissingDelta != 0) { recordGetMissingLatencies(getMissingDeltaTimeInMillies / nodeIndicesStatsBean.getMissingDelta, TimeUnit.MILLISECONDS); nodeIndicesStatsBean.latencyGetMissing95 = latencyGetMissing95Histo.percentile(PERCENTILE_95); nodeIndicesStatsBean.latencyGetMissing99 = latencyGetMissing99Histo.percentile(PERCENTILE_99); } else { nodeIndicesStatsBean.latencyGetMissing95 = 0; nodeIndicesStatsBean.latencyGetMissing99 = 0; } if (nodeIndicesStatsBean.getMissingTotal != 0) { nodeIndicesStatsBean.getMissingAvgTimeInMillisPerRequest = nodeIndicesStatsBean.getMissingTime / nodeIndicesStatsBean.getMissingTotal; } cachedGetCount += nodeIndicesStatsBean.getTotalDelta; cachedGetExistsCount += nodeIndicesStatsBean.getExistsDelta; cachedGetMissingCount += nodeIndicesStatsBean.getMissingDelta; cachedGetTime += getDeltaTimeInMillis; cachedGetExistsTime += getExistsDeltaTimeInMillies; cachedGetMissingTime += getMissingDeltaTimeInMillies; } private void updateIndexing(NodeIndicesStatsBean nodeIndicesStatsBean, NodeIndicesStats nodeIndicesStats) { nodeIndicesStatsBean.indexingIndexTotal = nodeIndicesStats.getIndexing().getTotal().getIndexCount(); nodeIndicesStatsBean.indexingDeleteTotal = nodeIndicesStats.getIndexing().getTotal().getDeleteCount(); nodeIndicesStatsBean.indexingIndexCurrent = nodeIndicesStats.getIndexing().getTotal().getIndexCurrent(); long tmpIndexingIndexDelta = (nodeIndicesStatsBean.indexingIndexTotal - cachedIndexingIndexTotal); nodeIndicesStatsBean.indexingIndexDelta = tmpIndexingIndexDelta < 0 ? 0 : tmpIndexingIndexDelta; long tmpIndexingDeleteDelta = (nodeIndicesStatsBean.indexingDeleteTotal - cachedIndexingDeleteTotal); nodeIndicesStatsBean.indexingDeleteDelta = tmpIndexingDeleteDelta < 0 ? 0 : tmpIndexingDeleteDelta; nodeIndicesStatsBean.indexingIndexTimeInMillis = nodeIndicesStats.getIndexing().getTotal().getIndexTime().getMillis(); nodeIndicesStatsBean.indexingDeleteTime = nodeIndicesStats.getIndexing().getTotal().getDeleteTime().getMillis(); long indexingTimeInMillis = (nodeIndicesStatsBean.indexingIndexTimeInMillis - cachedIndexingTime); if (nodeIndicesStatsBean.indexingIndexDelta != 0) { recordIndexingLatencies(indexingTimeInMillis / nodeIndicesStatsBean.indexingIndexDelta, TimeUnit.MILLISECONDS); nodeIndicesStatsBean.latencyIndexing95 = latencyIndexing95Histo.percentile(PERCENTILE_95); nodeIndicesStatsBean.latencyIndexing99 = latencyIndexing99Histo.percentile(PERCENTILE_99); } else { nodeIndicesStatsBean.latencyIndexing95 = 0; nodeIndicesStatsBean.latencyIndexing99 = 0; } if (nodeIndicesStatsBean.indexingIndexTotal != 0) { nodeIndicesStatsBean.indexingAvgTimeInMillisPerRequest = nodeIndicesStatsBean.indexingIndexTimeInMillis / nodeIndicesStatsBean.indexingIndexTotal; } long indexDeleteTimeInMillis = (nodeIndicesStatsBean.indexingDeleteTime - cachedIndexDeleteTime); if (nodeIndicesStatsBean.indexingDeleteDelta != 0) { recordIndexDeleteLatencies(indexDeleteTimeInMillis / nodeIndicesStatsBean.indexingDeleteDelta, TimeUnit.MILLISECONDS); nodeIndicesStatsBean.latencyIndexDelete95 = latencyIndexDelete95Histo.percentile(PERCENTILE_95); nodeIndicesStatsBean.latencyIndexDelete99 = latencyIndexDelete99Histo.percentile(PERCENTILE_99); } else { nodeIndicesStatsBean.latencyIndexDelete95 = 0; nodeIndicesStatsBean.latencyIndexDelete99 = 0; } if (nodeIndicesStatsBean.indexingDeleteTotal != 0) { nodeIndicesStatsBean.indexingDeleteAvgTimeInMillisPerRequest = nodeIndicesStatsBean.indexingDeleteTime / nodeIndicesStatsBean.indexingDeleteTotal; } nodeIndicesStatsBean.indexingDeleteCurrent = nodeIndicesStats.getIndexing().getTotal().getDeleteCurrent(); cachedIndexingIndexTotal += nodeIndicesStatsBean.indexingIndexDelta; cachedIndexingDeleteTotal += nodeIndicesStatsBean.indexingDeleteDelta; cachedIndexingTime += indexingTimeInMillis; cachedIndexDeleteTime += indexDeleteTimeInMillis; } private void recordSearchQueryLatencies(long duration, TimeUnit unit) { long searchQueryLatency = TimeUnit.MICROSECONDS.convert(duration, unit); latencySearchQuery95Histo.add(searchQueryLatency); latencySearchQuery99Histo.add(searchQueryLatency); } private void recordSearchFetchLatencies(long duration, TimeUnit unit) { long fetchQueryLatency = TimeUnit.MICROSECONDS.convert(duration, unit); latencySearchFetch95Histo.add(fetchQueryLatency); latencySearchFetch99Histo.add(fetchQueryLatency); } private void recordGetLatencies(long duration, TimeUnit unit) { long getLatency = TimeUnit.MICROSECONDS.convert(duration, unit); latencyGet95Histo.add(getLatency); latencyGet99Histo.add(getLatency); } private void recordGetExistsLatencies(long duration, TimeUnit unit) { long getExistsLatency = TimeUnit.MICROSECONDS.convert(duration, unit); latencyGetExists95Histo.add(getExistsLatency); latencyGetExists99Histo.add(getExistsLatency); } private void recordGetMissingLatencies(long duration, TimeUnit unit) { long getMissingLatency = TimeUnit.MICROSECONDS.convert(duration, unit); latencyGetMissing95Histo.add(getMissingLatency); latencyGetMissing99Histo.add(getMissingLatency); } private void recordIndexingLatencies(long duration, TimeUnit unit) { long indexingLatency = TimeUnit.MICROSECONDS.convert(duration, unit); latencyIndexing95Histo.add(indexingLatency); latencyIndexing99Histo.add(indexingLatency); } private void recordIndexDeleteLatencies(long duration, TimeUnit unit) { long indexDeleteLatency = TimeUnit.MICROSECONDS.convert(duration, unit); latencyIndexDelete95Histo.add(indexDeleteLatency); latencyIndexDelete99Histo.add(indexDeleteLatency); } @Override public String getName() { return METRIC_NAME; } private static class NodeIndicesStatsBean { private long storeSize; private long storeThrottleTime; private long docsCount; private long docsDeleted; private long indexingIndexTotal; private long indexingIndexTimeInMillis; private double indexingAvgTimeInMillisPerRequest; private long indexingIndexCurrent; private long indexingDeleteTotal; private long indexingDeleteTime; private double indexingDeleteAvgTimeInMillisPerRequest; private long indexingDeleteCurrent; private long indexingIndexDelta; private long indexingDeleteDelta; private long getTotal; private long getTime; private double getTotalAvgTimeInMillisPerRequest; private long getCurrent; private long getExistsTotal; private long getExistsTime; private double getExistsAvgTimeInMillisPerRequest; private long getMissingTotal; private long getMissingTime; private double getMissingAvgTimeInMillisPerRequest; private long getTotalDelta; private long getExistsDelta; private long getMissingDelta; private long searchQueryTotal; private long searchQueryTime; private double searchQueryAvgTimeInMillisPerRequest; private long searchQueryCurrent; private long searchQueryDelta; private long searchFetchTotal; private long searchFetchTime; private double searchFetchAvgTimeInMillisPerRequest; private long searchFetchCurrent; private long searchFetchDelta; private long cacheFieldEvictions; private long cacheFieldSize; private long cacheFilterEvictions; private long cacheFilterSize; private long mergesCurrent; private long mergesCurrentDocs; private long mergesCurrentSize; private long mergesTotal; private long mergesTotalTime; private long mergesTotalSize; private long refreshTotal; private long refreshTotalTime; private double refreshAvgTimeInMillisPerRequest; private long flushTotal; private long flushTotalTime; private double flushAvgTimeInMillisPerRequest; private double latencySearchQuery95; private double latencySearchQuery99; private double latencySearchFetch95; private double latencySearchFetch99; private double latencyGet95; private double latencyGet99; private double latencyGetExists95; private double latencyGetExists99; private double latencyGetMissing95; private double latencyGetMissing99; private double latencyIndexing95; private double latencyIndexing99; private double latencyIndexDelete95; private double latencyIndexDelete99; } public class Elasticsearch_NodeIndicesStatsReporter { private final AtomicReference<NodeIndicesStatsBean> nodeIndicesStatsBean; public Elasticsearch_NodeIndicesStatsReporter() { nodeIndicesStatsBean = new AtomicReference<NodeIndicesStatsBean>(new NodeIndicesStatsBean()); } @Monitor(name = "store_size", type = DataSourceType.GAUGE) public long getStoreSize() { return nodeIndicesStatsBean.get().storeSize; } @Monitor(name = "store_throttle_time", type = DataSourceType.GAUGE) public long getStoreThrottleTime() { return nodeIndicesStatsBean.get().storeThrottleTime; } @Monitor(name = "docs_count", type = DataSourceType.GAUGE) public long getDocsCount() { return nodeIndicesStatsBean.get().docsCount; } @Monitor(name = "docs_deleted", type = DataSourceType.GAUGE) public long getDocsDeleted() { return nodeIndicesStatsBean.get().docsDeleted; } //Indexing @Monitor(name = "indexing_index_total", type = DataSourceType.COUNTER) public long getIndexingIndexTotal() { return nodeIndicesStatsBean.get().indexingIndexTotal; } @Monitor(name = "indexing_index_time_in_millis", type = DataSourceType.COUNTER) public long getIndexingIndexTimeInMillis() { return nodeIndicesStatsBean.get().indexingIndexTimeInMillis; } @Monitor(name = "indexing_avg_time_in_millis_per_request", type = DataSourceType.GAUGE) public double getIndexingAvgTimeInMillisPerRequest() { return nodeIndicesStatsBean.get().indexingAvgTimeInMillisPerRequest; } @Monitor(name = "indexing_index_current", type = DataSourceType.GAUGE) public long getIndexingIndexCurrent() { return nodeIndicesStatsBean.get().indexingIndexCurrent; } @Monitor(name = "indexing_delete_total", type = DataSourceType.COUNTER) public long getIndexingDeleteTotal() { return nodeIndicesStatsBean.get().indexingDeleteTotal; } @Monitor(name = "indexing_delete_time", type = DataSourceType.COUNTER) public long getIndexingDeleteTime() { return nodeIndicesStatsBean.get().indexingDeleteTime; } @Monitor(name = "indexing_delete_avg_time_in_millis_per_request", type = DataSourceType.GAUGE) public double getIndexingDeleteAvgTimeInMillisPerRequest() { return nodeIndicesStatsBean.get().indexingDeleteAvgTimeInMillisPerRequest; } @Monitor(name = "indexing_delete_current", type = DataSourceType.GAUGE) public long getIndexingDeleteCurrent() { return nodeIndicesStatsBean.get().indexingDeleteCurrent; } @Monitor(name = "indexing_index_delta", type = DataSourceType.GAUGE) public long getIndexingIndexDelta() { return nodeIndicesStatsBean.get().indexingIndexDelta; } @Monitor(name = "indexing_delete_delta", type = DataSourceType.GAUGE) public long getIndexingDeleteDelta() { return nodeIndicesStatsBean.get().indexingDeleteDelta; } //Get @Monitor(name = "get_total", type = DataSourceType.COUNTER) public long getGetTotal() { return nodeIndicesStatsBean.get().getTotal; } @Monitor(name = "get_time", type = DataSourceType.COUNTER) public long getGetTime() { return nodeIndicesStatsBean.get().getTime; } @Monitor(name = "total_avg_time_in_millis_per_request", type = DataSourceType.GAUGE) public double getTotalAvgTimeInMillisPerRequest() { return nodeIndicesStatsBean.get().getTotalAvgTimeInMillisPerRequest; } @Monitor(name = "get_current", type = DataSourceType.GAUGE) public long getGetCurrent() { return nodeIndicesStatsBean.get().getCurrent; } @Monitor(name = "get_exists_total", type = DataSourceType.COUNTER) public long getGetExistsTotal() { return nodeIndicesStatsBean.get().getExistsTotal; } @Monitor(name = "get_exists_time", type = DataSourceType.COUNTER) public long getGetExistsTime() { return nodeIndicesStatsBean.get().getExistsTime; } @Monitor(name = "exists_avg_time_in_millis_per_request", type = DataSourceType.GAUGE) public double getExistsAvgTimeInMillisPerRequest() { return nodeIndicesStatsBean.get().getExistsAvgTimeInMillisPerRequest; } @Monitor(name = "get_missing_total", type = DataSourceType.COUNTER) public long getGetMissingTotal() { return nodeIndicesStatsBean.get().getMissingTotal; } @Monitor(name = "get_missing_time", type = DataSourceType.COUNTER) public long getGetMissingTime() { return nodeIndicesStatsBean.get().getMissingTime; } @Monitor(name = "missing_avg_time_in_millis_per_request", type = DataSourceType.GAUGE) public double getMissingAvgTimeInMillisPerRequest() { return nodeIndicesStatsBean.get().getMissingAvgTimeInMillisPerRequest; } //Search @Monitor(name = "get_total_delta", type = DataSourceType.GAUGE) public long getGetTotalDelta() { return nodeIndicesStatsBean.get().getTotalDelta; } @Monitor(name = "get_exists_delta", type = DataSourceType.GAUGE) public long getGetExistsDelta() { return nodeIndicesStatsBean.get().getExistsDelta; } @Monitor(name = "get_missing_delta", type = DataSourceType.GAUGE) public long getGetMissingDelta() { return nodeIndicesStatsBean.get().getMissingDelta; } @Monitor(name = "search_query_total", type = DataSourceType.COUNTER) public long getSearchQueryTotal() { return nodeIndicesStatsBean.get().searchQueryTotal; } @Monitor(name = "search_query_time", type = DataSourceType.COUNTER) public long getSearchQueryTime() { return nodeIndicesStatsBean.get().searchQueryTime; } @Monitor(name = "search_query_current", type = DataSourceType.GAUGE) public long getSearchQueryCurrent() { return nodeIndicesStatsBean.get().searchQueryCurrent; } @Monitor(name = "search_query_avg_time_in_millis_per_request", type = DataSourceType.GAUGE) public double getSearchQueryAvgTimeInMillisPerRequest() { return nodeIndicesStatsBean.get().searchQueryAvgTimeInMillisPerRequest; } @Monitor(name = "search_query_delta", type = DataSourceType.GAUGE) public long getSearchQueryDelta() { return nodeIndicesStatsBean.get().searchQueryDelta; } @Monitor(name = "search_fetch_total", type = DataSourceType.COUNTER) public long getSearchFetchTotal() { return nodeIndicesStatsBean.get().searchFetchTotal; } @Monitor(name = "search_fetch_time", type = DataSourceType.COUNTER) public long getSearchFetchTime() { return nodeIndicesStatsBean.get().searchFetchTime; } @Monitor(name = "search_fetch_avg_time_in_millis_per_request", type = DataSourceType.GAUGE) public double getSearchFetchAvgTimeInMillisPerRequest() { return nodeIndicesStatsBean.get().searchFetchAvgTimeInMillisPerRequest; } @Monitor(name = "search_fetch_current", type = DataSourceType.GAUGE) public long getSearchFetchCurrent() { return nodeIndicesStatsBean.get().searchFetchCurrent; } @Monitor(name = "search_fetch_delta", type = DataSourceType.GAUGE) public long getSearchFetchDelta() { return nodeIndicesStatsBean.get().searchFetchDelta; } //Cache @Monitor(name = "cache_field_evictions", type = DataSourceType.GAUGE) public long getCacheFieldEvictions() { return nodeIndicesStatsBean.get().cacheFieldEvictions; } @Monitor(name = "cache_field_size", type = DataSourceType.GAUGE) public long getCacheFieldSize() { return nodeIndicesStatsBean.get().cacheFieldSize; } @Monitor(name = "cache_filter_evictions", type = DataSourceType.GAUGE) public long getCacheFilterEvictions() { return nodeIndicesStatsBean.get().cacheFilterEvictions; } @Monitor(name = "cache_filter_size", type = DataSourceType.GAUGE) public long getCacheFilterSize() { return nodeIndicesStatsBean.get().cacheFilterSize; } //Merge @Monitor(name = "merges_current", type = DataSourceType.GAUGE) public long getMergesCurrent() { return nodeIndicesStatsBean.get().mergesCurrent; } @Monitor(name = "merges_current_docs", type = DataSourceType.GAUGE) public long getMergesCurrentDocs() { return nodeIndicesStatsBean.get().mergesCurrentDocs; } @Monitor(name = "merges_current_size", type = DataSourceType.GAUGE) public long getMergesCurrentSize() { return nodeIndicesStatsBean.get().mergesCurrentSize; } @Monitor(name = "merges_total", type = DataSourceType.COUNTER) public long getMergesTotal() { return nodeIndicesStatsBean.get().mergesTotal; } @Monitor(name = "merges_total_time", type = DataSourceType.COUNTER) public long getMergesTotalTime() { return nodeIndicesStatsBean.get().mergesTotalTime; } @Monitor(name = "merges_total_size", type = DataSourceType.GAUGE) public long getMergesTotalSize() { return nodeIndicesStatsBean.get().mergesTotalSize; } //Refresh @Monitor(name = "refresh_total", type = DataSourceType.COUNTER) public long getRefreshTotal() { return nodeIndicesStatsBean.get().refreshTotal; } @Monitor(name = "refresh_total_time", type = DataSourceType.COUNTER) public long getRefreshTotalTime() { return nodeIndicesStatsBean.get().refreshTotalTime; } @Monitor(name = "refresh_avg_time_in_millis_per_request", type = DataSourceType.GAUGE) public double getRefreshAvgTimeInMillisPerRequest() { return nodeIndicesStatsBean.get().refreshAvgTimeInMillisPerRequest; } //Flush @Monitor(name = "flush_total", type = DataSourceType.COUNTER) public long getFlushTotal() { return nodeIndicesStatsBean.get().flushTotal; } @Monitor(name = "flush_total_time", type = DataSourceType.COUNTER) public long getFlushTotalTime() { return nodeIndicesStatsBean.get().flushTotalTime; } @Monitor(name = "flush_avg_time_in_millis_per_request", type = DataSourceType.GAUGE) public double getFlushAvgTimeInMillisPerRequest() { return nodeIndicesStatsBean.get().flushAvgTimeInMillisPerRequest; } //Percentile Latencies @Monitor(name = "latencySearchQuery95", type = DataSourceType.GAUGE) public double getLatencySearchQuery95() { return nodeIndicesStatsBean.get().latencySearchQuery95; } @Monitor(name = "latencySearchQuery99", type = DataSourceType.GAUGE) public double getLatencySearchQuery99() { return nodeIndicesStatsBean.get().latencySearchQuery99; } @Monitor(name = "latencySearchFetch95", type = DataSourceType.GAUGE) public double getLatencySearchFetch95() { return nodeIndicesStatsBean.get().latencySearchFetch95; } @Monitor(name = "latencySearchFetch99", type = DataSourceType.GAUGE) public double getLatencySearchFetch99() { return nodeIndicesStatsBean.get().latencySearchFetch99; } @Monitor(name = "latencyGet95", type = DataSourceType.GAUGE) public double getLatencyGet95() { return nodeIndicesStatsBean.get().latencyGet95; } @Monitor(name = "latencyGet99", type = DataSourceType.GAUGE) public double getLatencyGet99() { return nodeIndicesStatsBean.get().latencyGet99; } @Monitor(name = "latencyGetExists95", type = DataSourceType.GAUGE) public double getLatencyGetExists95() { return nodeIndicesStatsBean.get().latencyGetExists95; } @Monitor(name = "latencyGetExists99", type = DataSourceType.GAUGE) public double getLatencyGetExists99() { return nodeIndicesStatsBean.get().latencyGetExists99; } @Monitor(name = "latencyGetMissing95", type = DataSourceType.GAUGE) public double getLatencyGetMissing95() { return nodeIndicesStatsBean.get().latencyGetMissing95; } @Monitor(name = "latencyGetMissing99", type = DataSourceType.GAUGE) public double getLatencyGetMissing99() { return nodeIndicesStatsBean.get().latencyGetMissing99; } @Monitor(name = "latencyIndexing95", type = DataSourceType.GAUGE) public double getLatencyIndexing95() { return nodeIndicesStatsBean.get().latencyIndexing95; } @Monitor(name = "latencyIndexing99", type = DataSourceType.GAUGE) public double getLatencyIndexing99() { return nodeIndicesStatsBean.get().latencyIndexing99; } @Monitor(name = "latencyIndexDelete95", type = DataSourceType.GAUGE) public double getLatencyIndexDelete95() { return nodeIndicesStatsBean.get().latencyIndexDelete95; } @Monitor(name = "latencyIndexDelete99", type = DataSourceType.GAUGE) public double getLatencyIndexDelete99() { return nodeIndicesStatsBean.get().latencyIndexDelete99; } } }