Class: LaunchDarklyObservability::Hook

Inherits:
Object
  • Object
show all
Includes:
LaunchDarkly::Interfaces::Hooks::Hook
Defined in:
lib/launchdarkly_observability/hook.rb

Overview

Evaluation hook that instruments LaunchDarkly flag evaluations with OpenTelemetry spans and events.

This hook creates spans for each flag evaluation, capturing:

  • Flag key and provider

  • Context information

  • Evaluation result (value, variation index)

  • Any errors

Additionally, a “feature_flag” event is added to the span with evaluation results, following the OpenTelemetry semantic conventions for feature flags and matching the pattern used by other LaunchDarkly observability SDKs (Android, Node).

Examples:

The hook is automatically registered when using the Plugin

plugin = LaunchDarklyObservability::Plugin.new(project_id: 'my-project')
config = LaunchDarkly::Config.new(plugins: [plugin])
client = LaunchDarkly::LDClient.new('sdk-key', config)

# Flag evaluations are now automatically traced
client.variation('my-flag', context, false)

Constant Summary collapse

TRACER_NAME =
'launchdarkly-ruby'
SPAN_NAME =
'evaluation'
FEATURE_FLAG_EVENT_NAME =
'feature_flag'

Instance Method Summary collapse

Instance Method Details

#after_evaluation(series_context, data, detail) ⇒ Hash

Called after flag evaluation. Completes the span with evaluation results and a “feature_flag” event.

Parameters:

  • series_context (LaunchDarkly::Interfaces::Hooks::EvaluationSeriesContext)
  • data (Hash)

    Data passed between hook stages

  • detail (LaunchDarkly::EvaluationDetail)

    The evaluation result

Returns:

  • (Hash)

    Updated data hash



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/launchdarkly_observability/hook.rb', line 65

def after_evaluation(series_context, data, detail)
  span = data[:__ld_observability_span]
  return data unless span

  add_result_attributes(span, detail)
  handle_evaluation_error(span, detail)
  add_feature_flag_event(span, series_context, detail)

  span.finish

  data
rescue StandardError => e
  warn "[LaunchDarklyObservability] Error in after_evaluation: #{e.message}"
  span&.finish
  data
end

#before_evaluation(series_context, data) ⇒ Hash

Called before flag evaluation. Creates an OpenTelemetry span and captures initial context information.

Parameters:

  • series_context (LaunchDarkly::Interfaces::Hooks::EvaluationSeriesContext)
  • data (Hash)

    Data passed between hook stages

Returns:

  • (Hash)

    Updated data hash with span information



45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/launchdarkly_observability/hook.rb', line 45

def before_evaluation(series_context, data)
  return data unless opentelemetry_available?

  tracer = OpenTelemetry.tracer_provider.tracer(TRACER_NAME, LaunchDarklyObservability::VERSION)

  span = tracer.start_span(SPAN_NAME, attributes: build_before_attributes(series_context))

  data.merge(__ld_observability_span: span)
rescue StandardError => e
  warn "[LaunchDarklyObservability] Error in before_evaluation: #{e.message}"
  data
end

#metadataLaunchDarkly::Interfaces::Hooks::Metadata

Returns:

  • (LaunchDarkly::Interfaces::Hooks::Metadata)


35
36
37
# File 'lib/launchdarkly_observability/hook.rb', line 35

def 
  LaunchDarkly::Interfaces::Hooks::Metadata.new('launchdarkly-observability-hook')
end