diff --git a/app/services/billable_metrics/update_service.rb b/app/services/billable_metrics/update_service.rb index 95a1f3ee456c..2bd2c3acdc6f 100644 --- a/app/services/billable_metrics/update_service.rb +++ b/app/services/billable_metrics/update_service.rb @@ -40,6 +40,9 @@ def call billable_metric.recurring = params[:recurring] if params.key?(:recurring) billable_metric.weighted_interval = params[:weighted_interval]&.to_sym if params.key?(:weighted_interval) billable_metric.expression = params[:expression] if params.key?(:expression) + if params.key?(:expression) || params.key?(:field_name) + Rails.cache.delete("expression/#{organization.id}/#{billable_metric.code}") + end end billable_metric.save! diff --git a/app/services/events/create_service.rb b/app/services/events/create_service.rb index 5f6dcd6a3b2a..b97a792a6c24 100644 --- a/app/services/events/create_service.rb +++ b/app/services/events/create_service.rb @@ -42,13 +42,16 @@ def call attr_reader :organization, :params, :timestamp, :metadata def pre_ingest(event) - bm = organization.billable_metrics.with_expression.find_by(code: event.code) - return unless bm + field_name, expression = Rails.cache.fetch("expression/#{organization.id}/#{event.code}") do + bm = organization.billable_metrics.with_expression.find_by(code: event.code) + [bm&.field_name, bm&.expression] + end + return if expression.blank? evaluation_event = Lago::Event.new(event.code, event.timestamp.to_i, event.properties) - value = Lago::ExpressionParser.parse(bm.expression)&.evaluate(evaluation_event) - event.properties[bm.field_name] = value + value = Lago::ExpressionParser.parse(expression).evaluate(evaluation_event) + event.properties[field_name] = value end def produce_kafka_event(event)