Class: PostHog::Client
- Inherits:
-
Object
- Object
- PostHog::Client
- Defined in:
- lib/posthog/client.rb
Constant Summary
Constants included from Utils
Utils::UTC_OFFSET_WITHOUT_COLON, Utils::UTC_OFFSET_WITH_COLON
Instance Method Summary collapse
-
#alias(attrs) ⇒ Object
Aliases a user from one id to another.
-
#capture(attrs) ⇒ Object
Captures an event.
-
#clear ⇒ Object
Clears the queue without waiting.
-
#dequeue_last_message ⇒ Hash
Pops the last message from the queue.
-
#flush ⇒ Object
Synchronously waits until the worker has cleared the queue.
-
#get_all_flags(distinct_id, groups: {}, person_properties: {}, group_properties: {}, only_evaluate_locally: false) ⇒ Hash
Returns all flags for a given user.
-
#get_all_flags_and_payloads(distinct_id, groups: {}, person_properties: {}, group_properties: {}, only_evaluate_locally: false) ⇒ Hash
Returns all flags and payloads for a given user.
-
#get_feature_flag(key, distinct_id, groups: {}, person_properties: {}, group_properties: {}, only_evaluate_locally: false, send_feature_flag_events: true) ⇒ String?
Returns whether the given feature flag is enabled for the given user or not.
-
#get_feature_flag_payload(key, distinct_id, match_value: nil, groups: {}, person_properties: {}, group_properties: {}, only_evaluate_locally: false) ⇒ Object
Returns payload for a given feature flag.
-
#get_remote_config_payload(flag_key) ⇒ String
The decrypted value of the feature flag payload.
-
#group_identify(attrs) ⇒ Object
Identifies a group.
-
#identify(attrs) ⇒ Object
Identifies a user.
-
#initialize(opts = {}) ⇒ Client
constructor
A new instance of Client.
-
#is_feature_enabled(flag_key, distinct_id, groups: {}, person_properties: {}, group_properties: {}, only_evaluate_locally: false, send_feature_flag_events: true) ⇒ Object
TODO: In future version, rename to ‘feature_flag_enabled?`.
-
#queued_messages ⇒ Fixnum
Number of messages in the queue.
- #reload_feature_flags ⇒ Object
- #shutdown ⇒ Object
Methods included from Logging
Methods included from Utils
convert_to_datetime, date_in_iso8601, datetime_in_iso8601, formatted_offset, get_by_symbol_or_string_key, is_valid_regex, isoify_dates, isoify_dates!, seconds_to_utc_offset, stringify_keys, symbolize_keys, symbolize_keys!, time_in_iso8601, uid
Constructor Details
#initialize(opts = {}) ⇒ Client
Returns a new instance of Client.
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
# File 'lib/posthog/client.rb', line 33 def initialize(opts = {}) symbolize_keys!(opts) opts[:host] ||= 'https://app.posthog.com' @queue = Queue.new @api_key = opts[:api_key] @max_queue_size = opts[:max_queue_size] || Defaults::Queue::MAX_SIZE @worker_mutex = Mutex.new @worker = if opts[:test_mode] NoopWorker.new(@queue) else SendWorker.new(@queue, @api_key, opts) end @worker_thread = nil @feature_flags_poller = nil @personal_api_key = opts[:personal_api_key] check_api_key! @feature_flags_poller = FeatureFlagsPoller.new( opts[:feature_flags_polling_interval], opts[:personal_api_key], @api_key, opts[:host], opts[:feature_flag_request_timeout_seconds] || Defaults::FeatureFlags::FLAG_REQUEST_TIMEOUT_SECONDS, opts[:on_error] ) @distinct_id_has_sent_flag_calls = SizeLimitedHash.new(Defaults::MAX_HASH_SIZE) do |hash, key| hash[key] = [] end @before_send = opts[:before_send] end |
Instance Method Details
#alias(attrs) ⇒ Object
Aliases a user from one id to another
178 179 180 181 |
# File 'lib/posthog/client.rb', line 178 def alias(attrs) symbolize_keys! attrs enqueue(FieldParser.parse_for_alias(attrs)) end |
#capture(attrs) ⇒ Object
Captures an event
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
# File 'lib/posthog/client.rb', line 107 def capture(attrs) symbolize_keys! attrs send_feature_flags_param = attrs[:send_feature_flags] if send_feature_flags_param # Handle different types of send_feature_flags parameter case send_feature_flags_param when true # Backward compatibility: simple boolean feature_variants = @feature_flags_poller.get_feature_variants(attrs[:distinct_id], attrs[:groups] || {}) when Hash # Hash with options = SendFeatureFlagsOptions.from_hash(send_feature_flags_param) feature_variants = @feature_flags_poller.get_feature_variants( attrs[:distinct_id], attrs[:groups] || {}, ? .person_properties : {}, ? .group_properties : {}, ? .only_evaluate_locally : false ) when SendFeatureFlagsOptions # SendFeatureFlagsOptions object feature_variants = @feature_flags_poller.get_feature_variants( attrs[:distinct_id], attrs[:groups] || {}, send_feature_flags_param.person_properties, send_feature_flags_param.group_properties, send_feature_flags_param.only_evaluate_locally || false ) else # Invalid type, treat as false feature_variants = nil end attrs[:feature_variants] = feature_variants if feature_variants end enqueue(FieldParser.parse_for_capture(attrs)) end |
#clear ⇒ Object
Clears the queue without waiting.
Use only in test mode
84 85 86 |
# File 'lib/posthog/client.rb', line 84 def clear @queue.clear end |
#dequeue_last_message ⇒ Hash
Returns pops the last message from the queue.
184 185 186 |
# File 'lib/posthog/client.rb', line 184 def @queue.pop end |
#flush ⇒ Object
Synchronously waits until the worker has cleared the queue.
Use only for scripts which are not long-running, and will specifically exit
74 75 76 77 78 79 |
# File 'lib/posthog/client.rb', line 74 def flush while !@queue.empty? || @worker.is_requesting? ensure_worker_running sleep(0.1) end end |
#get_all_flags(distinct_id, groups: {}, person_properties: {}, group_properties: {}, only_evaluate_locally: false) ⇒ Hash
Returns all flags for a given user
295 296 297 298 299 300 301 302 303 304 305 306 |
# File 'lib/posthog/client.rb', line 295 def get_all_flags( distinct_id, groups: {}, person_properties: {}, group_properties: {}, only_evaluate_locally: false ) person_properties, group_properties = add_local_person_and_group_properties(distinct_id, groups, person_properties, group_properties) @feature_flags_poller.get_all_flags(distinct_id, groups, person_properties, group_properties, only_evaluate_locally) end |
#get_all_flags_and_payloads(distinct_id, groups: {}, person_properties: {}, group_properties: {}, only_evaluate_locally: false) ⇒ Hash
Returns all flags and payloads for a given user
345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 |
# File 'lib/posthog/client.rb', line 345 def get_all_flags_and_payloads( distinct_id, groups: {}, person_properties: {}, group_properties: {}, only_evaluate_locally: false ) person_properties, group_properties = add_local_person_and_group_properties( distinct_id, groups, person_properties, group_properties ) response = @feature_flags_poller.get_all_flags_and_payloads( distinct_id, groups, person_properties, group_properties, only_evaluate_locally ) response.delete(:requestId) # remove internal information. response end |
#get_feature_flag(key, distinct_id, groups: {}, person_properties: {}, group_properties: {}, only_evaluate_locally: false, send_feature_flag_events: true) ⇒ String?
Returns whether the given feature flag is enabled for the given user or not
The provided properties are used to calculate feature flags locally, if possible.
‘groups` are a mapping from group type to group key. So, if you have a group type of “organization” and a group key of “5”, you would pass groups=“5”. `group_properties` take the format: { group_type_name: { group_properties } } So, for example, if you have the group type “organization” and the group key “5”, with the properties name, and employee count, you’ll send these as: “‘ruby
group_properties: {"organization": {"name": "PostHog", "employees": 11}}
“‘
244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 |
# File 'lib/posthog/client.rb', line 244 def get_feature_flag( key, distinct_id, groups: {}, person_properties: {}, group_properties: {}, only_evaluate_locally: false, send_feature_flag_events: true ) person_properties, group_properties = add_local_person_and_group_properties( distinct_id, groups, person_properties, group_properties ) feature_flag_response, flag_was_locally_evaluated, request_id = @feature_flags_poller.get_feature_flag( key, distinct_id, groups, person_properties, group_properties, only_evaluate_locally ) feature_flag_reported_key = "#{key}_#{feature_flag_response}" if !@distinct_id_has_sent_flag_calls[distinct_id].include?(feature_flag_reported_key) && send_feature_flag_events capture( { distinct_id: distinct_id, event: '$feature_flag_called', properties: { '$feature_flag' => key, '$feature_flag_response' => feature_flag_response, 'locally_evaluated' => flag_was_locally_evaluated }.merge(request_id ? { '$feature_flag_request_id' => request_id } : {}), groups: groups } ) @distinct_id_has_sent_flag_calls[distinct_id] << feature_flag_reported_key end feature_flag_response end |
#get_feature_flag_payload(key, distinct_id, match_value: nil, groups: {}, person_properties: {}, group_properties: {}, only_evaluate_locally: false) ⇒ Object
Returns payload for a given feature flag
318 319 320 321 322 323 324 325 326 327 328 329 330 331 |
# File 'lib/posthog/client.rb', line 318 def get_feature_flag_payload( key, distinct_id, match_value: nil, groups: {}, person_properties: {}, group_properties: {}, only_evaluate_locally: false ) person_properties, group_properties = add_local_person_and_group_properties(distinct_id, groups, person_properties, group_properties) @feature_flags_poller.get_feature_flag_payload(key, distinct_id, match_value, groups, person_properties, group_properties, only_evaluate_locally) end |
#get_remote_config_payload(flag_key) ⇒ String
Returns The decrypted value of the feature flag payload.
219 220 221 |
# File 'lib/posthog/client.rb', line 219 def get_remote_config_payload(flag_key) @feature_flags_poller.get_remote_config_payload(flag_key) end |
#group_identify(attrs) ⇒ Object
Identifies a group
167 168 169 170 |
# File 'lib/posthog/client.rb', line 167 def group_identify(attrs) symbolize_keys! attrs enqueue(FieldParser.parse_for_group_identify(attrs)) end |
#identify(attrs) ⇒ Object
Identifies a user
153 154 155 156 |
# File 'lib/posthog/client.rb', line 153 def identify(attrs) symbolize_keys! attrs enqueue(FieldParser.parse_for_identify(attrs)) end |
#is_feature_enabled(flag_key, distinct_id, groups: {}, person_properties: {}, group_properties: {}, only_evaluate_locally: false, send_feature_flag_events: true) ⇒ Object
TODO: In future version, rename to ‘feature_flag_enabled?`
194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 |
# File 'lib/posthog/client.rb', line 194 def is_feature_enabled( # rubocop:disable Naming/PredicateName flag_key, distinct_id, groups: {}, person_properties: {}, group_properties: {}, only_evaluate_locally: false, send_feature_flag_events: true ) response = get_feature_flag( flag_key, distinct_id, groups: groups, person_properties: person_properties, group_properties: group_properties, only_evaluate_locally: only_evaluate_locally, send_feature_flag_events: send_feature_flag_events ) return nil if response.nil? !!response end |
#queued_messages ⇒ Fixnum
Returns number of messages in the queue.
189 190 191 |
# File 'lib/posthog/client.rb', line 189 def @queue.length end |
#reload_feature_flags ⇒ Object
363 364 365 366 367 368 369 370 371 |
# File 'lib/posthog/client.rb', line 363 def reload_feature_flags unless @personal_api_key logger.error( 'You need to specify a personal_api_key to locally evaluate feature flags' ) return end @feature_flags_poller.load_feature_flags(true) end |
#shutdown ⇒ Object
373 374 375 376 |
# File 'lib/posthog/client.rb', line 373 def shutdown @feature_flags_poller.shutdown_poller flush end |