lib/opentelemetry/common/utilities.rb in opentelemetry-common-0.10.0 vs lib/opentelemetry/common/utilities.rb in opentelemetry-common-0.11.0

- old
+ new

@@ -1,24 +1,50 @@ # frozen_string_literal: true -# Copyright 2020 OpenTelemetry Authors +# Copyright The OpenTelemetry Authors # # SPDX-License-Identifier: Apache-2.0 module OpenTelemetry module Common # Utilities contains common helpers. module Utilities extend self - # @api private - # - # Returns nil if timeout is nil, 0 if timeout has expired, or the remaining (positive) time left in seconds. + STRING_PLACEHOLDER = ''.encode(::Encoding::UTF_8).freeze + + # Returns nil if timeout is nil, 0 if timeout has expired, + # or the remaining (positive) time left in seconds. def maybe_timeout(timeout, start_time) return nil if timeout.nil? timeout -= (Time.now - start_time) timeout.positive? ? timeout : 0 + end + + # Encodes a string in utf8 + # + # @param [String] string The string to be utf8 encoded + # @param [optional boolean] binary This option is for displaying binary data + # @param [optional String] placeholder The fallback string to be used if encoding fails + # + # @return [String] + def utf8_encode(string, binary: false, placeholder: STRING_PLACEHOLDER) + string = string.to_s + + if binary + # This option is useful for "gracefully" displaying binary data that + # often contains text such as marshalled objects + string.encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '') + elsif string.encoding == ::Encoding::UTF_8 + string + else + string.encode(::Encoding::UTF_8) + end + rescue StandardError => e + OpenTelemetry.logger.debug("Error encoding string in UTF-8: #{e}") + + placeholder end end end end