Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions lib/new_relic/agent.rb
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,9 @@ class SerializationError < StandardError; end
# been configured for
AUTOMATIC_TRACER_MAX_ATTEMPTS = 60 # 60 = try about twice a second for 30 seconds

# Event types must consist of only alphanumeric characters, '_', ':', or ' '.
VALID_CUSTOM_EVENT_TYPE = /\A[\w: ]+\z/

attr_reader :error_group_callback
attr_reader :llm_token_count_callback

Expand Down Expand Up @@ -483,6 +486,10 @@ def set_error_group_callback(callback_proc)
# @api public
#
def record_custom_event(event_type, event_attrs)
unless event_type.to_s.match?(VALID_CUSTOM_EVENT_TYPE)
raise ArgumentError, "Invalid event_type: '#{event_type}'. Event types must consist of only alphanumeric characters, '_', ':', or ' '."
end

record_api_supportability_metric(:record_custom_event)

if agent && NewRelic::Agent.config[:'custom_insights_events.enabled']
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,36 @@ def test_record_custom_event_returns_falsy_if_event_was_dropped
refute(result)
end

def test_record_doesnt_record_if_invalid_event_type
def test_record_custom_event_accepts_valid_event_types
NewRelic::Agent.record_custom_event('ValidEvent', {})
NewRelic::Agent.record_custom_event('Valid_Event', {})
NewRelic::Agent.record_custom_event('Valid:Event', {})
NewRelic::Agent.record_custom_event('Valid Event', {})
NewRelic::Agent.record_custom_event(:ValidSymbol, {})
NewRelic::Agent.record_custom_event(:Valid_Symbol, {})

NewRelic::Agent.agent.send(:harvest_and_send_custom_event_data)
events = last_posted_events

assert_equal(6, events.size)
end

def test_record_custom_event_raises_on_invalid_event_types
assert_raises(ArgumentError) { NewRelic::Agent.record_custom_event('', foo: :bar) }
assert_raises(ArgumentError) { NewRelic::Agent.record_custom_event('email@example.com', foo: :bar) }
assert_raises(ArgumentError) { NewRelic::Agent.record_custom_event('bang!', foo: :bar) }
assert_raises(ArgumentError) { NewRelic::Agent.record_custom_event('hyphen-ated', foo: :bar) }
assert_raises(ArgumentError) { NewRelic::Agent.record_custom_event('bad$news', foo: :bar) }
assert_raises(ArgumentError) { NewRelic::Agent.record_custom_event(nil, foo: :bar) }
end

def test_record_custom_event_skips_bad_event_types
bad_event_type = 'bad$news'
good_event_type = 'good news'

NewRelic::Agent.record_custom_event(bad_event_type, :foo => :bar)
NewRelic::Agent.record_custom_event(good_event_type, :foo => :bar)
assert_raises(ArgumentError) { NewRelic::Agent.record_custom_event(bad_event_type, foo: :bar) }

NewRelic::Agent.record_custom_event(good_event_type, :foo => :bar)
NewRelic::Agent.agent.send(:harvest_and_send_custom_event_data)
events = last_posted_events

Expand Down
3 changes: 2 additions & 1 deletion test/new_relic/agent/llm/llm_event_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,8 @@ def test_event_attributes_adds_custom_attributes

def test_record_does_not_create_an_event
event = NewRelic::Agent::Llm::LlmEvent.new
event.record
assert_raises(ArgumentError) { event.record('', foo: :bar) }

_, events = NewRelic::Agent.agent.custom_event_aggregator.harvest!

assert_empty events
Expand Down