1 /***********************************************************************
2  * Copyright (c) 2013-2024 Commonwealth Computer Research, Inc.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Apache License, Version 2.0
5  * which accompanies this distribution and is available at
6  * http://www.opensource.org/licenses/apache2.0.php.
7  ***********************************************************************/
8 
9 package org.locationtech.geomesa.convert2.metrics
10 
11 import com.codahale.metrics._
12 import com.typesafe.config.Config
13 import org.geotools.api.feature.simple.SimpleFeatureType
14 import org.locationtech.geomesa.convert2.metrics.ConverterMetrics.SimpleGauge
15 import org.locationtech.geomesa.metrics.core.GeoMesaMetrics
16 import org.locationtech.geomesa.utils.conf.GeoMesaSystemProperties.SystemProperty
17 
18 /**
19   * Provides namespaced access to reporting metrics
20   *
21   * @param registry metric registry
22   * @param prefix namespace prefix
23   * @param typeName simple feature type name being processed
24   * @param reporters metric reporters
25   */
26 class ConverterMetrics(
27     registry: MetricRegistry,
28     prefix: Option[String],
29     typeName: String,
30     reporters: Seq[ScheduledReporter]
31   ) extends GeoMesaMetrics(registry, s"${prefix.map(_ + ".").getOrElse("")}geomesa.convert", reporters) {
32 
33   /**
34     * Creates a prefixed counter
35     *
36     * @param id short identifier for the metric being counted
37     * @return
38     */
39   def counter(id: String): Counter = super.counter(typeName, id)
40 
41   /**
42     * Gets an updatable gauge
43     *
44     * @param id short identifier for hte metric being gauged
45     * @tparam T gauge type
46     * @return
47     */
48   def gauge[T](id: String): SimpleGauge[T] =
49     super.gauge(typeName, id, new SimpleGauge()).asInstanceOf[SimpleGauge[T]]
50 
51   /**
52     * Creates a prefixed histogram
53     *
54     * @param id short identifier for the metric being histogramed
55     * @return
56     */
57   def histogram(id: String): Histogram = super.histogram(typeName, id)
58 
59   /**
60     * Creates a prefixed meter
61     *
62     * @param id short identifier for the metric being metered
63     * @return
64     */
65   def meter(id: String): Meter = super.meter(typeName, id)
66 
67   /**
68     * Creates a prefixed timer
69     *
70     * @param id short identifier for the metric being timed
71     * @return
72     */
73   def timer(id: String): Timer = super.timer(typeName, id)
74 
75   /**
76     * Register a metric
77     *
78     * @param id short identifier for the metric
79     * @param metric metric to register
80     * @tparam T metric type
81     * @return
82     */
83   def register[T <: Metric](id: String, metric: T): T = super.register(typeName, id, metric)
84 
85   override def close(): Unit = {
86     // execute a final report before closing, for situations where the converter runs too quickly to report anything
87     try { reporters.foreach(_.report()) } finally {
88       super.close()
89     }
90   }
91 }
92 
93 object ConverterMetrics {
94 
95   val MetricsPrefix: SystemProperty = SystemProperty("geomesa.convert.validators.prefix")
96 
97   /**
98     * Creates an empty registry with no namespace or reporters
99     *
100     * @return
101     */
102   def empty: ConverterMetrics = new ConverterMetrics(new MetricRegistry(), None, "", Seq.empty)
103 
104   /**
105     * Create a registry for the provided feature type
106     *
107     * @param sft simple feature type
108     * @param reporters configs for metric reporters
109     * @return
110     */
111   def apply(sft: SimpleFeatureType, reporters: Seq[Config]): ConverterMetrics = {
112     val registry = new MetricRegistry()
113     val reps = reporters.map(org.locationtech.geomesa.metrics.core.ReporterFactory.apply(_, registry)).toList
114     new ConverterMetrics(registry, MetricsPrefix.option, sft.getTypeName, reps)
115   }
116 
117   /**
118     * Simple gauge that can be updated
119     *
120     * @tparam T value
121     */
122   class SimpleGauge[T] extends Gauge[T] {
123 
124     @volatile
125     private var value: T = _
126 
127     override def getValue: T = value
128 
129     def set(value: T): Unit = this.value = value
130   }
131 }
Line Stmt Id Pos Tree Symbol Tests Code
39 1757 1521 - 1529 Select org.locationtech.geomesa.convert2.metrics.ConverterMetrics.typeName ConverterMetrics.this.typeName
39 1758 1507 - 1534 Apply org.locationtech.geomesa.metrics.core.GeoMesaMetrics.counter ConverterMetrics.super.counter(ConverterMetrics.this.typeName, id)
49 1759 1748 - 1756 Select org.locationtech.geomesa.convert2.metrics.ConverterMetrics.typeName ConverterMetrics.this.typeName
49 1760 1762 - 1779 Apply org.locationtech.geomesa.convert2.metrics.ConverterMetrics.SimpleGauge.<init> new org.locationtech.geomesa.convert2.metrics.ConverterMetrics.SimpleGauge[Nothing]()
49 1761 1736 - 1809 TypeApply scala.Any.asInstanceOf ConverterMetrics.super.gauge(ConverterMetrics.this.typeName, id, new org.locationtech.geomesa.convert2.metrics.ConverterMetrics.SimpleGauge[Nothing]()).asInstanceOf[org.locationtech.geomesa.convert2.metrics.ConverterMetrics.SimpleGauge[T]]
57 1762 2002 - 2010 Select org.locationtech.geomesa.convert2.metrics.ConverterMetrics.typeName ConverterMetrics.this.typeName
57 1763 1986 - 2015 Apply org.locationtech.geomesa.metrics.core.GeoMesaMetrics.histogram ConverterMetrics.super.histogram(ConverterMetrics.this.typeName, id)
65 1764 2188 - 2196 Select org.locationtech.geomesa.convert2.metrics.ConverterMetrics.typeName ConverterMetrics.this.typeName
65 1765 2176 - 2201 Apply org.locationtech.geomesa.metrics.core.GeoMesaMetrics.meter ConverterMetrics.super.meter(ConverterMetrics.this.typeName, id)
73 1766 2372 - 2380 Select org.locationtech.geomesa.convert2.metrics.ConverterMetrics.typeName ConverterMetrics.this.typeName
73 1767 2360 - 2385 Apply org.locationtech.geomesa.metrics.core.GeoMesaMetrics.timer ConverterMetrics.super.timer(ConverterMetrics.this.typeName, id)
83 1768 2630 - 2638 Select org.locationtech.geomesa.convert2.metrics.ConverterMetrics.typeName ConverterMetrics.this.typeName
83 1769 2615 - 2651 Apply org.locationtech.geomesa.metrics.core.GeoMesaMetrics.register ConverterMetrics.super.register[T](ConverterMetrics.this.typeName, id, metric)
87 1770 2831 - 2841 Apply com.codahale.metrics.ScheduledReporter.report x$2.report()
87 1771 2813 - 2842 Apply scala.collection.IterableLike.foreach ConverterMetrics.this.reporters.foreach[Unit](((x$2: com.codahale.metrics.ScheduledReporter) => x$2.report()))
87 1772 2813 - 2842 Block scala.collection.IterableLike.foreach ConverterMetrics.this.reporters.foreach[Unit](((x$2: com.codahale.metrics.ScheduledReporter) => x$2.report()))
88 1773 2861 - 2874 Apply org.locationtech.geomesa.metrics.core.GeoMesaMetrics.close ConverterMetrics.super.close()
88 1774 2861 - 2874 Block org.locationtech.geomesa.metrics.core.GeoMesaMetrics.close ConverterMetrics.super.close()
95 1775 2968 - 3003 Literal <nosymbol> "geomesa.convert.validators.prefix"
95 1776 2953 - 3004 Apply org.locationtech.geomesa.utils.conf.GeoMesaSystemProperties.SystemProperty.apply org.locationtech.geomesa.utils.conf.GeoMesaSystemProperties.SystemProperty.apply("geomesa.convert.validators.prefix", org.locationtech.geomesa.utils.conf.GeoMesaSystemProperties.SystemProperty.apply$default$2)
102 1777 3155 - 3175 Apply com.codahale.metrics.MetricRegistry.<init> new com.codahale.metrics.MetricRegistry()
102 1778 3177 - 3181 Select scala.None scala.None
102 1779 3183 - 3185 Literal <nosymbol> ""
102 1780 3187 - 3196 TypeApply scala.collection.generic.GenericCompanion.empty scala.collection.Seq.empty[Nothing]
102 1781 3134 - 3197 Apply org.locationtech.geomesa.convert2.metrics.ConverterMetrics.<init> new ConverterMetrics(new com.codahale.metrics.MetricRegistry(), scala.None, "", scala.collection.Seq.empty[Nothing])
112 1782 3476 - 3496 Apply com.codahale.metrics.MetricRegistry.<init> new com.codahale.metrics.MetricRegistry()
113 1783 3526 - 3598 Apply org.locationtech.geomesa.metrics.core.ReporterFactory.apply org.locationtech.geomesa.metrics.core.ReporterFactory.apply(x$3, registry)
113 1784 3525 - 3525 TypeApply scala.collection.Seq.canBuildFrom collection.this.Seq.canBuildFrom[com.codahale.metrics.ScheduledReporter]
113 1785 3512 - 3606 Select scala.collection.TraversableOnce.toList reporters.map[com.codahale.metrics.ScheduledReporter, Seq[com.codahale.metrics.ScheduledReporter]](((x$3: com.typesafe.config.Config) => org.locationtech.geomesa.metrics.core.ReporterFactory.apply(x$3, registry)))(collection.this.Seq.canBuildFrom[com.codahale.metrics.ScheduledReporter]).toList
114 1786 3642 - 3662 Select org.locationtech.geomesa.utils.conf.GeoMesaSystemProperties.SystemProperty.option ConverterMetrics.this.MetricsPrefix.option
114 1787 3664 - 3679 Apply org.geotools.api.feature.simple.SimpleFeatureType.getTypeName sft.getTypeName()
114 1788 3611 - 3686 Apply org.locationtech.geomesa.convert2.metrics.ConverterMetrics.<init> new ConverterMetrics(registry, ConverterMetrics.this.MetricsPrefix.option, sft.getTypeName(), reps)
127 1789 3890 - 3895 Select org.locationtech.geomesa.convert2.metrics.ConverterMetrics.SimpleGauge.value SimpleGauge.this.value
129 1790 3927 - 3945 Apply org.locationtech.geomesa.convert2.metrics.ConverterMetrics.SimpleGauge.value_= this.value_=(value)