This is an automated email from the ASF dual-hosted git repository. domgarguilo pushed a commit to branch 3.1 in repository https://gitbox.apache.org/repos/asf/accumulo.git
The following commit(s) were added to refs/heads/3.1 by this push: new 173a447929 Dynamically generate metrics documentation (#4850) 173a447929 is described below commit 173a447929e27d6a4a20a671d74ba58dbae5c24c Author: Dom G. <domgargu...@apache.org> AuthorDate: Thu Sep 12 15:45:18 2024 -0400 Dynamically generate metrics documentation (#4850) * Dynamically generate metrics documentation markdown file * Added new Metric enum class to store all metrics info (name, description, type) --- core/pom.xml | 15 + .../org/apache/accumulo/core/metrics/Metric.java | 276 ++++++++ .../accumulo/core/metrics/MetricsDocGen.java | 110 ++++ .../accumulo/core/metrics/MetricsProducer.java | 700 +-------------------- .../server/compaction/PausedCompactionMetrics.java | 7 +- .../accumulo/server/metrics/ProcessMetrics.java | 7 +- .../accumulo/server/metrics/ThriftMetrics.java | 8 +- .../accumulo/server/metrics/ThriftMetricsTest.java | 8 +- .../org/apache/accumulo/compactor/Compactor.java | 9 +- .../org/apache/accumulo/gc/metrics/GcMetrics.java | 43 +- .../accumulo/manager/metrics/BalancerMetrics.java | 4 +- .../accumulo/manager/metrics/fate/FateMetrics.java | 30 +- .../apache/accumulo/tserver/BlockCacheMetrics.java | 29 +- .../apache/accumulo/tserver/ScanServerMetrics.java | 17 +- .../metrics/CompactionExecutorsMetrics.java | 13 +- .../tserver/metrics/TabletServerMetrics.java | 59 +- .../tserver/metrics/TabletServerMinCMetrics.java | 7 +- .../tserver/metrics/TabletServerScanMetrics.java | 49 +- .../tserver/metrics/TabletServerUpdateMetrics.java | 22 +- .../org/apache/accumulo/test/ZombieScanIT.java | 4 +- .../compaction/ExternalCompactionMetricsIT.java | 4 +- .../compaction/ExternalCompactionProgressIT.java | 19 +- .../test/functional/IdleProcessMetricsIT.java | 9 +- .../test/functional/MemoryStarvedMajCIT.java | 14 +- .../test/functional/MemoryStarvedMinCIT.java | 14 +- .../test/functional/MemoryStarvedScanIT.java | 11 +- .../apache/accumulo/test/metrics/MetricsIT.java | 73 ++- 27 files changed, 692 insertions(+), 869 deletions(-) diff --git a/core/pom.xml b/core/pom.xml index 990f853a59..06d2d8511c 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -387,6 +387,21 @@ </arguments> </configuration> </execution> + <execution> + <id>metrics-markdown</id> + <goals> + <goal>java</goal> + </goals> + <phase>package</phase> + <configuration> + <mainClass>org.apache.accumulo.core.metrics.MetricsDocGen</mainClass> + <classpathScope>test</classpathScope> + <arguments> + <argument>--generate-markdown</argument> + <argument>${project.build.directory}/generated-docs/metrics3.md</argument> + </arguments> + </configuration> + </execution> </executions> </plugin> </plugins> diff --git a/core/src/main/java/org/apache/accumulo/core/metrics/Metric.java b/core/src/main/java/org/apache/accumulo/core/metrics/Metric.java new file mode 100644 index 0000000000..9850d1a064 --- /dev/null +++ b/core/src/main/java/org/apache/accumulo/core/metrics/Metric.java @@ -0,0 +1,276 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * 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 org.apache.accumulo.core.metrics; + +import java.util.HashMap; +import java.util.Map; + +public enum Metric { + // General Server Metrics + SERVER_IDLE("accumulo.server.idle", MetricType.GAUGE, + "Indicates if the server is idle or not. The value will be 1 when idle and 0 when not idle.", + MetricCategory.GENERAL_SERVER), + LOW_MEMORY("accumulo.detected.low.memory", MetricType.GAUGE, + "Reports 1 when process memory usage is above threshold, 0 when memory is okay.", + MetricCategory.GENERAL_SERVER), + + // Compactor Metrics + COMPACTOR_MAJC_STUCK("accumulo.compactor.majc.stuck", MetricType.LONG_TASK_TIMER, "", + MetricCategory.COMPACTOR), + COMPACTOR_ENTRIES_READ("accumulo.compactor.entries.read", MetricType.FUNCTION_COUNTER, + "Number of entries read by all threads performing compactions.", MetricCategory.COMPACTOR), + COMPACTOR_ENTRIES_WRITTEN("accumulo.compactor.entries.written", MetricType.FUNCTION_COUNTER, + "Number of entries written by all threads performing compactions.", MetricCategory.COMPACTOR), + + // Fate Metrics + FATE_TYPE_IN_PROGRESS("accumulo.fate.ops.in.progress.by.type", MetricType.GAUGE, + "Number of FATE operations in progress. The type is designated by the `op.type` tag.", + MetricCategory.FATE), + FATE_OPS("accumulo.fate.ops", MetricType.GAUGE, "Tracks all the current FATE ops in any state.", + MetricCategory.FATE), + FATE_OPS_ACTIVITY("accumulo.fate.ops.activity", MetricType.GAUGE, "", MetricCategory.FATE), + FATE_ERRORS("accumulo.fate.errors", MetricType.GAUGE, "", MetricCategory.FATE), + FATE_TX("accumulo.fate.tx", MetricType.GAUGE, + "The state is now in a tag (e.g., state=new, state=in.progress, state=failed, etc.).", + MetricCategory.FATE), + + // Garbage Collection Metrics + GC_STARTED("accumulo.gc.started", MetricType.GAUGE, "", MetricCategory.GARBAGE_COLLECTION), + GC_FINISHED("accumulo.gc.finished", MetricType.GAUGE, "", MetricCategory.GARBAGE_COLLECTION), + GC_CANDIDATES("accumulo.gc.candidates", MetricType.GAUGE, "", MetricCategory.GARBAGE_COLLECTION), + GC_IN_USE("accumulo.gc.in.use", MetricType.GAUGE, "", MetricCategory.GARBAGE_COLLECTION), + GC_DELETED("accumulo.gc.deleted", MetricType.GAUGE, "", MetricCategory.GARBAGE_COLLECTION), + GC_ERRORS("accumulo.gc.errors", MetricType.GAUGE, "", MetricCategory.GARBAGE_COLLECTION), + GC_WAL_STARTED("accumulo.gc.wal.started", MetricType.GAUGE, "", + MetricCategory.GARBAGE_COLLECTION), + GC_WAL_FINISHED("accumulo.gc.wal.finished", MetricType.GAUGE, "", + MetricCategory.GARBAGE_COLLECTION), + GC_WAL_CANDIDATES("accumulo.gc.wal.candidates", MetricType.GAUGE, "", + MetricCategory.GARBAGE_COLLECTION), + GC_WAL_IN_USE("accumulo.gc.wal.in.use", MetricType.GAUGE, "", MetricCategory.GARBAGE_COLLECTION), + GC_WAL_DELETED("accumulo.gc.wal.deleted", MetricType.GAUGE, "", + MetricCategory.GARBAGE_COLLECTION), + GC_WAL_ERRORS("accumulo.gc.wal.errors", MetricType.GAUGE, "", MetricCategory.GARBAGE_COLLECTION), + GC_POST_OP_DURATION("accumulo.gc.post.op.duration", MetricType.GAUGE, "", + MetricCategory.GARBAGE_COLLECTION), + GC_RUN_CYCLE("accumulo.gc.run.cycle", MetricType.GAUGE, "", MetricCategory.GARBAGE_COLLECTION), + + // Tablet Server Metrics + TSERVER_ENTRIES("accumulo.tserver.entries", MetricType.GAUGE, "", MetricCategory.TABLET_SERVER), + TSERVER_MEM_ENTRIES("accumulo.tserver.entries.mem", MetricType.GAUGE, "", + MetricCategory.TABLET_SERVER), + TSERVER_MAJC_RUNNING("accumulo.tserver.majc.running", MetricType.GAUGE, "", + MetricCategory.TABLET_SERVER), + TSERVER_MAJC_STUCK("accumulo.tserver.majc.stuck", MetricType.GAUGE, "", + MetricCategory.TABLET_SERVER), + TSERVER_MAJC_QUEUED("accumulo.tserver.majc.queued", MetricType.GAUGE, "", + MetricCategory.TABLET_SERVER), + TSERVER_MINC_QUEUED("accumulo.tserver.minc.queued", MetricType.GAUGE, "", + MetricCategory.TABLET_SERVER), + TSERVER_MINC_RUNNING("accumulo.tserver.minc.running", MetricType.GAUGE, "", + MetricCategory.TABLET_SERVER), + TSERVER_MINC_TOTAL("accumulo.tserver.minc.total", MetricType.GAUGE, "", + MetricCategory.TABLET_SERVER), + TSERVER_TABLETS_ONLINE("accumulo.tserver.tablets.online", MetricType.GAUGE, "", + MetricCategory.TABLET_SERVER), + TSERVER_TABLETS_LONG_ASSIGNMENTS("accumulo.tserver.tablets.assignments.warning", MetricType.GAUGE, + "", MetricCategory.TABLET_SERVER), + TSERVER_TABLETS_OPENING("accumulo.tserver.tablets.opening", MetricType.GAUGE, "", + MetricCategory.TABLET_SERVER), + TSERVER_TABLETS_UNOPENED("accumulo.tserver.tablets.unopened", MetricType.GAUGE, "", + MetricCategory.TABLET_SERVER), + TSERVER_TABLETS_FILES("accumulo.tserver.tablets.files", MetricType.GAUGE, "", + MetricCategory.TABLET_SERVER), + TSERVER_INGEST_MUTATIONS("accumulo.tserver.ingest.mutations", MetricType.GAUGE, + "Prior to 2.1.0 this metric was reported as a rate, it is now the count and the rate can be derived.", + MetricCategory.TABLET_SERVER), + TSERVER_INGEST_BYTES("accumulo.tserver.ingest.bytes", MetricType.GAUGE, + "Prior to 2.1.0 this metric was reported as a rate, it is now the count and the rate can be derived.", + MetricCategory.TABLET_SERVER), + TSERVER_HOLD("accumulo.tserver.hold", MetricType.GAUGE, "", MetricCategory.TABLET_SERVER), + + // Scan Metrics + SCAN_RESERVATION_TOTAL_TIMER("accumulo.scan.reservation.total.timer", MetricType.TIMER, + "Time to reserve a tablet's files for scan.", MetricCategory.SCAN_SERVER), + SCAN_RESERVATION_WRITEOUT_TIMER("accumulo.scan.reservation.writeout.timer", MetricType.TIMER, + "Time to write out a tablets file reservations for scan", MetricCategory.SCAN_SERVER), + SCAN_RESERVATION_CONFLICT_COUNTER("accumulo.scan.reservation.conflict.count", MetricType.COUNTER, + "", MetricCategory.SCAN_SERVER), + SCAN_BUSY_TIMEOUT_COUNT("accumulo.scan.busy.timeout.count", MetricType.COUNTER, + "Count of the scans where a busy timeout happened.", MetricCategory.SCAN_SERVER), + SCAN_TABLET_METADATA_CACHE("accumulo.scan.tablet.metadata.cache", MetricType.CACHE, + "Scan server tablet cache metrics.", MetricCategory.SCAN_SERVER), + SCAN_TIMES("accumulo.scan.times", MetricType.TIMER, "", MetricCategory.SCAN_SERVER), + SCAN_OPEN_FILES("accumulo.scan.files.open", MetricType.GAUGE, "", MetricCategory.SCAN_SERVER), + SCAN_RESULTS("accumulo.scan.result", MetricType.GAUGE, "", MetricCategory.SCAN_SERVER), + SCAN_YIELDS("accumulo.scan.yields", MetricType.GAUGE, "", MetricCategory.SCAN_SERVER), + SCAN_START("accumulo.scan.start", MetricType.COUNTER, "", MetricCategory.SCAN_SERVER), + SCAN_CONTINUE("accumulo.scan.continue", MetricType.COUNTER, "", MetricCategory.SCAN_SERVER), + SCAN_CLOSE("accumulo.scan.close", MetricType.COUNTER, "", MetricCategory.SCAN_SERVER), + SCAN_QUERIES("accumulo.scan.queries", MetricType.GAUGE, "", MetricCategory.SCAN_SERVER), + SCAN_SCANNED_ENTRIES("accumulo.scan.query.scanned.entries", MetricType.GAUGE, + "Prior to 2.1.0 this metric was reported as a rate, it is now the count and the rate can be derived.", + MetricCategory.SCAN_SERVER), + SCAN_QUERY_SCAN_RESULTS("accumulo.scan.query.results", MetricType.GAUGE, + "Prior to 2.1.0 this metric was reported as a rate, it is now the count and the rate can be derived.", + MetricCategory.SCAN_SERVER), + SCAN_QUERY_SCAN_RESULTS_BYTES("accumulo.scan.query.results.bytes", MetricType.GAUGE, + "Prior to 2.1.0 this metric was reported as a rate, it is now the count and the rate can be derived.", + MetricCategory.SCAN_SERVER), + SCAN_PAUSED_FOR_MEM("accumulo.scan.paused.for.memory", MetricType.COUNTER, "", + MetricCategory.SCAN_SERVER), + SCAN_RETURN_FOR_MEM("accumulo.scan.return.early.for.memory", MetricType.COUNTER, "", + MetricCategory.SCAN_SERVER), + SCAN_ZOMBIE_THREADS("accumulo.scan.zombie.threads", MetricType.GAUGE, "", + MetricCategory.SCAN_SERVER), + + // Major Compaction Metrics + MAJC_QUEUED("accumulo.tserver.compactions.majc.queued", MetricType.GAUGE, + "The compaction service information is in a tag: `id={i|e}_{compactionServiceName}_{executor_name}`.", + MetricCategory.TABLET_SERVER), + MAJC_RUNNING("accumulo.tserver.compactions.majc.running", MetricType.GAUGE, + "The compaction service information is in a tag: `id={i|e}_{compactionServiceName}_{executor_name}`.", + MetricCategory.TABLET_SERVER), + MAJC_PAUSED("accumulo.tserver.compactions.majc.paused", MetricType.COUNTER, "", + MetricCategory.TABLET_SERVER), + + // Minor Compaction Metrics + MINC_QUEUED("accumulo.tserver.compactions.minc.queued", MetricType.TIMER, "", + MetricCategory.TABLET_SERVER), + MINC_RUNNING("accumulo.tserver.compactions.minc.running", MetricType.TIMER, "", + MetricCategory.TABLET_SERVER), + MINC_PAUSED("accumulo.tserver.compactions.minc.paused", MetricType.COUNTER, "", + MetricCategory.TABLET_SERVER), + + // Updates (Ingest) Metrics + UPDATE_ERRORS("accumulo.tserver.updates.error", MetricType.GAUGE, + "Type is stored in a tag (e.g., type=permission, type=unknown.tablet, type=constraint.violation).", + MetricCategory.TABLET_SERVER), + UPDATE_COMMIT("accumulo.tserver.updates.commit", MetricType.TIMER, "", + MetricCategory.TABLET_SERVER), + UPDATE_COMMIT_PREP("accumulo.tserver.updates.commit.prep", MetricType.TIMER, "", + MetricCategory.TABLET_SERVER), + UPDATE_WALOG_WRITE("accumulo.tserver.updates.walog.write", MetricType.TIMER, "", + MetricCategory.TABLET_SERVER), + UPDATE_MUTATION_ARRAY_SIZE("accumulo.tserver.updates.mutation.arrays.size", + MetricType.DISTRIBUTION_SUMMARY, "", MetricCategory.TABLET_SERVER), + + // Thrift Metrics + + THRIFT_IDLE("accumulo.thrift.idle", MetricType.DISTRIBUTION_SUMMARY, "", MetricCategory.THRIFT), + THRIFT_EXECUTE("accumulo.thrift.execute", MetricType.DISTRIBUTION_SUMMARY, "", + MetricCategory.THRIFT), + + // Block Cache Metrics + BLOCKCACHE_INDEX_HITCOUNT("accumulo.blockcache.index.hitcount", MetricType.FUNCTION_COUNTER, "", + MetricCategory.BLOCK_CACHE), + BLOCKCACHE_INDEX_REQUESTCOUNT("accumulo.blockcache.index.requestcount", + MetricType.FUNCTION_COUNTER, "", MetricCategory.BLOCK_CACHE), + BLOCKCACHE_INDEX_EVICTIONCOUNT("accumulo.blockcache.index.evictioncount", + MetricType.FUNCTION_COUNTER, "", MetricCategory.BLOCK_CACHE), + BLOCKCACHE_DATA_HITCOUNT("accumulo.blockcache.data.hitcount", MetricType.FUNCTION_COUNTER, "", + MetricCategory.BLOCK_CACHE), + BLOCKCACHE_DATA_REQUESTCOUNT("accumulo.blockcache.data.requestcount", MetricType.FUNCTION_COUNTER, + "", MetricCategory.BLOCK_CACHE), + BLOCKCACHE_DATA_EVICTIONCOUNT("accumulo.blockcache.data.evictioncount", + MetricType.FUNCTION_COUNTER, "", MetricCategory.BLOCK_CACHE), + BLOCKCACHE_SUMMARY_HITCOUNT("accumulo.blockcache.summary.hitcount", MetricType.FUNCTION_COUNTER, + "", MetricCategory.BLOCK_CACHE), + BLOCKCACHE_SUMMARY_REQUESTCOUNT("accumulo.blockcache.summary.requestcount", + MetricType.FUNCTION_COUNTER, "", MetricCategory.BLOCK_CACHE), + BLOCKCACHE_SUMMARY_EVICTIONCOUNT("accumulo.blockcache.summary.evictioncount", + MetricType.FUNCTION_COUNTER, "", MetricCategory.BLOCK_CACHE), + + // Manager Metrics + MANAGER_BALANCER_MIGRATIONS_NEEDED("accumulo.manager.balancer.migrations.needed", + MetricType.GAUGE, + "The number of migrations that need to complete before the system is balanced.", + MetricCategory.MANAGER); + + private final String name; + private final MetricType type; + private final String description; + private final MetricCategory category; + + private static final Map<String,Metric> NAME_TO_ENUM_MAP = new HashMap<>(); + + static { + for (Metric metric : values()) { + NAME_TO_ENUM_MAP.put(metric.name, metric); + } + } + + Metric(String name, MetricType type, String description, MetricCategory category) { + this.name = name; + this.type = type; + this.description = description; + this.category = category; + } + + public String getName() { + return name; + } + + public MetricType getType() { + return type; + } + + public String getDescription() { + return description; + } + + public MetricCategory getCategory() { + return category; + } + + public enum MetricType { + GAUGE, COUNTER, TIMER, LONG_TASK_TIMER, DISTRIBUTION_SUMMARY, FUNCTION_COUNTER, CACHE + } + + public enum MetricCategory { + GENERAL_SERVER("General Server Metrics"), + COMPACTOR("Compactor Metrics"), + FATE("Fate Metrics"), + GARBAGE_COLLECTION("Garbage Collection Metrics"), + TABLET_SERVER("Tablet Server Metrics"), + SCAN_SERVER("Scan Server Metrics"), + THRIFT("Thrift Metrics"), + BLOCK_CACHE("Block Cache Metrics"), + MANAGER("Manager Metrics"); + + private final String sectionTitle; + + MetricCategory(String sectionTitle) { + this.sectionTitle = sectionTitle; + } + + public String getSectionTitle() { + return sectionTitle; + } + } + + public static Metric fromName(String name) { + Metric metric = NAME_TO_ENUM_MAP.get(name); + if (metric == null) { + throw new IllegalArgumentException("No enum constant for metric name: " + name); + } + return metric; + } + +} diff --git a/core/src/main/java/org/apache/accumulo/core/metrics/MetricsDocGen.java b/core/src/main/java/org/apache/accumulo/core/metrics/MetricsDocGen.java new file mode 100644 index 0000000000..e07bd10748 --- /dev/null +++ b/core/src/main/java/org/apache/accumulo/core/metrics/MetricsDocGen.java @@ -0,0 +1,110 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * 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 org.apache.accumulo.core.metrics; + +import static java.nio.charset.StandardCharsets.UTF_8; + +import java.io.IOException; +import java.io.PrintStream; +import java.util.Arrays; +import java.util.Comparator; +import java.util.TreeSet; + +/** + * This class generates documentation to inform users of the available metrics in a presentable + * form. + */ +public class MetricsDocGen { + private final PrintStream doc; + private final TreeSet<Metric> sortedMetrics = + new TreeSet<>(Comparator.comparing(Metric::getName)); + + void generate() { + pageHeader(); + + for (var category : Metric.MetricCategory.values()) { + generateCategorySection(category, category.getSectionTitle()); + } + } + + void pageHeader() { + doc.println("---"); + doc.println("title: Metrics Documentation (3.x)"); + doc.println("category: configuration"); + doc.println("order: 7"); + doc.println("---\n"); + doc.println("<!-- WARNING: Do not edit this file. It is a generated file" + + " that is copied from Accumulo build (from core/target/generated-docs) -->\n"); + doc.println("Below are the metrics used to monitor various components of Accumulo.\n"); + } + + void generateCategorySection(Metric.MetricCategory category, String sectionTitle) { + beginSection(sectionTitle); + + // Enable block-level HTML parsing + doc.println("{::options parse_block_html=\"true\" /}"); + + for (Metric metric : sortedMetrics) { + if (metric.getCategory() == category) { + generateMetricSubsection(metric); + } + } + + // Disable block-level HTML parsing after the section + doc.println("{::options parse_block_html=\"false\" /}\n"); + } + + void beginSection(String sectionTitle) { + doc.println("\n## " + sectionTitle + "\n"); + } + + void generateMetricSubsection(Metric metric) { + // Open the div block with markdown enabled + doc.println("<div markdown=\"1\" class=\"metric-section\">"); + + // Metric details + doc.println("### " + metric.getName()); + doc.println("**Type:** " + metric.getType().name() + " "); // Ensuring a line break in Markdown + doc.println("**Description:** " + metric.getDescription()); + + doc.println("</div>"); + } + + private MetricsDocGen(PrintStream doc) { + this.doc = doc; + this.sortedMetrics.addAll(Arrays.asList(Metric.values())); + } + + /** + * Generates documentation for Accumulo metrics. Arguments are: "--generate-markdown filename" + * + * @param args command-line arguments + * @throws IllegalArgumentException if args is invalid + */ + public static void main(String[] args) throws IOException { + if (args.length == 2 && args[0].equals("--generate-markdown")) { + try (var printStream = new PrintStream(args[1], UTF_8)) { + new MetricsDocGen(printStream).generate(); + } + } else { + throw new IllegalArgumentException( + "Usage: " + MetricsDocGen.class.getName() + " --generate-markdown <filename>"); + } + } +} diff --git a/core/src/main/java/org/apache/accumulo/core/metrics/MetricsProducer.java b/core/src/main/java/org/apache/accumulo/core/metrics/MetricsProducer.java index dd1e493e6c..48e1e759ff 100644 --- a/core/src/main/java/org/apache/accumulo/core/metrics/MetricsProducer.java +++ b/core/src/main/java/org/apache/accumulo/core/metrics/MetricsProducer.java @@ -18,11 +18,6 @@ */ package org.apache.accumulo.core.metrics; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.util.HashMap; -import java.util.Map; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,569 +29,7 @@ import io.micrometer.core.instrument.MeterRegistry; * Metrics2</a> framework. In 2.1.0 Accumulo migrated away from the Metrics2 framework to * <a href="https://micrometer.io/">Micrometer</a>. Micrometer suggests using a particular * <a href="https://micrometer.io/docs/concepts#_naming_meters">naming convention</a> for the - * metrics. The table below contains a mapping of the old to new metric names. - * <table border="1"> - * <caption>Summary of Metric Changes</caption> - * <tr> - * <th>Old Name</th> - * <th>Hadoop Metrics2 Type</th> - * <th>New Name</th> - * <th>Micrometer Type</th> - * <th>Notes</th> - * </tr> - * <!-- general server metrics --> - * <tr> - * <td>N/A</td> - * <td>N/A</td> - * <td>{@value #METRICS_SERVER_IDLE}</td> - * <td>Gauge</td> - * <td>Indicates if the server is idle or not. The value will be 1 when idle and 0 when not idle. - * <!-- compactor --> - * <tr> - * <td>N/A</td> - * <td>N/A</td> - * <td>{@value #METRICS_LOW_MEMORY}</td> - * <td>Guage</td> - * <td>reports 1 when process memory usage is above threshold, 0 when memory is okay</td> - * </tr> - * <tr> - * <td>N/A</td> - * <td>N/A</td> - * <td>{@value #METRICS_COMPACTOR_MAJC_STUCK}</td> - * <td>LongTaskTimer</td> - * <td></td> - * </tr> - * <tr> - * <td>N/A</td> - * <td>N/A</td> - * <td>{@value #METRICS_COMPACTOR_ENTRIES_READ}</td> - * <td>FunctionCounter</td> - * <td>Number of entries read by all threads performing compactions</td> - * </tr> - * <tr> - * <td>N/A</td> - * <td>N/A</td> - * <td>{@value #METRICS_COMPACTOR_ENTRIES_WRITTEN}</td> - * <td>FunctionCounter</td> - * <td>Number of entries written by all threads performing compactions</td> - * </tr> - * <!-- fate --> - * <tr> - * <td>currentFateOps</td> - * <td>Gauge</td> - * <td>{@value #METRICS_FATE_OPS}</td> - * <td>Gauge</td> - * <td>Was previously named "accumulo.fate.ops.in.progress". Changed to better reflect what the - * gauge is actually tracking which is all the current fate ops in any state.</td> - * </tr> - * <tr> - * <td>FateTxOpType_{name}</td> - * <td>Gauge</td> - * <td>{@value #METRICS_FATE_TYPE_IN_PROGRESS}</td> - * <td>Gauge</td> - * <td>Previously there was a metric per operation type with the count of in-progress transactions - * of that type. Now there is one metric and the type is in the tag op.type</td> - * </tr> - * <tr> - * <td>totalFateOps</td> - * <td>Gauge</td> - * <td>{@value #METRICS_FATE_OPS_ACTIVITY}</td> - * <td>Gauge</td> - * <td></td> - * </tr> - * <tr> - * <td>totalZkConnErrors</td> - * <td>Gauge</td> - * <td>{@value #METRICS_FATE_ERRORS}</td> - * <td>Gauge</td> - * <td></td> - * </tr> - * <tr> - * <td>FateTxState_NEW</td> - * <td>Gauge</td> - * <td>{@value #METRICS_FATE_TX}</td> - * <td>Gauge</td> - * <td>The state is now in a tag: state=new</td> - * </tr> - * <tr> - * <td>FateTxState_IN_PROGRESS</td> - * <td>Gauge</td> - * <td>{@value #METRICS_FATE_TX}</td> - * <td>Gauge</td> - * <td>The state is now in a tag: state=in.progress</td> - * </tr> - * <tr> - * <td>FateTxState_FAILED_IN_PROGRESS</td> - * <td>Gauge</td> - * <td>{@value #METRICS_FATE_TX}</td> - * <td>Gauge</td> - * <td>The state is now in a tag: state=failed.in.progress</td> - * </tr> - * <tr> - * <td>FateTxState_FAILED</td> - * <td>Gauge</td> - * <td>{@value #METRICS_FATE_TX}</td> - * <td>Gauge</td> - * <td>The state is now in a tag: state=failed</td> - * </tr> - * <tr> - * <td>FateTxState_SUCCESSFUL</td> - * <td>Gauge</td> - * <td>{@value #METRICS_FATE_TX}</td> - * <td>Gauge</td> - * <td>The state is now in a tag: state=successful</td> - * </tr> - * <tr> - * <td>FateTxState_UNKNOWN</td> - * <td>Gauge</td> - * <td>{@value #METRICS_FATE_TX}</td> - * <td>Gauge</td> - * <td>The state is now in a tag: state=unknown</td> - * </tr> - * <!-- garbage collection --> - * <tr> - * <td>AccGcStarted</td> - * <td>Gauge</td> - * <td>{@value #METRICS_GC_STARTED}</td> - * <td>Gauge</td> - * <td></td> - * </tr> - * <tr> - * <td>AccGcFinished</td> - * <td>Gauge</td> - * <td>{@value #METRICS_GC_FINISHED}</td> - * <td>Gauge</td> - * <td></td> - * </tr> - * <tr> - * <td>AccGcCandidates</td> - * <td>Gauge</td> - * <td>{@value #METRICS_GC_CANDIDATES}</td> - * <td>Gauge</td> - * <td></td> - * </tr> - * <tr> - * <td>AccGcInUse</td> - * <td>Gauge</td> - * <td>{@value #METRICS_GC_IN_USE}</td> - * <td>Gauge</td> - * <td></td> - * </tr> - * <tr> - * <td>AccGcDeleted</td> - * <td>Gauge</td> - * <td>{@value #METRICS_GC_DELETED}</td> - * <td>Gauge</td> - * <td></td> - * </tr> - * <tr> - * <td>AccGcErrors</td> - * <td>Gauge</td> - * <td>{@value #METRICS_GC_ERRORS}</td> - * <td>Gauge</td> - * <td></td> - * </tr> - * <tr> - * <td>AccGcWalStarted</td> - * <td>Gauge</td> - * <td>{@value #METRICS_GC_WAL_STARTED}</td> - * <td>Gauge</td> - * <td></td> - * </tr> - * <tr> - * <td>AccGcWalFinished</td> - * <td>Gauge</td> - * <td>{@value #METRICS_GC_WAL_FINISHED}</td> - * <td>Gauge</td> - * <td></td> - * </tr> - * <tr> - * <td>AccGcWalCandidates</td> - * <td>Gauge</td> - * <td>{@value #METRICS_GC_WAL_CANDIDATES}</td> - * <td>Gauge</td> - * <td></td> - * </tr> - * <tr> - * <td>AccGcWalInUse</td> - * <td>Gauge</td> - * <td>{@value #METRICS_GC_WAL_IN_USE}</td> - * <td>Gauge</td> - * <td></td> - * </tr> - * <tr> - * <td>AccGcWalDeleted</td> - * <td>Gauge</td> - * <td>{@value #METRICS_GC_WAL_DELETED}</td> - * <td>Gauge</td> - * <td></td> - * </tr> - * <tr> - * <td>AccGcWalErrors</td> - * <td>Gauge</td> - * <td>{@value #METRICS_GC_WAL_ERRORS}</td> - * <td>Gauge</td> - * <td></td> - * </tr> - * <tr> - * <td>AccGcPosOpDuration</td> - * <td>Gauge</td> - * <td>{@value #METRICS_GC_POST_OP_DURATION}</td> - * <td>Gauge</td> - * <td></td> - * </tr> - * <tr> - * <td>AccGcRunCycleCount</td> - * <td>Gauge</td> - * <td>{@value #METRICS_GC_RUN_CYCLE}</td> - * <td>Gauge</td> - * <td></td> - * </tr> - * <!-- tablet server --> - * <tr> - * <td>entries</td> - * <td>Gauge</td> - * <td>{@value #METRICS_TSERVER_ENTRIES}</td> - * <td>Gauge</td> - * <td></td> - * </tr> - * <tr> - * <td>entriesInMem</td> - * <td>Gauge</td> - * <td>{@value #METRICS_TSERVER_MEM_ENTRIES}</td> - * <td>Gauge</td> - * <td></td> - * </tr> - * <tr> - * <td>activeMajCs</td> - * <td>Gauge</td> - * <td>{@value #METRICS_TSERVER_MAJC_RUNNING}</td> - * <td>Gauge</td> - * <td></td> - * </tr> - * <tr> - * <td>N/A</td> - * <td>N/A</td> - * <td>{@value #METRICS_TSERVER_MAJC_STUCK}</td> - * <td>LongTaskTimer</td> - * <td></td> - * </tr> - * <tr> - * <td>queuedMajCs</td> - * <td>Gauge</td> - * <td>{@value #METRICS_TSERVER_MAJC_QUEUED}</td> - * <td>Gauge</td> - * <td></td> - * </tr> - * <tr> - * <td>activeMinCs</td> - * <td>Gauge</td> - * <td>{@value #METRICS_TSERVER_MINC_RUNNING}</td> - * <td>Gauge</td> - * <td></td> - * </tr> - * <tr> - * <td>queuedMinCs</td> - * <td>Gauge</td> - * <td>{@value #METRICS_TSERVER_MINC_QUEUED}</td> - * <td>Gauge</td> - * <td></td> - * </tr> - * <tr> - * <td>totalMinCs</td> - * <td>Gauge</td> - * <td>{@value #METRICS_TSERVER_MINC_TOTAL}</td> - * <td>Gauge</td> - * <td></td> - * </tr> - * <tr> - * <td>onlineTablets</td> - * <td>Gauge</td> - * <td>{@value #METRICS_TSERVER_TABLETS_ONLINE}</td> - * <td>Gauge</td> - * <td></td> - * </tr> - * <tr> - * <td>N/A</td> - * <td>N/A</td> - * <td>{@value #METRICS_TSERVER_TABLETS_LONG_ASSIGNMENTS}</td> - * <td>Gauge</td> - * <td></td> - * </tr> - * <tr> - * <td>openingTablets</td> - * <td>Gauge</td> - * <td>{@value #METRICS_TSERVER_TABLETS_OPENING}</td> - * <td>Gauge</td> - * <td></td> - * </tr> - * <tr> - * <td>unopenedTablets</td> - * <td>Gauge</td> - * <td>{@value #METRICS_TSERVER_TABLETS_UNOPENED}</td> - * <td>Gauge</td> - * <td></td> - * </tr> - * <tr> - * <td>filesPerTablet</td> - * <td>Gauge</td> - * <td>{@value #METRICS_TSERVER_TABLETS_FILES}</td> - * <td>Gauge</td> - * <td></td> - * </tr> - * <tr> - * <td>ingestRate</td> - * <td>Gauge</td> - * <td>{@value #METRICS_TSERVER_INGEST_MUTATIONS}</td> - * <td>Gauge</td> - * <td>Prior to 2.1.0 this metric was reported as a rate, it is now the count and the rate can be - * derived</td> - * </tr> - * <tr> - * <td>ingestByteRate</td> - * <td>Gauge</td> - * <td>{@value #METRICS_TSERVER_INGEST_BYTES}</td> - * <td>Gauge</td> - * <td>Prior to 2.1.0 this metric was reported as a rate, it is now the count and the rate can be - * derived</td> - * </tr> - * <tr> - * <td>holdTime</td> - * <td>Gauge</td> - * <td>{@value #METRICS_TSERVER_HOLD}</td> - * <td>Gauge</td> - * <td></td> - * </tr> - * <!-- scan server --> - * <tr> - * <td>N/A</td> - * <td>N/A</td> - * <td>{@value #METRICS_SCAN_RESERVATION_TOTAL_TIMER}</td> - * <td>Timer</td> - * <td>Time to reserve a tablets files for scan</td> - * </tr> - * <tr> - * <td>N/A</td> - * <td>N/A</td> - * <td>{@value #METRICS_SCAN_BUSY_TIMEOUT_COUNTER}</td> - * <td>Counter</td> - * <td>Count of the scans where a busy timeout happened</td> - * </tr> - * <tr> - * <td>N/A</td> - * <td>N/A</td> - * <td>{@value #METRICS_SCAN_TABLET_METADATA_CACHE}</td> - * <td>Cache</td> - * <td>scan server tablet cache metrics</td> - * </tr> - * <!-- scans --> - * <tr> - * <td>scan</td> - * <td>Stat</td> - * <td>{@value #METRICS_SCAN_TIMES}</td> - * <td>Timer</td> - * <td></td> - * </tr> - * <tr> - * <td>N/A</td> - * <td>N/A</td> - * <td>{@value #METRICS_SCAN_OPEN_FILES}</td> - * <td>Gauge</td> - * <td></td> - * </tr> - * <tr> - * <td>result</td> - * <td>Stat</td> - * <td>{@value #METRICS_SCAN_RESULTS}</td> - * <td>Gauge</td> - * <td></td> - * </tr> - * <tr> - * <td>yield</td> - * <td>Stat</td> - * <td>{@value #METRICS_SCAN_YIELDS}</td> - * <td>Gauge</td> - * <td></td> - * </tr> - * <tr> - * <td>N/A</td> - * <td>N/A</td> - * <td>{@value #METRICS_SCAN_START}</td> - * <td>Counter</td> - * <td></td> - * </tr> - * <tr> - * <td>N/A</td> - * <td>N/A</td> - * <td>{@value #METRICS_SCAN_CONTINUE}</td> - * <td>Counter</td> - * <td></td> - * </tr> - * <tr> - * <td>N/A</td> - * <td>N/A</td> - * <td>{@value #METRICS_SCAN_CLOSE}</td> - * <td>Counter</td> - * <td></td> - * </tr> - * <tr> - * <td>queries</td> - * <td>Gauge</td> - * <td>{@value #METRICS_SCAN_QUERIES}</td> - * <td>Gauge</td> - * <td></td> - * </tr> - * <tr> - * <td>scannedRate</td> - * <td>Gauge</td> - * <td>{@value #METRICS_SCAN_SCANNED_ENTRIES}</td> - * <td>Gauge</td> - * <td>Prior to 2.1.0 this metric was reported as a rate, it is now the count and the rate can be - * derived</td> - * </tr> - * <tr> - * <td>queryRate</td> - * <td>Gauge</td> - * <td>{@value #METRICS_SCAN_QUERY_SCAN_RESULTS}</td> - * <td>Gauge</td> - * <td>Prior to 2.1.0 this metric was reported as a rate, it is now the count and the rate can be - * derived</td> - * </tr> - * <tr> - * <td>queryByteRate</td> - * <td>Gauge</td> - * <td>{@value #METRICS_SCAN_QUERY_SCAN_RESULTS_BYTES}</td> - * <td>Gauge</td> - * <td>Prior to 2.1.0 this metric was reported as a rate, it is now the count and the rate can be - * derived</td> - * </tr> - * <tr> - * <td>N/A</td> - * <td>N/A</td> - * <td>{@value #METRICS_SCAN_ZOMBIE_THREADS}</td> - * <td>Gauge</td> - * <td></td> - * </tr> - * <!-- major compactions --> - * <tr> - * <td>{i|e}_{compactionServiceName}_{executor_name}_queued</td> - * <td>Gauge</td> - * <td>{@value #METRICS_MAJC_QUEUED}</td> - * <td>Gauge</td> - * <td>The compaction service information is in a tag: - * id={i|e}_{compactionServiceName}_{executor_name}</td> - * </tr> - * <tr> - * <td>{i|e}_{compactionServiceName}_{executor_name}_running</td> - * <td>Gauge</td> - * <td>{@value #METRICS_MAJC_RUNNING}</td> - * <td>Gauge</td> - * <td>The compaction service information is in a tag: - * id={i|e}_{compactionServiceName}_{executor_name}</td> - * </tr> - * <tr> - * <td></td> - * <td></td> - * <td>{@link #METRICS_MAJC_PAUSED}</td> - * <td>Counter</td> - * <td></td> - * </tr> - * <!-- minor compactions --> - * <tr> - * <td>Queue</td> - * <td>Stat</td> - * <td>{@value #METRICS_MINC_QUEUED}</td> - * <td>Timer</td> - * <td></td> - * </tr> - * <tr> - * <td>Minc</td> - * <td>Stat</td> - * <td>{@value #METRICS_MINC_RUNNING}</td> - * <td>Timer</td> - * <td></td> - * </tr> - * <tr> - * <td></td> - * <td></td> - * <td>{@value #METRICS_MINC_PAUSED}</td> - * <td>Counter</td> - * <td></td> - * </tr> - * <!-- Updates (ingest) --> - * <tr> - * <td>permissionErrors</td> - * <td>Counter</td> - * <td>{@value #METRICS_UPDATE_ERRORS}</td> - * <td>Gauge</td> - * <td>Type is stored in tag: type=permission</td> - * </tr> - * <tr> - * <td>unknownTabletErrors</td> - * <td>Counter</td> - * <td>{@value #METRICS_UPDATE_ERRORS}</td> - * <td>Gauge</td> - * <td>Type is stored in tag: type=unknown.tablet</td> - * </tr> - * <tr> - * <td>constraintViolations</td> - * <td>Counter</td> - * <td>{@value #METRICS_UPDATE_ERRORS}</td> - * <td>Gauge</td> - * <td>Type is stored in tag: type=constraint.violation</td> - * </tr> - * <tr> - * <td>commitPrep</td> - * <td>Stat</td> - * <td>{@value #METRICS_UPDATE_COMMIT_PREP}</td> - * <td>Timer</td> - * <td></td> - * </tr> - * <tr> - * <td>commitTime</td> - * <td>Stat</td> - * <td>{@value #METRICS_UPDATE_COMMIT}</td> - * <td>Timer</td> - * <td></td> - * </tr> - * <tr> - * <td>waLogWriteTime</td> - * <td>Stat</td> - * <td>{@value #METRICS_UPDATE_WALOG_WRITE}</td> - * <td>Timer</td> - * <td></td> - * </tr> - * <tr> - * <td>mutationArraysSize</td> - * <td>Stat</td> - * <td>{@value #METRICS_UPDATE_MUTATION_ARRAY_SIZE}</td> - * <td>Distribution Summary</td> - * <td></td> - * </tr> - * <!-- Thrift --> - * <tr> - * <td>idle</td> - * <td>Stat</td> - * <td>{@value #METRICS_THRIFT_IDLE}</td> - * <td>Distribution Summary</td> - * <td></td> - * </tr> - * <tr> - * <td>execute</td> - * <td>Stat</td> - * <td>{@value #METRICS_THRIFT_EXECUTE}</td> - * <td>Distribution Summary</td> - * <td></td> - * </tr> - * <!-- Balancing --> - * <tr> - * <td>N/A</td> - * <td>N/A</td> - * <td>{@value METRICS_MANAGER_BALANCER_MIGRATIONS_NEEDED}</td> - * <td>Gauge</td> - * <td>The number of migrations that need to complete before the system is balanced</td> - * </tr> - * </table> + * metrics. * * @since 2.1.0 */ @@ -604,140 +37,9 @@ public interface MetricsProducer { Logger LOG = LoggerFactory.getLogger(MetricsProducer.class); - String METRICS_LOW_MEMORY = "accumulo.detected.low.memory"; - String METRICS_SERVER_IDLE = "accumulo.server.idle"; - - String METRICS_COMPACTOR_PREFIX = "accumulo.compactor."; - String METRICS_COMPACTOR_MAJC_STUCK = METRICS_COMPACTOR_PREFIX + "majc.stuck"; - String METRICS_COMPACTOR_ENTRIES_READ = METRICS_COMPACTOR_PREFIX + "entries.read"; - String METRICS_COMPACTOR_ENTRIES_WRITTEN = METRICS_COMPACTOR_PREFIX + "entries.written"; - - String METRICS_FATE_PREFIX = "accumulo.fate."; - String METRICS_FATE_TYPE_IN_PROGRESS = METRICS_FATE_PREFIX + "ops.in.progress.by.type"; - String METRICS_FATE_OPS = METRICS_FATE_PREFIX + "ops"; - String METRICS_FATE_OPS_ACTIVITY = METRICS_FATE_PREFIX + "ops.activity"; - String METRICS_FATE_ERRORS = METRICS_FATE_PREFIX + "errors"; - String METRICS_FATE_TX = METRICS_FATE_PREFIX + "tx"; - - String METRICS_GC_PREFIX = "accumulo.gc."; - String METRICS_GC_STARTED = METRICS_GC_PREFIX + "started"; - String METRICS_GC_FINISHED = METRICS_GC_PREFIX + "finished"; - String METRICS_GC_CANDIDATES = METRICS_GC_PREFIX + "candidates"; - String METRICS_GC_IN_USE = METRICS_GC_PREFIX + "in.use"; - String METRICS_GC_DELETED = METRICS_GC_PREFIX + "deleted"; - String METRICS_GC_ERRORS = METRICS_GC_PREFIX + "errors"; - String METRICS_GC_WAL_STARTED = METRICS_GC_PREFIX + "wal.started"; - String METRICS_GC_WAL_FINISHED = METRICS_GC_PREFIX + "wal.finished"; - String METRICS_GC_WAL_CANDIDATES = METRICS_GC_PREFIX + "wal.candidates"; - String METRICS_GC_WAL_IN_USE = METRICS_GC_PREFIX + "wal.in.use"; - String METRICS_GC_WAL_DELETED = METRICS_GC_PREFIX + "wal.deleted"; - String METRICS_GC_WAL_ERRORS = METRICS_GC_PREFIX + "wal.errors"; - String METRICS_GC_POST_OP_DURATION = METRICS_GC_PREFIX + "post.op.duration"; - String METRICS_GC_RUN_CYCLE = METRICS_GC_PREFIX + "run.cycle"; - - String METRICS_MAJC_PREFIX = "accumulo.tserver.compactions.majc."; - String METRICS_MAJC_QUEUED = METRICS_MAJC_PREFIX + "queued"; - String METRICS_MAJC_RUNNING = METRICS_MAJC_PREFIX + "running"; - String METRICS_MAJC_PAUSED = METRICS_MAJC_PREFIX + "paused"; - - String METRICS_MINC_PREFIX = "accumulo.tserver.compactions.minc."; - String METRICS_MINC_QUEUED = METRICS_MINC_PREFIX + "queued"; - String METRICS_MINC_RUNNING = METRICS_MINC_PREFIX + "running"; - String METRICS_MINC_PAUSED = METRICS_MINC_PREFIX + "paused"; - - String METRICS_SCAN_PREFIX = "accumulo.scan."; - String METRICS_SCAN_TIMES = METRICS_SCAN_PREFIX + "times"; - String METRICS_SCAN_OPEN_FILES = METRICS_SCAN_PREFIX + "files.open"; - String METRICS_SCAN_RESULTS = METRICS_SCAN_PREFIX + "result"; - String METRICS_SCAN_YIELDS = METRICS_SCAN_PREFIX + "yields"; - String METRICS_SCAN_START = METRICS_SCAN_PREFIX + "start"; - String METRICS_SCAN_CONTINUE = METRICS_SCAN_PREFIX + "continue"; - String METRICS_SCAN_CLOSE = METRICS_SCAN_PREFIX + "close"; - String METRICS_SCAN_RESERVATION_TOTAL_TIMER = METRICS_SCAN_PREFIX + "reservation.total.timer"; - String METRICS_SCAN_RESERVATION_WRITEOUT_TIMER = - METRICS_SCAN_PREFIX + "reservation.writeout.timer"; - String METRICS_SCAN_BUSY_TIMEOUT_COUNTER = METRICS_SCAN_PREFIX + "busy.timeout.count"; - String METRICS_SCAN_RESERVATION_CONFLICT_COUNTER = - METRICS_SCAN_PREFIX + "reservation.conflict.count"; - String METRICS_SCAN_QUERIES = METRICS_SCAN_PREFIX + "queries"; - String METRICS_SCAN_QUERY_SCAN_RESULTS = METRICS_SCAN_PREFIX + "query.results"; - String METRICS_SCAN_QUERY_SCAN_RESULTS_BYTES = METRICS_SCAN_PREFIX + "query.results.bytes"; - String METRICS_SCAN_SCANNED_ENTRIES = METRICS_SCAN_PREFIX + "query.scanned.entries"; - String METRICS_SCAN_PAUSED_FOR_MEM = METRICS_SCAN_PREFIX + "paused.for.memory"; - String METRICS_SCAN_RETURN_FOR_MEM = METRICS_SCAN_PREFIX + "return.early.for.memory"; - - String METRICS_SCAN_ZOMBIE_THREADS = METRICS_SCAN_PREFIX + "zombie.threads"; - String METRICS_SCAN_TABLET_METADATA_CACHE = METRICS_SCAN_PREFIX + "tablet.metadata.cache"; - - String METRICS_TSERVER_PREFIX = "accumulo.tserver."; - String METRICS_TSERVER_ENTRIES = METRICS_TSERVER_PREFIX + "entries"; - String METRICS_TSERVER_MEM_ENTRIES = METRICS_TSERVER_PREFIX + "entries.mem"; - String METRICS_TSERVER_MAJC_QUEUED = METRICS_TSERVER_PREFIX + "majc.queued"; - String METRICS_TSERVER_MAJC_RUNNING = METRICS_TSERVER_PREFIX + "majc.running"; - String METRICS_TSERVER_MAJC_STUCK = METRICS_TSERVER_PREFIX + "majc.stuck"; - String METRICS_TSERVER_MINC_QUEUED = METRICS_TSERVER_PREFIX + "minc.queued"; - String METRICS_TSERVER_MINC_RUNNING = METRICS_TSERVER_PREFIX + "minc.running"; - String METRICS_TSERVER_MINC_TOTAL = METRICS_TSERVER_PREFIX + "minc.total"; - String METRICS_TSERVER_TABLETS_LONG_ASSIGNMENTS = - METRICS_TSERVER_PREFIX + "tablets.assignments.warning"; - String METRICS_TSERVER_TABLETS_ONLINE = METRICS_TSERVER_PREFIX + "tablets.online"; - String METRICS_TSERVER_TABLETS_OPENING = METRICS_TSERVER_PREFIX + "tablets.opening"; - String METRICS_TSERVER_TABLETS_UNOPENED = METRICS_TSERVER_PREFIX + "tablets.unopened"; - String METRICS_TSERVER_TABLETS_FILES = METRICS_TSERVER_PREFIX + "tablets.files"; - String METRICS_TSERVER_HOLD = METRICS_TSERVER_PREFIX + "hold"; - String METRICS_TSERVER_INGEST_MUTATIONS = METRICS_TSERVER_PREFIX + "ingest.mutations"; - String METRICS_TSERVER_INGEST_BYTES = METRICS_TSERVER_PREFIX + "ingest.bytes"; - - String METRICS_THRIFT_PREFIX = "accumulo.thrift."; - String METRICS_THRIFT_EXECUTE = METRICS_THRIFT_PREFIX + "execute"; - String METRICS_THRIFT_IDLE = METRICS_THRIFT_PREFIX + "idle"; - - String METRICS_UPDATE_PREFIX = "accumulo.tserver.updates."; - String METRICS_UPDATE_ERRORS = METRICS_UPDATE_PREFIX + "error"; - String METRICS_UPDATE_COMMIT = METRICS_UPDATE_PREFIX + "commit"; - String METRICS_UPDATE_COMMIT_PREP = METRICS_UPDATE_COMMIT + ".prep"; - String METRICS_UPDATE_WALOG_WRITE = METRICS_UPDATE_PREFIX + "walog.write"; - String METRICS_UPDATE_MUTATION_ARRAY_SIZE = METRICS_UPDATE_PREFIX + "mutation.arrays.size"; - - String METRICS_BLOCKCACHE_PREFIX = "accumulo.blockcache."; - String METRICS_BLOCKCACHE_INDEX_HITCOUNT = METRICS_BLOCKCACHE_PREFIX + "index.hitcount"; - String METRICS_BLOCKCACHE_INDEX_REQUESTCOUNT = METRICS_BLOCKCACHE_PREFIX + "index.requestcount"; - String METRICS_BLOCKCACHE_INDEX_EVICTIONCOUNT = METRICS_BLOCKCACHE_PREFIX + "index.evictioncount"; - String METRICS_BLOCKCACHE_DATA_HITCOUNT = METRICS_BLOCKCACHE_PREFIX + "data.hitcount"; - String METRICS_BLOCKCACHE_DATA_REQUESTCOUNT = METRICS_BLOCKCACHE_PREFIX + "data.requestcount"; - String METRICS_BLOCKCACHE_DATA_EVICTIONCOUNT = METRICS_BLOCKCACHE_PREFIX + "data.evictioncount"; - String METRICS_BLOCKCACHE_SUMMARY_HITCOUNT = METRICS_BLOCKCACHE_PREFIX + "summary.hitcount"; - String METRICS_BLOCKCACHE_SUMMARY_REQUESTCOUNT = - METRICS_BLOCKCACHE_PREFIX + "summary.requestcount"; - String METRICS_BLOCKCACHE_SUMMARY_EVICTIONCOUNT = - METRICS_BLOCKCACHE_PREFIX + "summary.evictioncount"; - - String METRICS_MANAGER_BALANCER_MIGRATIONS_NEEDED = "accumulo.manager.balancer.migrations.needed"; - /** * Build Micrometer Meter objects and register them with the registry */ void registerMetrics(MeterRegistry registry); - /** - * Returns a new mutable mapping of metric field value to metric field name. - * - * @return map of field names to variable names. - */ - default Map<String,String> getMetricFields() { - Map<String,String> fields = new HashMap<>(); - for (Field f : MetricsProducer.class.getDeclaredFields()) { - if (Modifier.isStatic(f.getModifiers()) && f.getType().equals(String.class) - && !f.getName().contains("PREFIX")) { - try { - - fields.put((String) f.get(MetricsProducer.class), f.getName()); - } catch (IllegalArgumentException | IllegalAccessException e) { - // this shouldn't happen, but let's log it anyway - LOG.error("Error getting metric value for field: {}", f.getName()); - } - } - } - return fields; - } } diff --git a/server/base/src/main/java/org/apache/accumulo/server/compaction/PausedCompactionMetrics.java b/server/base/src/main/java/org/apache/accumulo/server/compaction/PausedCompactionMetrics.java index 29e6da06d0..4c0f69f866 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/compaction/PausedCompactionMetrics.java +++ b/server/base/src/main/java/org/apache/accumulo/server/compaction/PausedCompactionMetrics.java @@ -18,6 +18,9 @@ */ package org.apache.accumulo.server.compaction; +import static org.apache.accumulo.core.metrics.Metric.MAJC_PAUSED; +import static org.apache.accumulo.core.metrics.Metric.MINC_PAUSED; + import java.util.concurrent.atomic.AtomicLong; import org.apache.accumulo.core.metrics.MetricsProducer; @@ -40,9 +43,9 @@ public class PausedCompactionMetrics implements MetricsProducer { @Override public void registerMetrics(MeterRegistry registry) { - FunctionCounter.builder(METRICS_MAJC_PAUSED, majcPauseCount, AtomicLong::get) + FunctionCounter.builder(MAJC_PAUSED.getName(), majcPauseCount, AtomicLong::get) .description("major compaction pause count").register(registry); - FunctionCounter.builder(METRICS_MINC_PAUSED, mincPauseCount, AtomicLong::get) + FunctionCounter.builder(MINC_PAUSED.getName(), mincPauseCount, AtomicLong::get) .description("minor compactor pause count").register(registry); } diff --git a/server/base/src/main/java/org/apache/accumulo/server/metrics/ProcessMetrics.java b/server/base/src/main/java/org/apache/accumulo/server/metrics/ProcessMetrics.java index 69de547e0b..83def19228 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/metrics/ProcessMetrics.java +++ b/server/base/src/main/java/org/apache/accumulo/server/metrics/ProcessMetrics.java @@ -18,6 +18,9 @@ */ package org.apache.accumulo.server.metrics; +import static org.apache.accumulo.core.metrics.Metric.LOW_MEMORY; +import static org.apache.accumulo.core.metrics.Metric.SERVER_IDLE; + import java.util.List; import java.util.concurrent.atomic.AtomicInteger; @@ -38,8 +41,8 @@ public class ProcessMetrics implements MetricsProducer { @Override public void registerMetrics(MeterRegistry registry) { - registry.gauge(METRICS_LOW_MEMORY, List.of(), this, this::lowMemDetected); - registry.gauge(METRICS_SERVER_IDLE, isIdle, AtomicInteger::get); + registry.gauge(LOW_MEMORY.getName(), List.of(), this, this::lowMemDetected); + registry.gauge(SERVER_IDLE.getName(), isIdle, AtomicInteger::get); } private int lowMemDetected(ProcessMetrics processMetrics) { diff --git a/server/base/src/main/java/org/apache/accumulo/server/metrics/ThriftMetrics.java b/server/base/src/main/java/org/apache/accumulo/server/metrics/ThriftMetrics.java index c6288752ad..9fdf98a61c 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/metrics/ThriftMetrics.java +++ b/server/base/src/main/java/org/apache/accumulo/server/metrics/ThriftMetrics.java @@ -18,6 +18,9 @@ */ package org.apache.accumulo.server.metrics; +import static org.apache.accumulo.core.metrics.Metric.THRIFT_EXECUTE; +import static org.apache.accumulo.core.metrics.Metric.THRIFT_IDLE; + import org.apache.accumulo.core.metrics.MetricsProducer; import io.micrometer.core.instrument.DistributionSummary; @@ -40,8 +43,9 @@ public class ThriftMetrics implements MetricsProducer { @Override public void registerMetrics(MeterRegistry registry) { - idle = DistributionSummary.builder(METRICS_THRIFT_IDLE).baseUnit("ms").register(registry); - execute = DistributionSummary.builder(METRICS_THRIFT_EXECUTE).baseUnit("ms").register(registry); + idle = DistributionSummary.builder(THRIFT_IDLE.getName()).baseUnit("ms").register(registry); + execute = + DistributionSummary.builder(THRIFT_EXECUTE.getName()).baseUnit("ms").register(registry); } } diff --git a/server/base/src/test/java/org/apache/accumulo/server/metrics/ThriftMetricsTest.java b/server/base/src/test/java/org/apache/accumulo/server/metrics/ThriftMetricsTest.java index 91730d0582..c116bebac6 100644 --- a/server/base/src/test/java/org/apache/accumulo/server/metrics/ThriftMetricsTest.java +++ b/server/base/src/test/java/org/apache/accumulo/server/metrics/ThriftMetricsTest.java @@ -18,8 +18,8 @@ */ package org.apache.accumulo.server.metrics; -import static org.apache.accumulo.core.metrics.MetricsProducer.METRICS_THRIFT_EXECUTE; -import static org.apache.accumulo.core.metrics.MetricsProducer.METRICS_THRIFT_IDLE; +import static org.apache.accumulo.core.metrics.Metric.THRIFT_EXECUTE; +import static org.apache.accumulo.core.metrics.Metric.THRIFT_IDLE; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertInstanceOf; @@ -57,7 +57,7 @@ class ThriftMetricsTest { assertInstanceOf(DistributionSummary.class, m); assertFalse(m instanceof NoopDistributionSummary); }); - assertTrue(registry.get(METRICS_THRIFT_IDLE).summary().count() > 0); - assertTrue(registry.get(METRICS_THRIFT_EXECUTE).summary().count() > 0); + assertTrue(registry.get(THRIFT_IDLE.getName()).summary().count() > 0); + assertTrue(registry.get(THRIFT_EXECUTE.getName()).summary().count() > 0); } } diff --git a/server/compactor/src/main/java/org/apache/accumulo/compactor/Compactor.java b/server/compactor/src/main/java/org/apache/accumulo/compactor/Compactor.java index b7b0470d58..4658bd8a5a 100644 --- a/server/compactor/src/main/java/org/apache/accumulo/compactor/Compactor.java +++ b/server/compactor/src/main/java/org/apache/accumulo/compactor/Compactor.java @@ -21,6 +21,9 @@ package org.apache.accumulo.compactor; import static com.google.common.util.concurrent.Uninterruptibles.sleepUninterruptibly; import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.concurrent.TimeUnit.MINUTES; +import static org.apache.accumulo.core.metrics.Metric.COMPACTOR_ENTRIES_READ; +import static org.apache.accumulo.core.metrics.Metric.COMPACTOR_ENTRIES_WRITTEN; +import static org.apache.accumulo.core.metrics.Metric.COMPACTOR_MAJC_STUCK; import static org.apache.accumulo.core.util.LazySingletons.RANDOM; import java.io.IOException; @@ -179,14 +182,14 @@ public class Compactor extends AbstractServer implements MetricsProducer, Compac @Override public void registerMetrics(MeterRegistry registry) { super.registerMetrics(registry); - FunctionCounter.builder(METRICS_COMPACTOR_ENTRIES_READ, this, Compactor::getTotalEntriesRead) + FunctionCounter.builder(COMPACTOR_ENTRIES_READ.getName(), this, Compactor::getTotalEntriesRead) .description("Number of entries read by all compactions that have run on this compactor") .register(registry); FunctionCounter - .builder(METRICS_COMPACTOR_ENTRIES_WRITTEN, this, Compactor::getTotalEntriesWritten) + .builder(COMPACTOR_ENTRIES_WRITTEN.getName(), this, Compactor::getTotalEntriesWritten) .description("Number of entries written by all compactions that have run on this compactor") .register(registry); - LongTaskTimer timer = LongTaskTimer.builder(METRICS_COMPACTOR_MAJC_STUCK) + LongTaskTimer timer = LongTaskTimer.builder(COMPACTOR_MAJC_STUCK.getName()) .description("Number and duration of stuck major compactions").register(registry); CompactionWatcher.setTimer(timer); } diff --git a/server/gc/src/main/java/org/apache/accumulo/gc/metrics/GcMetrics.java b/server/gc/src/main/java/org/apache/accumulo/gc/metrics/GcMetrics.java index 7a9ca9afcd..9a88f85316 100644 --- a/server/gc/src/main/java/org/apache/accumulo/gc/metrics/GcMetrics.java +++ b/server/gc/src/main/java/org/apache/accumulo/gc/metrics/GcMetrics.java @@ -18,6 +18,21 @@ */ package org.apache.accumulo.gc.metrics; +import static org.apache.accumulo.core.metrics.Metric.GC_CANDIDATES; +import static org.apache.accumulo.core.metrics.Metric.GC_DELETED; +import static org.apache.accumulo.core.metrics.Metric.GC_ERRORS; +import static org.apache.accumulo.core.metrics.Metric.GC_FINISHED; +import static org.apache.accumulo.core.metrics.Metric.GC_IN_USE; +import static org.apache.accumulo.core.metrics.Metric.GC_POST_OP_DURATION; +import static org.apache.accumulo.core.metrics.Metric.GC_RUN_CYCLE; +import static org.apache.accumulo.core.metrics.Metric.GC_STARTED; +import static org.apache.accumulo.core.metrics.Metric.GC_WAL_CANDIDATES; +import static org.apache.accumulo.core.metrics.Metric.GC_WAL_DELETED; +import static org.apache.accumulo.core.metrics.Metric.GC_WAL_ERRORS; +import static org.apache.accumulo.core.metrics.Metric.GC_WAL_FINISHED; +import static org.apache.accumulo.core.metrics.Metric.GC_WAL_IN_USE; +import static org.apache.accumulo.core.metrics.Metric.GC_WAL_STARTED; + import java.util.concurrent.TimeUnit; import org.apache.accumulo.core.metrics.MetricsProducer; @@ -37,40 +52,40 @@ public class GcMetrics implements MetricsProducer { @Override public void registerMetrics(MeterRegistry registry) { - Gauge.builder(METRICS_GC_STARTED, metricValues, v -> v.getLastCollect().getStarted()) + Gauge.builder(GC_STARTED.getName(), metricValues, v -> v.getLastCollect().getStarted()) .description("Timestamp GC file collection cycle started").register(registry); - Gauge.builder(METRICS_GC_FINISHED, metricValues, v -> v.getLastCollect().getFinished()) + Gauge.builder(GC_FINISHED.getName(), metricValues, v -> v.getLastCollect().getFinished()) .description("Timestamp GC file collect cycle finished").register(registry); - Gauge.builder(METRICS_GC_CANDIDATES, metricValues, v -> v.getLastCollect().getCandidates()) + Gauge.builder(GC_CANDIDATES.getName(), metricValues, v -> v.getLastCollect().getCandidates()) .description("Number of files that are candidates for deletion").register(registry); - Gauge.builder(METRICS_GC_IN_USE, metricValues, v -> v.getLastCollect().getInUse()) + Gauge.builder(GC_IN_USE.getName(), metricValues, v -> v.getLastCollect().getInUse()) .description("Number of candidate files still in use").register(registry); - Gauge.builder(METRICS_GC_DELETED, metricValues, v -> v.getLastCollect().getDeleted()) + Gauge.builder(GC_DELETED.getName(), metricValues, v -> v.getLastCollect().getDeleted()) .description("Number of candidate files deleted").register(registry); - Gauge.builder(METRICS_GC_ERRORS, metricValues, v -> v.getLastCollect().getErrors()) + Gauge.builder(GC_ERRORS.getName(), metricValues, v -> v.getLastCollect().getErrors()) .description("Number of candidate deletion errors").register(registry); // WAL metrics Gauges - Gauge.builder(METRICS_GC_WAL_STARTED, metricValues, v -> v.getLastWalCollect().getStarted()) + Gauge.builder(GC_WAL_STARTED.getName(), metricValues, v -> v.getLastWalCollect().getStarted()) .description("Timestamp GC WAL collection cycle started").register(registry); - Gauge.builder(METRICS_GC_WAL_FINISHED, metricValues, v -> v.getLastWalCollect().getFinished()) + Gauge.builder(GC_WAL_FINISHED.getName(), metricValues, v -> v.getLastWalCollect().getFinished()) .description("Timestamp GC WAL collect cycle finished").register(registry); Gauge - .builder(METRICS_GC_WAL_CANDIDATES, metricValues, + .builder(GC_WAL_CANDIDATES.getName(), metricValues, v -> v.getLastWalCollect().getCandidates()) .description("Number of files that are candidates for deletion").register(registry); - Gauge.builder(METRICS_GC_WAL_IN_USE, metricValues, v -> v.getLastWalCollect().getInUse()) + Gauge.builder(GC_WAL_IN_USE.getName(), metricValues, v -> v.getLastWalCollect().getInUse()) .description("Number of wal file candidates that are still in use").register(registry); - Gauge.builder(METRICS_GC_WAL_DELETED, metricValues, v -> v.getLastWalCollect().getDeleted()) + Gauge.builder(GC_WAL_DELETED.getName(), metricValues, v -> v.getLastWalCollect().getDeleted()) .description("Number of candidate wal files deleted").register(registry); - Gauge.builder(METRICS_GC_WAL_ERRORS, metricValues, v -> v.getLastWalCollect().getErrors()) + Gauge.builder(GC_WAL_ERRORS.getName(), metricValues, v -> v.getLastWalCollect().getErrors()) .description("Number candidate wal file deletion errors").register(registry); Gauge - .builder(METRICS_GC_POST_OP_DURATION, metricValues, + .builder(GC_POST_OP_DURATION.getName(), metricValues, v -> TimeUnit.NANOSECONDS.toMillis(v.getPostOpDurationNanos())) .description("GC metadata table post operation duration in milliseconds") .register(registry); - Gauge.builder(METRICS_GC_RUN_CYCLE, metricValues, GcCycleMetrics::getRunCycleCount) + Gauge.builder(GC_RUN_CYCLE.getName(), metricValues, GcCycleMetrics::getRunCycleCount) .description("gauge incremented each gc cycle run, rest on process start") .register(registry); diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/metrics/BalancerMetrics.java b/server/manager/src/main/java/org/apache/accumulo/manager/metrics/BalancerMetrics.java index 01aa9e3052..820f49b139 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/metrics/BalancerMetrics.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/metrics/BalancerMetrics.java @@ -18,6 +18,8 @@ */ package org.apache.accumulo.manager.metrics; +import static org.apache.accumulo.core.metrics.Metric.MANAGER_BALANCER_MIGRATIONS_NEEDED; + import java.util.function.LongSupplier; import org.apache.accumulo.core.metrics.MetricsProducer; @@ -44,7 +46,7 @@ public class BalancerMetrics implements MetricsProducer { @Override public void registerMetrics(MeterRegistry registry) { Gauge - .builder(METRICS_MANAGER_BALANCER_MIGRATIONS_NEEDED, this, + .builder(MANAGER_BALANCER_MIGRATIONS_NEEDED.getName(), this, BalancerMetrics::getMigratingCount) .description("Overall total migrations that need to complete").register(registry); } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/metrics/fate/FateMetrics.java b/server/manager/src/main/java/org/apache/accumulo/manager/metrics/fate/FateMetrics.java index 2f66aef256..ebbbec4316 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/metrics/fate/FateMetrics.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/metrics/fate/FateMetrics.java @@ -18,6 +18,12 @@ */ package org.apache.accumulo.manager.metrics.fate; +import static org.apache.accumulo.core.metrics.Metric.FATE_ERRORS; +import static org.apache.accumulo.core.metrics.Metric.FATE_OPS; +import static org.apache.accumulo.core.metrics.Metric.FATE_OPS_ACTIVITY; +import static org.apache.accumulo.core.metrics.Metric.FATE_TX; +import static org.apache.accumulo.core.metrics.Metric.FATE_TYPE_IN_PROGRESS; + import java.util.List; import java.util.Map.Entry; import java.util.concurrent.ScheduledExecutorService; @@ -122,35 +128,35 @@ public class FateMetrics implements MetricsProducer { } metricValues.getOpTypeCounters().forEach((name, count) -> { - Metrics.gauge(METRICS_FATE_TYPE_IN_PROGRESS, Tags.of(OP_TYPE_TAG, name), count); + Metrics.gauge(FATE_TYPE_IN_PROGRESS.getName(), Tags.of(OP_TYPE_TAG, name), count); }); } @Override public void registerMetrics(final MeterRegistry registry) { - totalCurrentOpsGauge = registry.gauge(METRICS_FATE_OPS, new AtomicLong(0)); - totalOpsGauge = registry.gauge(METRICS_FATE_OPS_ACTIVITY, new AtomicLong(0)); - fateErrorsGauge = registry.gauge(METRICS_FATE_ERRORS, List.of(Tag.of("type", "zk.connection")), - new AtomicLong(0)); - newTxGauge = registry.gauge(METRICS_FATE_TX, + totalCurrentOpsGauge = registry.gauge(FATE_OPS.getName(), new AtomicLong(0)); + totalOpsGauge = registry.gauge(FATE_OPS_ACTIVITY.getName(), new AtomicLong(0)); + fateErrorsGauge = registry.gauge(FATE_ERRORS.getName(), + List.of(Tag.of("type", "zk.connection")), new AtomicLong(0)); + newTxGauge = registry.gauge(FATE_TX.getName(), List.of(Tag.of("state", ReadOnlyTStore.TStatus.NEW.name().toLowerCase())), new AtomicLong(0)); - submittedTxGauge = registry.gauge(METRICS_FATE_TX, + submittedTxGauge = registry.gauge(FATE_TX.getName(), List.of(Tag.of("state", ReadOnlyTStore.TStatus.SUBMITTED.name().toLowerCase())), new AtomicLong(0)); - inProgressTxGauge = registry.gauge(METRICS_FATE_TX, + inProgressTxGauge = registry.gauge(FATE_TX.getName(), List.of(Tag.of("state", ReadOnlyTStore.TStatus.IN_PROGRESS.name().toLowerCase())), new AtomicLong(0)); - failedInProgressTxGauge = registry.gauge(METRICS_FATE_TX, + failedInProgressTxGauge = registry.gauge(FATE_TX.getName(), List.of(Tag.of("state", ReadOnlyTStore.TStatus.FAILED_IN_PROGRESS.name().toLowerCase())), new AtomicLong(0)); - failedTxGauge = registry.gauge(METRICS_FATE_TX, + failedTxGauge = registry.gauge(FATE_TX.getName(), List.of(Tag.of("state", ReadOnlyTStore.TStatus.FAILED.name().toLowerCase())), new AtomicLong(0)); - successfulTxGauge = registry.gauge(METRICS_FATE_TX, + successfulTxGauge = registry.gauge(FATE_TX.getName(), List.of(Tag.of("state", ReadOnlyTStore.TStatus.SUCCESSFUL.name().toLowerCase())), new AtomicLong(0)); - unknownTxGauge = registry.gauge(METRICS_FATE_TX, + unknownTxGauge = registry.gauge(FATE_TX.getName(), List.of(Tag.of("state", ReadOnlyTStore.TStatus.UNKNOWN.name().toLowerCase())), new AtomicLong(0)); diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/BlockCacheMetrics.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/BlockCacheMetrics.java index 6444e74ac2..b6325654d8 100644 --- a/server/tserver/src/main/java/org/apache/accumulo/tserver/BlockCacheMetrics.java +++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/BlockCacheMetrics.java @@ -18,6 +18,16 @@ */ package org.apache.accumulo.tserver; +import static org.apache.accumulo.core.metrics.Metric.BLOCKCACHE_DATA_EVICTIONCOUNT; +import static org.apache.accumulo.core.metrics.Metric.BLOCKCACHE_DATA_HITCOUNT; +import static org.apache.accumulo.core.metrics.Metric.BLOCKCACHE_DATA_REQUESTCOUNT; +import static org.apache.accumulo.core.metrics.Metric.BLOCKCACHE_INDEX_EVICTIONCOUNT; +import static org.apache.accumulo.core.metrics.Metric.BLOCKCACHE_INDEX_HITCOUNT; +import static org.apache.accumulo.core.metrics.Metric.BLOCKCACHE_INDEX_REQUESTCOUNT; +import static org.apache.accumulo.core.metrics.Metric.BLOCKCACHE_SUMMARY_EVICTIONCOUNT; +import static org.apache.accumulo.core.metrics.Metric.BLOCKCACHE_SUMMARY_HITCOUNT; +import static org.apache.accumulo.core.metrics.Metric.BLOCKCACHE_SUMMARY_REQUESTCOUNT; + import java.util.function.ToDoubleFunction; import org.apache.accumulo.core.metrics.MetricsProducer; @@ -44,26 +54,27 @@ public class BlockCacheMetrics implements MetricsProducer { ToDoubleFunction<BlockCache> getRequestCount = cache -> cache.getStats().requestCount(); ToDoubleFunction<BlockCache> getEvictionCount = cache -> cache.getStats().evictionCount(); - FunctionCounter.builder(METRICS_BLOCKCACHE_INDEX_HITCOUNT, indexCache, getHitCount) + FunctionCounter.builder(BLOCKCACHE_INDEX_HITCOUNT.getName(), indexCache, getHitCount) .description("Index block cache hit count").register(registry); - FunctionCounter.builder(METRICS_BLOCKCACHE_INDEX_REQUESTCOUNT, indexCache, getRequestCount) + FunctionCounter.builder(BLOCKCACHE_INDEX_REQUESTCOUNT.getName(), indexCache, getRequestCount) .description("Index block cache request count").register(registry); - FunctionCounter.builder(METRICS_BLOCKCACHE_INDEX_EVICTIONCOUNT, indexCache, getEvictionCount) + FunctionCounter.builder(BLOCKCACHE_INDEX_EVICTIONCOUNT.getName(), indexCache, getEvictionCount) .description("Index block cache eviction count").register(registry); - FunctionCounter.builder(METRICS_BLOCKCACHE_DATA_HITCOUNT, dataCache, getHitCount) + FunctionCounter.builder(BLOCKCACHE_DATA_HITCOUNT.getName(), dataCache, getHitCount) .description("Data block cache hit count").register(registry); - FunctionCounter.builder(METRICS_BLOCKCACHE_DATA_REQUESTCOUNT, dataCache, getRequestCount) + FunctionCounter.builder(BLOCKCACHE_DATA_REQUESTCOUNT.getName(), dataCache, getRequestCount) .description("Data block cache request count").register(registry); - FunctionCounter.builder(METRICS_BLOCKCACHE_DATA_EVICTIONCOUNT, dataCache, getEvictionCount) + FunctionCounter.builder(BLOCKCACHE_DATA_EVICTIONCOUNT.getName(), dataCache, getEvictionCount) .description("Data block cache eviction count").register(registry); - FunctionCounter.builder(METRICS_BLOCKCACHE_SUMMARY_HITCOUNT, summaryCache, getHitCount) + FunctionCounter.builder(BLOCKCACHE_SUMMARY_HITCOUNT.getName(), summaryCache, getHitCount) .description("Summary block cache hit count").register(registry); - FunctionCounter.builder(METRICS_BLOCKCACHE_SUMMARY_REQUESTCOUNT, summaryCache, getRequestCount) + FunctionCounter + .builder(BLOCKCACHE_SUMMARY_REQUESTCOUNT.getName(), summaryCache, getRequestCount) .description("Summary block cache request count").register(registry); FunctionCounter - .builder(METRICS_BLOCKCACHE_SUMMARY_EVICTIONCOUNT, summaryCache, getEvictionCount) + .builder(BLOCKCACHE_SUMMARY_EVICTIONCOUNT.getName(), summaryCache, getEvictionCount) .description("Summary block cache eviction count").register(registry); } } diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/ScanServerMetrics.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/ScanServerMetrics.java index 46a3793861..12d85f1d22 100644 --- a/server/tserver/src/main/java/org/apache/accumulo/tserver/ScanServerMetrics.java +++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/ScanServerMetrics.java @@ -18,6 +18,12 @@ */ package org.apache.accumulo.tserver; +import static org.apache.accumulo.core.metrics.Metric.SCAN_BUSY_TIMEOUT_COUNT; +import static org.apache.accumulo.core.metrics.Metric.SCAN_RESERVATION_CONFLICT_COUNTER; +import static org.apache.accumulo.core.metrics.Metric.SCAN_RESERVATION_TOTAL_TIMER; +import static org.apache.accumulo.core.metrics.Metric.SCAN_RESERVATION_WRITEOUT_TIMER; +import static org.apache.accumulo.core.metrics.Metric.SCAN_TABLET_METADATA_CACHE; + import java.time.Duration; import java.util.concurrent.atomic.AtomicLong; @@ -49,15 +55,14 @@ public class ScanServerMetrics implements MetricsProducer { @Override public void registerMetrics(MeterRegistry registry) { - totalReservationTimer = Timer.builder(MetricsProducer.METRICS_SCAN_RESERVATION_TOTAL_TIMER) + totalReservationTimer = Timer.builder(SCAN_RESERVATION_TOTAL_TIMER.getName()) .description("Time to reserve a tablets files for scan").register(registry); - writeOutReservationTimer = Timer - .builder(MetricsProducer.METRICS_SCAN_RESERVATION_WRITEOUT_TIMER) + writeOutReservationTimer = Timer.builder(SCAN_RESERVATION_WRITEOUT_TIMER.getName()) .description("Time to write out a tablets file reservations for scan").register(registry); - FunctionCounter.builder(METRICS_SCAN_BUSY_TIMEOUT_COUNTER, busyTimeoutCount, AtomicLong::get) + FunctionCounter.builder(SCAN_BUSY_TIMEOUT_COUNT.getName(), busyTimeoutCount, AtomicLong::get) .description("The number of scans where a busy timeout happened").register(registry); FunctionCounter - .builder(METRICS_SCAN_RESERVATION_CONFLICT_COUNTER, reservationConflictCount, + .builder(SCAN_RESERVATION_CONFLICT_COUNTER.getName(), reservationConflictCount, AtomicLong::get) .description( "Counts instances where file reservation attempts for scans encountered conflicts") @@ -67,7 +72,7 @@ public class ScanServerMetrics implements MetricsProducer { Preconditions.checkState(tabletMetadataCache.policy().isRecordingStats(), "Attempted to instrument cache that is not recording stats."); CaffeineCacheMetrics.monitor(registry, tabletMetadataCache, - METRICS_SCAN_TABLET_METADATA_CACHE); + SCAN_TABLET_METADATA_CACHE.getName()); } } diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/metrics/CompactionExecutorsMetrics.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/metrics/CompactionExecutorsMetrics.java index 59c66e1d35..7f5a5b96af 100644 --- a/server/tserver/src/main/java/org/apache/accumulo/tserver/metrics/CompactionExecutorsMetrics.java +++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/metrics/CompactionExecutorsMetrics.java @@ -18,6 +18,9 @@ */ package org.apache.accumulo.tserver.metrics; +import static org.apache.accumulo.core.metrics.Metric.MAJC_QUEUED; +import static org.apache.accumulo.core.metrics.Metric.MAJC_RUNNING; + import java.util.Collection; import java.util.HashMap; import java.util.HashSet; @@ -88,9 +91,9 @@ public class CompactionExecutorsMetrics implements MetricsProducer { CeMetrics cem = ceMetricsMap.computeIfAbsent(ceid, id -> { CeMetrics m = new CeMetrics(); if (registry != null) { - m.queued = registry.gauge(METRICS_MAJC_QUEUED, Tags.of("id", ceid.canonical()), + m.queued = registry.gauge(MAJC_QUEUED.getName(), Tags.of("id", ceid.canonical()), new AtomicInteger(0)); - m.running = registry.gauge(METRICS_MAJC_RUNNING, Tags.of("id", ceid.canonical()), + m.running = registry.gauge(MAJC_RUNNING.getName(), Tags.of("id", ceid.canonical()), new AtomicInteger(0)); } return m; @@ -119,10 +122,10 @@ public class CompactionExecutorsMetrics implements MetricsProducer { ExMetrics exm = exCeMetricsMap.computeIfAbsent(ecm.ceid, id -> { ExMetrics m = new ExMetrics(); if (registry != null) { - m.queued = registry.gauge(METRICS_MAJC_QUEUED, Tags.of("id", ecm.ceid.canonical()), - new AtomicInteger(0)); - m.running = registry.gauge(METRICS_MAJC_RUNNING, Tags.of("id", ecm.ceid.canonical()), + m.queued = registry.gauge(MAJC_QUEUED.getName(), Tags.of("id", ecm.ceid.canonical()), new AtomicInteger(0)); + m.running = registry.gauge(MAJC_RUNNING.getName(), + Tags.of("id", ecm.ceid.canonical()), new AtomicInteger(0)); } return m; }); diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/metrics/TabletServerMetrics.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/metrics/TabletServerMetrics.java index 70b0c4980b..26bbd11adb 100644 --- a/server/tserver/src/main/java/org/apache/accumulo/tserver/metrics/TabletServerMetrics.java +++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/metrics/TabletServerMetrics.java @@ -18,6 +18,25 @@ */ package org.apache.accumulo.tserver.metrics; +import static org.apache.accumulo.core.metrics.Metric.COMPACTOR_ENTRIES_READ; +import static org.apache.accumulo.core.metrics.Metric.COMPACTOR_ENTRIES_WRITTEN; +import static org.apache.accumulo.core.metrics.Metric.TSERVER_ENTRIES; +import static org.apache.accumulo.core.metrics.Metric.TSERVER_HOLD; +import static org.apache.accumulo.core.metrics.Metric.TSERVER_INGEST_BYTES; +import static org.apache.accumulo.core.metrics.Metric.TSERVER_INGEST_MUTATIONS; +import static org.apache.accumulo.core.metrics.Metric.TSERVER_MAJC_QUEUED; +import static org.apache.accumulo.core.metrics.Metric.TSERVER_MAJC_RUNNING; +import static org.apache.accumulo.core.metrics.Metric.TSERVER_MAJC_STUCK; +import static org.apache.accumulo.core.metrics.Metric.TSERVER_MEM_ENTRIES; +import static org.apache.accumulo.core.metrics.Metric.TSERVER_MINC_QUEUED; +import static org.apache.accumulo.core.metrics.Metric.TSERVER_MINC_RUNNING; +import static org.apache.accumulo.core.metrics.Metric.TSERVER_MINC_TOTAL; +import static org.apache.accumulo.core.metrics.Metric.TSERVER_TABLETS_FILES; +import static org.apache.accumulo.core.metrics.Metric.TSERVER_TABLETS_LONG_ASSIGNMENTS; +import static org.apache.accumulo.core.metrics.Metric.TSERVER_TABLETS_ONLINE; +import static org.apache.accumulo.core.metrics.Metric.TSERVER_TABLETS_OPENING; +import static org.apache.accumulo.core.metrics.Metric.TSERVER_TABLETS_UNOPENED; + import org.apache.accumulo.core.metrics.MetricsProducer; import org.apache.accumulo.server.compaction.CompactionWatcher; import org.apache.accumulo.server.compaction.FileCompactor; @@ -47,58 +66,62 @@ public class TabletServerMetrics implements MetricsProducer { @Override public void registerMetrics(MeterRegistry registry) { FunctionCounter - .builder(METRICS_COMPACTOR_ENTRIES_READ, this, TabletServerMetrics::getTotalEntriesRead) + .builder(COMPACTOR_ENTRIES_READ.getName(), this, TabletServerMetrics::getTotalEntriesRead) .description("Number of entries read by all compactions that have run on this tserver") .register(registry); FunctionCounter - .builder(METRICS_COMPACTOR_ENTRIES_WRITTEN, this, + .builder(COMPACTOR_ENTRIES_WRITTEN.getName(), this, TabletServerMetrics::getTotalEntriesWritten) .description("Number of entries written by all compactions that have run on this tserver") .register(registry); - LongTaskTimer timer = LongTaskTimer.builder(METRICS_TSERVER_MAJC_STUCK) + LongTaskTimer timer = LongTaskTimer.builder(TSERVER_MAJC_STUCK.getName()) .description("Number and duration of stuck major compactions").register(registry); CompactionWatcher.setTimer(timer); Gauge - .builder(METRICS_TSERVER_TABLETS_LONG_ASSIGNMENTS, util, + .builder(TSERVER_TABLETS_LONG_ASSIGNMENTS.getName(), util, TabletServerMetricsUtil::getLongTabletAssignments) .description("Number of tablet assignments that are taking a long time").register(registry); - Gauge.builder(METRICS_TSERVER_ENTRIES, util, TabletServerMetricsUtil::getEntries) + Gauge.builder(TSERVER_ENTRIES.getName(), util, TabletServerMetricsUtil::getEntries) .description("Number of entries").register(registry); - Gauge.builder(METRICS_TSERVER_MEM_ENTRIES, util, TabletServerMetricsUtil::getEntriesInMemory) + Gauge.builder(TSERVER_MEM_ENTRIES.getName(), util, TabletServerMetricsUtil::getEntriesInMemory) .description("Number of entries in memory").register(registry); - Gauge.builder(METRICS_TSERVER_MAJC_RUNNING, util, TabletServerMetricsUtil::getMajorCompactions) + Gauge + .builder(TSERVER_MAJC_RUNNING.getName(), util, TabletServerMetricsUtil::getMajorCompactions) .description("Number of active major compactions").register(registry); Gauge - .builder(METRICS_TSERVER_MAJC_QUEUED, util, + .builder(TSERVER_MAJC_QUEUED.getName(), util, TabletServerMetricsUtil::getMajorCompactionsQueued) .description("Number of queued major compactions").register(registry); - Gauge.builder(METRICS_TSERVER_MINC_RUNNING, util, TabletServerMetricsUtil::getMinorCompactions) + Gauge + .builder(TSERVER_MINC_RUNNING.getName(), util, TabletServerMetricsUtil::getMinorCompactions) .description("Number of active minor compactions").register(registry); Gauge - .builder(METRICS_TSERVER_MINC_QUEUED, util, + .builder(TSERVER_MINC_QUEUED.getName(), util, TabletServerMetricsUtil::getMinorCompactionsQueued) .description("Number of queued minor compactions").register(registry); - Gauge.builder(METRICS_TSERVER_TABLETS_ONLINE, util, TabletServerMetricsUtil::getOnlineCount) + Gauge.builder(TSERVER_TABLETS_ONLINE.getName(), util, TabletServerMetricsUtil::getOnlineCount) .description("Number of online tablets").register(registry); - Gauge.builder(METRICS_TSERVER_TABLETS_OPENING, util, TabletServerMetricsUtil::getOpeningCount) + Gauge.builder(TSERVER_TABLETS_OPENING.getName(), util, TabletServerMetricsUtil::getOpeningCount) .description("Number of opening tablets").register(registry); - Gauge.builder(METRICS_TSERVER_TABLETS_UNOPENED, util, TabletServerMetricsUtil::getUnopenedCount) + Gauge + .builder(TSERVER_TABLETS_UNOPENED.getName(), util, + TabletServerMetricsUtil::getUnopenedCount) .description("Number of unopened tablets").register(registry); Gauge - .builder(METRICS_TSERVER_MINC_TOTAL, util, + .builder(TSERVER_MINC_TOTAL.getName(), util, TabletServerMetricsUtil::getTotalMinorCompactions) .description("Total number of minor compactions performed").register(registry); Gauge - .builder(METRICS_TSERVER_TABLETS_FILES, util, + .builder(TSERVER_TABLETS_FILES.getName(), util, TabletServerMetricsUtil::getAverageFilesPerTablet) .description("Number of files per tablet").register(registry); - Gauge.builder(METRICS_TSERVER_HOLD, util, TabletServerMetricsUtil::getHoldTime) + Gauge.builder(TSERVER_HOLD.getName(), util, TabletServerMetricsUtil::getHoldTime) .description("Time commits held").register(registry); - Gauge.builder(METRICS_TSERVER_INGEST_MUTATIONS, util, TabletServerMetricsUtil::getIngestCount) + Gauge.builder(TSERVER_INGEST_MUTATIONS.getName(), util, TabletServerMetricsUtil::getIngestCount) .description("Ingest rate (entries/sec)").register(registry); - Gauge.builder(METRICS_TSERVER_INGEST_BYTES, util, TabletServerMetricsUtil::getIngestByteCount) + Gauge.builder(TSERVER_INGEST_BYTES.getName(), util, TabletServerMetricsUtil::getIngestByteCount) .description("Ingest rate (bytes/sec)").register(registry); } } diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/metrics/TabletServerMinCMetrics.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/metrics/TabletServerMinCMetrics.java index bf95b00262..7bc3e5bc85 100644 --- a/server/tserver/src/main/java/org/apache/accumulo/tserver/metrics/TabletServerMinCMetrics.java +++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/metrics/TabletServerMinCMetrics.java @@ -18,6 +18,9 @@ */ package org.apache.accumulo.tserver.metrics; +import static org.apache.accumulo.core.metrics.Metric.MINC_QUEUED; +import static org.apache.accumulo.core.metrics.Metric.MINC_RUNNING; + import java.time.Duration; import org.apache.accumulo.core.metrics.MetricsProducer; @@ -41,10 +44,10 @@ public class TabletServerMinCMetrics implements MetricsProducer { @Override public void registerMetrics(MeterRegistry registry) { - activeMinc = Timer.builder(METRICS_MINC_RUNNING).description("Minor compactions time active") + activeMinc = Timer.builder(MINC_RUNNING.getName()).description("Minor compactions time active") .register(registry); - queuedMinc = Timer.builder(METRICS_MINC_QUEUED) + queuedMinc = Timer.builder(MINC_QUEUED.getName()) .description("Queued minor compactions time queued").register(registry); } diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/metrics/TabletServerScanMetrics.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/metrics/TabletServerScanMetrics.java index 612045cb90..d5848722cb 100644 --- a/server/tserver/src/main/java/org/apache/accumulo/tserver/metrics/TabletServerScanMetrics.java +++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/metrics/TabletServerScanMetrics.java @@ -18,6 +18,22 @@ */ package org.apache.accumulo.tserver.metrics; +import static org.apache.accumulo.core.metrics.Metric.SCAN_BUSY_TIMEOUT_COUNT; +import static org.apache.accumulo.core.metrics.Metric.SCAN_CLOSE; +import static org.apache.accumulo.core.metrics.Metric.SCAN_CONTINUE; +import static org.apache.accumulo.core.metrics.Metric.SCAN_OPEN_FILES; +import static org.apache.accumulo.core.metrics.Metric.SCAN_PAUSED_FOR_MEM; +import static org.apache.accumulo.core.metrics.Metric.SCAN_QUERIES; +import static org.apache.accumulo.core.metrics.Metric.SCAN_QUERY_SCAN_RESULTS; +import static org.apache.accumulo.core.metrics.Metric.SCAN_QUERY_SCAN_RESULTS_BYTES; +import static org.apache.accumulo.core.metrics.Metric.SCAN_RESULTS; +import static org.apache.accumulo.core.metrics.Metric.SCAN_RETURN_FOR_MEM; +import static org.apache.accumulo.core.metrics.Metric.SCAN_SCANNED_ENTRIES; +import static org.apache.accumulo.core.metrics.Metric.SCAN_START; +import static org.apache.accumulo.core.metrics.Metric.SCAN_TIMES; +import static org.apache.accumulo.core.metrics.Metric.SCAN_YIELDS; +import static org.apache.accumulo.core.metrics.Metric.SCAN_ZOMBIE_THREADS; + import java.time.Duration; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; @@ -121,36 +137,39 @@ public class TabletServerScanMetrics implements MetricsProducer { @Override public void registerMetrics(MeterRegistry registry) { - Gauge.builder(METRICS_SCAN_OPEN_FILES, openFiles::get) + Gauge.builder(SCAN_OPEN_FILES.getName(), openFiles::get) .description("Number of files open for scans").register(registry); - scans = Timer.builder(METRICS_SCAN_TIMES).description("Scans").register(registry); - resultsPerScan = DistributionSummary.builder(METRICS_SCAN_RESULTS) + scans = Timer.builder(SCAN_TIMES.getName()).description("Scans").register(registry); + resultsPerScan = DistributionSummary.builder(SCAN_RESULTS.getName()) .description("Results per scan").register(registry); yields = - DistributionSummary.builder(METRICS_SCAN_YIELDS).description("yields").register(registry); - FunctionCounter.builder(METRICS_SCAN_START, this.startScanCalls, AtomicLong::get) + DistributionSummary.builder(SCAN_YIELDS.getName()).description("yields").register(registry); + FunctionCounter.builder(SCAN_START.getName(), this.startScanCalls, AtomicLong::get) .description("calls to start a scan / multiscan").register(registry); - FunctionCounter.builder(METRICS_SCAN_CONTINUE, this.continueScanCalls, AtomicLong::get) + FunctionCounter.builder(SCAN_CONTINUE.getName(), this.continueScanCalls, AtomicLong::get) .description("calls to continue a scan / multiscan").register(registry); - FunctionCounter.builder(METRICS_SCAN_CLOSE, this.closeScanCalls, AtomicLong::get) + FunctionCounter.builder(SCAN_CLOSE.getName(), this.closeScanCalls, AtomicLong::get) .description("calls to close a scan / multiscan").register(registry); FunctionCounter - .builder(METRICS_SCAN_BUSY_TIMEOUT_COUNTER, this.busyTimeoutCount, AtomicLong::get) + .builder(SCAN_BUSY_TIMEOUT_COUNT.getName(), this.busyTimeoutCount, AtomicLong::get) .description("The number of scans where a busy timeout happened").register(registry); - FunctionCounter.builder(METRICS_SCAN_QUERIES, this.lookupCount, LongAdder::sum) + FunctionCounter.builder(SCAN_QUERIES.getName(), this.lookupCount, LongAdder::sum) .description("Number of queries").register(registry); - FunctionCounter.builder(METRICS_SCAN_SCANNED_ENTRIES, this.scannedCount, LongAdder::sum) + FunctionCounter.builder(SCAN_SCANNED_ENTRIES.getName(), this.scannedCount, LongAdder::sum) .description("Scanned rate").register(registry); - FunctionCounter.builder(METRICS_SCAN_PAUSED_FOR_MEM, this.pausedForMemory, AtomicLong::get) + FunctionCounter.builder(SCAN_PAUSED_FOR_MEM.getName(), this.pausedForMemory, AtomicLong::get) .description("scan paused due to server being low on memory").register(registry); - FunctionCounter.builder(METRICS_SCAN_RETURN_FOR_MEM, this.earlyReturnForMemory, AtomicLong::get) + FunctionCounter + .builder(SCAN_RETURN_FOR_MEM.getName(), this.earlyReturnForMemory, AtomicLong::get) .description("scan returned results early due to server being low on memory") .register(registry); - Gauge.builder(METRICS_SCAN_QUERY_SCAN_RESULTS, this.queryResultCount, LongAdder::sum) + Gauge.builder(SCAN_QUERY_SCAN_RESULTS.getName(), this.queryResultCount, LongAdder::sum) .description("Query rate (entries/sec)").register(registry); - Gauge.builder(METRICS_SCAN_QUERY_SCAN_RESULTS_BYTES, this.queryResultBytes, LongAdder::sum) + Gauge.builder(SCAN_QUERY_SCAN_RESULTS_BYTES.getName(), this.queryResultBytes, LongAdder::sum) .description("Query rate (bytes/sec)").register(registry); - Gauge.builder(METRICS_SCAN_ZOMBIE_THREADS, this, TabletServerScanMetrics::getZombieThreadsCount) + Gauge + .builder(SCAN_ZOMBIE_THREADS.getName(), this, + TabletServerScanMetrics::getZombieThreadsCount) .description("Number of scan threads that have no associated client session") .register(registry); } diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/metrics/TabletServerUpdateMetrics.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/metrics/TabletServerUpdateMetrics.java index 1c30517e32..37beff251c 100644 --- a/server/tserver/src/main/java/org/apache/accumulo/tserver/metrics/TabletServerUpdateMetrics.java +++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/metrics/TabletServerUpdateMetrics.java @@ -18,6 +18,12 @@ */ package org.apache.accumulo.tserver.metrics; +import static org.apache.accumulo.core.metrics.Metric.UPDATE_COMMIT; +import static org.apache.accumulo.core.metrics.Metric.UPDATE_COMMIT_PREP; +import static org.apache.accumulo.core.metrics.Metric.UPDATE_ERRORS; +import static org.apache.accumulo.core.metrics.Metric.UPDATE_MUTATION_ARRAY_SIZE; +import static org.apache.accumulo.core.metrics.Metric.UPDATE_WALOG_WRITE; + import java.time.Duration; import java.util.concurrent.atomic.AtomicLong; @@ -69,21 +75,21 @@ public class TabletServerUpdateMetrics implements MetricsProducer { @Override public void registerMetrics(MeterRegistry registry) { - FunctionCounter.builder(METRICS_UPDATE_ERRORS, permissionErrorsCount, AtomicLong::get) + FunctionCounter.builder(UPDATE_ERRORS.getName(), permissionErrorsCount, AtomicLong::get) .tags("type", "permission").description("Counts permission errors").register(registry); - FunctionCounter.builder(METRICS_UPDATE_ERRORS, unknownTabletErrorsCount, AtomicLong::get) + FunctionCounter.builder(UPDATE_ERRORS.getName(), unknownTabletErrorsCount, AtomicLong::get) .tags("type", "unknown.tablet").description("Counts unknown tablet errors") .register(registry); - FunctionCounter.builder(METRICS_UPDATE_ERRORS, constraintViolationsCount, AtomicLong::get) + FunctionCounter.builder(UPDATE_ERRORS.getName(), constraintViolationsCount, AtomicLong::get) .tags("type", "constraint.violation").description("Counts constraint violations") .register(registry); - commitPrepStat = Timer.builder(METRICS_UPDATE_COMMIT_PREP) + commitPrepStat = Timer.builder(UPDATE_COMMIT_PREP.getName()) .description("preparing to commit mutations").register(registry); - walogWriteTimeStat = Timer.builder(METRICS_UPDATE_WALOG_WRITE) + walogWriteTimeStat = Timer.builder(UPDATE_WALOG_WRITE.getName()) .description("writing mutations to WAL").register(registry); - commitTimeStat = - Timer.builder(METRICS_UPDATE_COMMIT).description("committing mutations").register(registry); - mutationArraySizeStat = DistributionSummary.builder(METRICS_UPDATE_MUTATION_ARRAY_SIZE) + commitTimeStat = Timer.builder(UPDATE_COMMIT.getName()).description("committing mutations") + .register(registry); + mutationArraySizeStat = DistributionSummary.builder(UPDATE_MUTATION_ARRAY_SIZE.getName()) .description("mutation array").register(registry); } diff --git a/test/src/main/java/org/apache/accumulo/test/ZombieScanIT.java b/test/src/main/java/org/apache/accumulo/test/ZombieScanIT.java index e8c3a47a3e..adb2f04947 100644 --- a/test/src/main/java/org/apache/accumulo/test/ZombieScanIT.java +++ b/test/src/main/java/org/apache/accumulo/test/ZombieScanIT.java @@ -18,6 +18,7 @@ */ package org.apache.accumulo.test; +import static org.apache.accumulo.core.metrics.Metric.SCAN_ZOMBIE_THREADS; import static org.apache.accumulo.test.functional.ScannerIT.countActiveScans; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -45,7 +46,6 @@ import org.apache.accumulo.core.data.Mutation; import org.apache.accumulo.core.data.Range; import org.apache.accumulo.core.iterators.WrappingIterator; import org.apache.accumulo.core.metadata.schema.TabletMetadata; -import org.apache.accumulo.core.metrics.MetricsProducer; import org.apache.accumulo.core.spi.metrics.LoggingMeterRegistryFactory; import org.apache.accumulo.minicluster.ServerType; import org.apache.accumulo.miniclusterImpl.MiniAccumuloConfigImpl; @@ -381,7 +381,7 @@ public class ZombieScanIT extends ConfigurableMacBase { private int getZombieScansMetric() { return sink.getLines().stream().map(TestStatsDSink::parseStatsDMetric) - .filter(metric -> metric.getName().equals(MetricsProducer.METRICS_SCAN_ZOMBIE_THREADS)) + .filter(metric -> metric.getName().equals(SCAN_ZOMBIE_THREADS.getName())) .mapToInt(metric -> Integer.parseInt(metric.getValue())).max().orElse(-1); } } diff --git a/test/src/main/java/org/apache/accumulo/test/compaction/ExternalCompactionMetricsIT.java b/test/src/main/java/org/apache/accumulo/test/compaction/ExternalCompactionMetricsIT.java index ff54253869..3ebd198b70 100644 --- a/test/src/main/java/org/apache/accumulo/test/compaction/ExternalCompactionMetricsIT.java +++ b/test/src/main/java/org/apache/accumulo/test/compaction/ExternalCompactionMetricsIT.java @@ -18,6 +18,7 @@ */ package org.apache.accumulo.test.compaction; +import static org.apache.accumulo.core.metrics.Metric.MAJC_QUEUED; import static org.apache.accumulo.test.compaction.ExternalCompactionTestUtils.QUEUE1; import static org.apache.accumulo.test.compaction.ExternalCompactionTestUtils.QUEUE2; import static org.apache.accumulo.test.compaction.ExternalCompactionTestUtils.compact; @@ -40,7 +41,6 @@ import org.apache.accumulo.core.conf.Property; import org.apache.accumulo.core.metadata.schema.Ample.DataLevel; import org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType; import org.apache.accumulo.core.metadata.schema.TabletsMetadata; -import org.apache.accumulo.core.metrics.MetricsProducer; import org.apache.accumulo.core.spi.metrics.LoggingMeterRegistryFactory; import org.apache.accumulo.core.util.UtilWaitThread; import org.apache.accumulo.core.util.threads.Threads; @@ -127,7 +127,7 @@ public class ExternalCompactionMetricsIT extends SharedMiniClusterBase { if (shutdownTailer.get()) { break; } - if (s.startsWith(MetricsProducer.METRICS_MAJC_QUEUED)) { + if (s.startsWith(MAJC_QUEUED.getName())) { queueMetrics.add(TestStatsDSink.parseStatsDMetric(s)); } } diff --git a/test/src/main/java/org/apache/accumulo/test/compaction/ExternalCompactionProgressIT.java b/test/src/main/java/org/apache/accumulo/test/compaction/ExternalCompactionProgressIT.java index fb8e2d4ccc..278c8a4e96 100644 --- a/test/src/main/java/org/apache/accumulo/test/compaction/ExternalCompactionProgressIT.java +++ b/test/src/main/java/org/apache/accumulo/test/compaction/ExternalCompactionProgressIT.java @@ -20,6 +20,8 @@ package org.apache.accumulo.test.compaction; import static com.google.common.util.concurrent.Uninterruptibles.sleepUninterruptibly; import static java.util.concurrent.TimeUnit.NANOSECONDS; +import static org.apache.accumulo.core.metrics.Metric.COMPACTOR_ENTRIES_READ; +import static org.apache.accumulo.core.metrics.Metric.COMPACTOR_ENTRIES_WRITTEN; import static org.apache.accumulo.test.compaction.ExternalCompactionTestUtils.QUEUE1; import static org.apache.accumulo.test.compaction.ExternalCompactionTestUtils.compact; import static org.apache.accumulo.test.compaction.ExternalCompactionTestUtils.createTable; @@ -54,7 +56,6 @@ import org.apache.accumulo.core.data.TableId; import org.apache.accumulo.core.iterators.IteratorUtil; import org.apache.accumulo.core.metadata.schema.TabletMetadata; import org.apache.accumulo.core.metadata.schema.TabletsMetadata; -import org.apache.accumulo.core.metrics.MetricsProducer; import org.apache.accumulo.core.util.UtilWaitThread; import org.apache.accumulo.core.util.compaction.RunningCompactionInfo; import org.apache.accumulo.core.util.threads.Threads; @@ -282,18 +283,16 @@ public class ExternalCompactionProgressIT extends AccumuloClusterHarness { break out; } TestStatsDSink.Metric metric = TestStatsDSink.parseStatsDMetric(s); - if (!metric.getName().startsWith(MetricsProducer.METRICS_COMPACTOR_PREFIX)) { + final String metricName = metric.getName(); + if (!metricName.startsWith("accumulo.compactor.entries")) { continue; } int value = Integer.parseInt(metric.getValue()); - log.debug("Found metric: {} with value: {}", metric.getName(), value); - switch (metric.getName()) { - case MetricsProducer.METRICS_COMPACTOR_ENTRIES_READ: - totalEntriesRead.addAndGet(value); - break; - case MetricsProducer.METRICS_COMPACTOR_ENTRIES_WRITTEN: - totalEntriesWritten.addAndGet(value); - break; + log.debug("Found metric: {} with value: {}", metricName, value); + if (metricName.equals(COMPACTOR_ENTRIES_READ.getName())) { + totalEntriesRead.addAndGet(value); + } else if (metricName.equals(COMPACTOR_ENTRIES_WRITTEN.getName())) { + totalEntriesWritten.addAndGet(value); } } sleepUninterruptibly(CHECKER_THREAD_SLEEP_MS, TimeUnit.MILLISECONDS); diff --git a/test/src/main/java/org/apache/accumulo/test/functional/IdleProcessMetricsIT.java b/test/src/main/java/org/apache/accumulo/test/functional/IdleProcessMetricsIT.java index ca54665742..8ffa54fa5f 100644 --- a/test/src/main/java/org/apache/accumulo/test/functional/IdleProcessMetricsIT.java +++ b/test/src/main/java/org/apache/accumulo/test/functional/IdleProcessMetricsIT.java @@ -18,6 +18,7 @@ */ package org.apache.accumulo.test.functional; +import static org.apache.accumulo.core.metrics.Metric.SERVER_IDLE; import static org.apache.accumulo.test.compaction.ExternalCompactionTestUtils.MAX_DATA; import static org.apache.accumulo.test.compaction.ExternalCompactionTestUtils.QUEUE1; import static org.apache.accumulo.test.compaction.ExternalCompactionTestUtils.compact; @@ -42,7 +43,6 @@ import org.apache.accumulo.core.client.Scanner; import org.apache.accumulo.core.client.ScannerBase; import org.apache.accumulo.core.conf.Property; import org.apache.accumulo.core.iterators.IteratorUtil; -import org.apache.accumulo.core.metrics.MetricsProducer; import org.apache.accumulo.core.security.Authorizations; import org.apache.accumulo.harness.MiniClusterConfigurationCallback; import org.apache.accumulo.harness.SharedMiniClusterBase; @@ -128,8 +128,8 @@ public class IdleProcessMetricsIT extends SharedMiniClusterBase { AtomicBoolean sawTServer = new AtomicBoolean(false); Wait.waitFor(() -> { List<String> statsDMetrics = sink.getLines(); - statsDMetrics.stream().filter(line -> line.startsWith(MetricsProducer.METRICS_SERVER_IDLE)) - .peek(log::info).map(TestStatsDSink::parseStatsDMetric).forEach(a -> { + statsDMetrics.stream().filter(line -> line.startsWith(SERVER_IDLE.getName())).peek(log::info) + .map(TestStatsDSink::parseStatsDMetric).forEach(a -> { String processName = a.getTags().get("process.name"); int value = Integer.parseInt(a.getValue()); assertTrue(value == 0 || value == 1 || value == -1, "Unexpected value " + value); @@ -235,8 +235,7 @@ public class IdleProcessMetricsIT extends SharedMiniClusterBase { private static void waitForIdleMetricValueToBe(int expectedValue, String processName) { Wait.waitFor( - () -> sink.getLines().stream() - .filter(line -> line.startsWith(MetricsProducer.METRICS_SERVER_IDLE)) + () -> sink.getLines().stream().filter(line -> line.startsWith(SERVER_IDLE.getName())) .map(TestStatsDSink::parseStatsDMetric) .filter(a -> a.getTags().get("process.name").equals(processName)) .peek(a -> log.info("Idle metric: {}", a)) diff --git a/test/src/main/java/org/apache/accumulo/test/functional/MemoryStarvedMajCIT.java b/test/src/main/java/org/apache/accumulo/test/functional/MemoryStarvedMajCIT.java index 771d74d588..eeb95017a0 100644 --- a/test/src/main/java/org/apache/accumulo/test/functional/MemoryStarvedMajCIT.java +++ b/test/src/main/java/org/apache/accumulo/test/functional/MemoryStarvedMajCIT.java @@ -18,6 +18,7 @@ */ package org.apache.accumulo.test.functional; +import static org.apache.accumulo.core.metrics.Metric.MAJC_PAUSED; import static org.apache.accumulo.test.util.Wait.waitFor; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; @@ -34,7 +35,6 @@ import org.apache.accumulo.core.client.Scanner; import org.apache.accumulo.core.client.admin.CompactionConfig; import org.apache.accumulo.core.client.admin.TableOperations; import org.apache.accumulo.core.conf.Property; -import org.apache.accumulo.core.metrics.MetricsProducer; import org.apache.accumulo.harness.MiniClusterConfigurationCallback; import org.apache.accumulo.harness.SharedMiniClusterBase; import org.apache.accumulo.minicluster.MemoryUnit; @@ -73,7 +73,7 @@ public class MemoryStarvedMajCIT extends SharedMiniClusterBase { } } - private static final DoubleAdder MAJC_PAUSED = new DoubleAdder(); + private static final DoubleAdder MAJC_PAUSED_COUNT = new DoubleAdder(); private static TestStatsDSink sink; private static Thread metricConsumer; @@ -89,9 +89,9 @@ public class MemoryStarvedMajCIT extends SharedMiniClusterBase { } if (line.startsWith("accumulo")) { Metric metric = TestStatsDSink.parseStatsDMetric(line); - if (MetricsProducer.METRICS_MAJC_PAUSED.equals(metric.getName())) { + if (MAJC_PAUSED.getName().equals(metric.getName())) { double val = Double.parseDouble(metric.getValue()); - MAJC_PAUSED.add(val); + MAJC_PAUSED_COUNT.add(val); } } } @@ -113,7 +113,7 @@ public class MemoryStarvedMajCIT extends SharedMiniClusterBase { @BeforeEach public void beforeEach() { // Reset the client side counters - MAJC_PAUSED.reset(); + MAJC_PAUSED_COUNT.reset(); } @Test @@ -141,13 +141,13 @@ public class MemoryStarvedMajCIT extends SharedMiniClusterBase { MemoryStarvedScanIT.consumeServerMemory(scanner); - int paused = MAJC_PAUSED.intValue(); + int paused = MAJC_PAUSED_COUNT.intValue(); assertEquals(0, paused); ReadWriteIT.ingest(client, 100, 100, 100, 0, table); compactionThread.start(); - waitFor(() -> MAJC_PAUSED.intValue() > 0); + waitFor(() -> MAJC_PAUSED_COUNT.intValue() > 0); MemoryStarvedScanIT.freeServerMemory(client); compactionThread.interrupt(); diff --git a/test/src/main/java/org/apache/accumulo/test/functional/MemoryStarvedMinCIT.java b/test/src/main/java/org/apache/accumulo/test/functional/MemoryStarvedMinCIT.java index edb4cd03db..d6ca8346ff 100644 --- a/test/src/main/java/org/apache/accumulo/test/functional/MemoryStarvedMinCIT.java +++ b/test/src/main/java/org/apache/accumulo/test/functional/MemoryStarvedMinCIT.java @@ -18,6 +18,7 @@ */ package org.apache.accumulo.test.functional; +import static org.apache.accumulo.core.metrics.Metric.MINC_PAUSED; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -32,7 +33,6 @@ import org.apache.accumulo.core.client.AccumuloClient; import org.apache.accumulo.core.client.Scanner; import org.apache.accumulo.core.client.admin.TableOperations; import org.apache.accumulo.core.conf.Property; -import org.apache.accumulo.core.metrics.MetricsProducer; import org.apache.accumulo.harness.MiniClusterConfigurationCallback; import org.apache.accumulo.harness.SharedMiniClusterBase; import org.apache.accumulo.minicluster.MemoryUnit; @@ -71,7 +71,7 @@ public class MemoryStarvedMinCIT extends SharedMiniClusterBase { } } - private static final DoubleAdder MINC_PAUSED = new DoubleAdder(); + private static final DoubleAdder MINC_PAUSED_COUNT = new DoubleAdder(); private static TestStatsDSink sink; private static Thread metricConsumer; @@ -87,9 +87,9 @@ public class MemoryStarvedMinCIT extends SharedMiniClusterBase { } if (line.startsWith("accumulo")) { Metric metric = TestStatsDSink.parseStatsDMetric(line); - if (MetricsProducer.METRICS_MINC_PAUSED.equals(metric.getName())) { + if (MINC_PAUSED.getName().equals(metric.getName())) { double val = Double.parseDouble(metric.getValue()); - MINC_PAUSED.add(val); + MINC_PAUSED_COUNT.add(val); } } } @@ -111,7 +111,7 @@ public class MemoryStarvedMinCIT extends SharedMiniClusterBase { @BeforeEach public void beforeEach() { // Reset the client side counters - MINC_PAUSED.reset(); + MINC_PAUSED_COUNT.reset(); } @Test @@ -141,14 +141,14 @@ public class MemoryStarvedMinCIT extends SharedMiniClusterBase { MemoryStarvedScanIT.consumeServerMemory(scanner); - int paused = MINC_PAUSED.intValue(); + int paused = MINC_PAUSED_COUNT.intValue(); assertEquals(0, paused); ingestThread.start(); while (paused <= 0) { Thread.sleep(1000); - paused = MINC_PAUSED.intValue(); + paused = MINC_PAUSED_COUNT.intValue(); } MemoryStarvedScanIT.freeServerMemory(client); diff --git a/test/src/main/java/org/apache/accumulo/test/functional/MemoryStarvedScanIT.java b/test/src/main/java/org/apache/accumulo/test/functional/MemoryStarvedScanIT.java index d2cb595b3d..8e4da36bb9 100644 --- a/test/src/main/java/org/apache/accumulo/test/functional/MemoryStarvedScanIT.java +++ b/test/src/main/java/org/apache/accumulo/test/functional/MemoryStarvedScanIT.java @@ -20,7 +20,9 @@ package org.apache.accumulo.test.functional; import static java.util.concurrent.TimeUnit.MINUTES; import static java.util.concurrent.TimeUnit.SECONDS; -import static org.apache.accumulo.core.metrics.MetricsProducer.METRICS_LOW_MEMORY; +import static org.apache.accumulo.core.metrics.Metric.LOW_MEMORY; +import static org.apache.accumulo.core.metrics.Metric.SCAN_PAUSED_FOR_MEM; +import static org.apache.accumulo.core.metrics.Metric.SCAN_RETURN_FOR_MEM; import static org.apache.accumulo.test.util.Wait.waitFor; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -44,7 +46,6 @@ import org.apache.accumulo.core.data.Key; import org.apache.accumulo.core.data.Range; import org.apache.accumulo.core.data.Value; import org.apache.accumulo.core.iterators.WrappingIterator; -import org.apache.accumulo.core.metrics.MetricsProducer; import org.apache.accumulo.core.spi.metrics.LoggingMeterRegistryFactory; import org.apache.accumulo.harness.MiniClusterConfigurationCallback; import org.apache.accumulo.harness.SharedMiniClusterBase; @@ -109,13 +110,13 @@ public class MemoryStarvedScanIT extends SharedMiniClusterBase { } if (line.startsWith("accumulo")) { Metric metric = TestStatsDSink.parseStatsDMetric(line); - if (MetricsProducer.METRICS_SCAN_PAUSED_FOR_MEM.equals(metric.getName())) { + if (SCAN_PAUSED_FOR_MEM.getName().equals(metric.getName())) { double val = Double.parseDouble(metric.getValue()); SCAN_START_DELAYED.add(val); - } else if (MetricsProducer.METRICS_SCAN_RETURN_FOR_MEM.equals(metric.getName())) { + } else if (SCAN_RETURN_FOR_MEM.getName().equals(metric.getName())) { double val = Double.parseDouble(metric.getValue()); SCAN_RETURNED_EARLY.add(val); - } else if (metric.getName().equals(METRICS_LOW_MEMORY)) { + } else if (metric.getName().equals(LOW_MEMORY.getName())) { String process = metric.getTags().get("process.name"); if (process != null && process.contains("tserver")) { int val = Integer.parseInt(metric.getValue()); diff --git a/test/src/main/java/org/apache/accumulo/test/metrics/MetricsIT.java b/test/src/main/java/org/apache/accumulo/test/metrics/MetricsIT.java index 3c1302cc1b..c77c41d049 100644 --- a/test/src/main/java/org/apache/accumulo/test/metrics/MetricsIT.java +++ b/test/src/main/java/org/apache/accumulo/test/metrics/MetricsIT.java @@ -18,6 +18,16 @@ */ package org.apache.accumulo.test.metrics; +import static org.apache.accumulo.core.metrics.Metric.COMPACTOR_MAJC_STUCK; +import static org.apache.accumulo.core.metrics.Metric.FATE_TYPE_IN_PROGRESS; +import static org.apache.accumulo.core.metrics.Metric.MANAGER_BALANCER_MIGRATIONS_NEEDED; +import static org.apache.accumulo.core.metrics.Metric.SCAN_BUSY_TIMEOUT_COUNT; +import static org.apache.accumulo.core.metrics.Metric.SCAN_RESERVATION_CONFLICT_COUNTER; +import static org.apache.accumulo.core.metrics.Metric.SCAN_RESERVATION_TOTAL_TIMER; +import static org.apache.accumulo.core.metrics.Metric.SCAN_RESERVATION_WRITEOUT_TIMER; +import static org.apache.accumulo.core.metrics.Metric.SCAN_TABLET_METADATA_CACHE; +import static org.apache.accumulo.core.metrics.Metric.SCAN_YIELDS; +import static org.apache.accumulo.core.metrics.Metric.SERVER_IDLE; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -25,13 +35,13 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; import java.time.Duration; -import java.util.HashMap; +import java.util.Arrays; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; -import java.util.function.Predicate; import org.apache.accumulo.core.client.Accumulo; import org.apache.accumulo.core.client.AccumuloClient; @@ -42,11 +52,11 @@ import org.apache.accumulo.core.client.admin.CompactionConfig; import org.apache.accumulo.core.conf.Property; import org.apache.accumulo.core.data.Mutation; import org.apache.accumulo.core.data.Value; +import org.apache.accumulo.core.metrics.Metric; import org.apache.accumulo.core.metrics.MetricsProducer; import org.apache.accumulo.core.spi.metrics.LoggingMeterRegistryFactory; import org.apache.accumulo.miniclusterImpl.MiniAccumuloConfigImpl; import org.apache.accumulo.test.functional.ConfigurableMacBase; -import org.apache.accumulo.test.metrics.TestStatsDSink.Metric; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.io.Text; import org.junit.jupiter.api.AfterAll; @@ -100,50 +110,55 @@ public class MetricsIT extends ConfigurableMacBase implements MetricsProducer { cluster.stop(); // meter names sorted and formatting disabled to make it easier to diff changes // @formatter:off - Set<String> unexpectedMetrics = - Set.of(METRICS_COMPACTOR_MAJC_STUCK, - METRICS_SCAN_YIELDS); + Set<Metric> unexpectedMetrics = Set.of( + COMPACTOR_MAJC_STUCK, + SCAN_YIELDS + ); // add sserver as flaky until scan server included in mini tests. - Set<String> flakyMetrics = Set.of(METRICS_FATE_TYPE_IN_PROGRESS, - METRICS_MANAGER_BALANCER_MIGRATIONS_NEEDED, - METRICS_SCAN_BUSY_TIMEOUT_COUNTER, - METRICS_SCAN_RESERVATION_CONFLICT_COUNTER, - METRICS_SCAN_RESERVATION_TOTAL_TIMER, - METRICS_SCAN_RESERVATION_WRITEOUT_TIMER, - METRICS_SCAN_TABLET_METADATA_CACHE, - METRICS_SERVER_IDLE); + Set<Metric> flakyMetrics = Set.of( + FATE_TYPE_IN_PROGRESS, + MANAGER_BALANCER_MIGRATIONS_NEEDED, + SCAN_BUSY_TIMEOUT_COUNT, + SCAN_RESERVATION_CONFLICT_COUNTER, + SCAN_RESERVATION_TOTAL_TIMER, + SCAN_RESERVATION_WRITEOUT_TIMER, + SCAN_TABLET_METADATA_CACHE, + SERVER_IDLE + ); // @formatter:on - Map<String,String> expectedMetricNames = this.getMetricFields(); - flakyMetrics.forEach(expectedMetricNames::remove); // might not see these - unexpectedMetrics.forEach(expectedMetricNames::remove); // definitely shouldn't see these - assertFalse(expectedMetricNames.isEmpty()); // make sure we didn't remove everything + Set<Metric> expectedMetrics = new HashSet<>(Arrays.asList(Metric.values())); + expectedMetrics.removeAll(flakyMetrics); // might not see these + expectedMetrics.removeAll(unexpectedMetrics); // definitely shouldn't see these + assertFalse(expectedMetrics.isEmpty()); // make sure we didn't remove everything - Map<String,String> seenMetricNames = new HashMap<>(); + Set<Metric> seenMetrics = new HashSet<>(); List<String> statsDMetrics; // loop until we run out of lines or until we see all expected metrics - while (!(statsDMetrics = sink.getLines()).isEmpty() && !expectedMetricNames.isEmpty()) { + while (!(statsDMetrics = sink.getLines()).isEmpty() && !expectedMetrics.isEmpty()) { // for each metric name not yet seen, check if it is expected, flaky, or unknown statsDMetrics.stream().filter(line -> line.startsWith("accumulo")) - .map(TestStatsDSink::parseStatsDMetric).map(Metric::getName) - .filter(Predicate.not(seenMetricNames::containsKey)).forEach(name -> { - if (expectedMetricNames.containsKey(name)) { - // record expected metric names as seen, along with the value seen - seenMetricNames.put(name, expectedMetricNames.remove(name)); - } else if (flakyMetrics.contains(name)) { + .map(TestStatsDSink::parseStatsDMetric).map(metric -> Metric.fromName(metric.getName())) + .filter(metric -> !seenMetrics.contains(metric)).forEach(metric -> { + if (expectedMetrics.contains(metric)) { + // record expected Metric as seen + seenMetrics.add(metric); + expectedMetrics.remove(metric); + } else if (flakyMetrics.contains(metric)) { // ignore any flaky metric names seen // these aren't always expected, but we shouldn't be surprised if we see them } else { // completely unexpected metric - fail("Found accumulo metric not in expectedMetricNames or flakyMetricNames: " + name); + fail("Found accumulo metric not in expectedMetricNames or flakyMetricNames: " + + metric); } }); } - assertTrue(expectedMetricNames.isEmpty(), - "Did not see all expected metric names, missing: " + expectedMetricNames.values()); + assertTrue(expectedMetrics.isEmpty(), + "Did not see all expected metric names, missing: " + expectedMetrics); } private void doWorkToGenerateMetrics() throws Exception {