lib/opencensus/stats.rb in opencensus-0.4.0 vs lib/opencensus/stats.rb in opencensus-0.5.0

- old
+ new

@@ -11,17 +11,159 @@ # 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. +require "opencensus/stats/config" +require "opencensus/stats/recorder" +require "opencensus/stats/view" +require "opencensus/stats/aggregation" +require "opencensus/stats/measure_registry" +require "opencensus/stats/exporters" + module OpenCensus ## # The Stats module contains support for OpenCensus stats collection. # # OpenCensus allows users to create typed measures, record measurements, # aggregate the collected data, and export the aggregated data. # - # TODO: implement stats # module Stats + ## + # Internal key for storing the current stats recorder in the thread local + # context. + # + # @private + RECORDER_CONTEXT_KEY = :__recorder_context__ + + class << self + ## + # Sets the current thread-local Recorder, which governs the behavior + # of the recorder creation methods of OpenCensus::Stats::Recorder. + # + # @param [Recorder] context + def recorder_context= context + OpenCensus::Context.set RECORDER_CONTEXT_KEY, context + end + + ## + # Unsets the current thread-local SpanContext, disabling stats recorder + # creation methods of OpenCensus::Stats::Recorder + def unset_recorder_context + OpenCensus::Context.unset RECORDER_CONTEXT_KEY + end + + # Get the current thread-local stats recorder context/ + # Returns `nil` if there is no current SpanContext. + # + # @return [Recorder, nil] + def recorder_context + OpenCensus::Context.get RECORDER_CONTEXT_KEY + end + + # Get recorder from the stats context. If stats context nil then create + # new recorder and set into stats context. + # @return [Recorder] + def ensure_recorder + self.recorder_context ||= Recorder.new + end + + # Create and register int64 type measure into measure registry. + # + # @param [String] name Name of the measure. + # @param [String] unit Unit of the measure. i.e "kb", "s", "ms" + # @param [String] description Detail description + # @return [Measure] + def create_measure_int name:, unit:, description: nil + MeasureRegistry.register( + name: name, + unit: unit, + type: Measure::INT64_TYPE, + description: description + ) + end + + # Create and register double type measure into measure registry. + # + # @param [String] name Name of the measure. + # @param [String] unit Unit of the measure. i.e "kb", "s", "ms" + # @param [String] description Detail description + # @return [Measure] + def create_measure_double name:, unit:, description: nil + MeasureRegistry.register( + name: name, + unit: unit, + type: Measure::DOUBLE_TYPE, + description: description + ) + end + + # Get list of registered measures + # @return [Array<Measure>] + def registered_measures + MeasureRegistry.measures + end + + # Create measurement value for registered measure. + # + # @param [String] name Name of the registered measure + # @param [Integer, Float] value Value of the measurement + # @param [Hash<String,String>] tags Tags to which the value is recorded + # @raise [ArgumentError] if givem measure is not register + def create_measurement name:, value:, tags: + measure = MeasureRegistry.get name + return measure.create_measurement(value: value, tags: tags) if measure + raise ArgumentError, "#{name} measure is not registered" + end + + # Create and register a view to current stats recorder context. + # + # @param [String] name + # @param [Measure] measure + # @param [Aggregation] aggregation + # @param [Array<String>] columns + # @param [String] description + def create_and_register_view \ + name:, + measure:, + aggregation:, + columns: nil, + description: nil + view = View.new( + name: name, + measure: measure, + aggregation: aggregation, + description: description, + columns: columns + ) + ensure_recorder.register_view view + end + + # Create aggregation defination instance with type sum. + # @return [Aggregation] + def create_sum_aggregation + Aggregation::Sum.new + end + + # Create aggregation defination instance with type count. + # @return [Aggregation] + def create_count_aggregation + Aggregation::Count.new + end + + # Create aggregation defination instance with type distribution. + # @param [Array<Integer>,Array<Float>] buckets Value boundries for + # distribution. + # @return [Aggregation] + def create_distribution_aggregation buckets + Aggregation::Distribution.new buckets + end + + # Create aggregation defination instance with type last value. + # @return [Aggregation] + def create_last_value_aggregation + Aggregation::LastValue.new + end + end end end