Skip to content

Commit 0115675

Browse files
Merge pull request #3319 from newrelic/record_custom_event_raise_on_invalid
Validate `record_custom_event` type
2 parents 9613fc9 + ae6b69b commit 0115675

File tree

4 files changed

+45
-4
lines changed

4 files changed

+45
-4
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,25 @@
33
## dev
44

55
- **Breaking Change: Remove support for Ruby 2.4 and 2.5**
6+
67
Support for Ruby versions 2.4 and 2.5 has been removed. The new minimum required Ruby version is now 2.6. [PR#3314](https://github.com/newrelic/newrelic-ruby-agent/pull/3314)
78

89
- **Breaking Change: Rename ActiveJob metrics**
10+
911
ActiveJob metrics have been updated to include the job's class name for more specific reporting. This is a breaking change and may require updating custom dashboards or alerts. [PR#3320](https://github.com/newrelic/newrelic-ruby-agent/pull/3320)
1012
- Old format: `Ruby/ActiveJob/<QueueName>/<Method>`
1113
- New format: `Ruby/ActiveJob/<ClassName>/<QueueName>/<Method>`
1214

1315
- **Breaking Change: Rename `bin/newrelic` command to `bin/newrelic_rpm`**
16+
1417
The executable file for the agent's CLI has been renamed from `bin/newrelic` to `bin/newrelic_rpm`. This change resolves a name collision with the standalone New Relic CLI tool. [PR#3323](https://github.com/newrelic/newrelic-ruby-agent/pull/3323)
1518

19+
- **Feature: Add argument validation for the `NewRelic::Agent#record_custom_event` API**
20+
21+
The `NewRelic::Agent#record_custom_event` API now raises an `ArgumentError` when an invalid `event_type` is provided. A valid event type must consist only of alphanumeric characters, underscores (`_`), colons (`:`), or spaces (` `). [PR#3319](https://github.com/newrelic/newrelic-ruby-agent/pull/3319)
22+
1623
- **Breaking Change: Remove experimental feature Configurable Security Policies (CSP)**
24+
1725
The experimental feature, Configurable Security Policies (CSP), is no longer supported and has been removed. [PR#3292](https://github.com/newrelic/newrelic-ruby-agent/pull/3292)
1826

1927
## v9.23.0

lib/new_relic/agent.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,9 @@ class SerializationError < StandardError; end
117117
# been configured for
118118
AUTOMATIC_TRACER_MAX_ATTEMPTS = 60 # 60 = try about twice a second for 30 seconds
119119

120+
# Event types must consist of only alphanumeric characters, '_', ':', or ' '.
121+
VALID_CUSTOM_EVENT_TYPE = /\A[\w: ]+\z/
122+
120123
attr_reader :error_group_callback
121124
attr_reader :llm_token_count_callback
122125

@@ -483,6 +486,10 @@ def set_error_group_callback(callback_proc)
483486
# @api public
484487
#
485488
def record_custom_event(event_type, event_attrs)
489+
unless event_type.to_s.match?(VALID_CUSTOM_EVENT_TYPE)
490+
raise ArgumentError, "Invalid event_type: '#{event_type}'. Event types must consist of only alphanumeric characters, '_', ':', or ' '."
491+
end
492+
486493
record_api_supportability_metric(:record_custom_event)
487494

488495
if agent && NewRelic::Agent.config[:'custom_insights_events.enabled']

test/multiverse/suites/agent_only/custom_analytics_events_test.rb

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,38 @@ def test_record_custom_event_returns_falsy_if_event_was_dropped
3636
refute(result)
3737
end
3838

39-
def test_record_doesnt_record_if_invalid_event_type
39+
def test_record_custom_event_accepts_valid_event_types
40+
NewRelic::Agent.record_custom_event('ValidEvent', {})
41+
NewRelic::Agent.record_custom_event('valid_Event_underscore', {})
42+
NewRelic::Agent.record_custom_event('Valid:Event:Colon', {})
43+
NewRelic::Agent.record_custom_event('Valid Event Space', {})
44+
NewRelic::Agent.record_custom_event('Valid123Event456Numbers', {})
45+
NewRelic::Agent.record_custom_event('valideventlowercase', {})
46+
NewRelic::Agent.record_custom_event(:ValidSymbol, {})
47+
NewRelic::Agent.record_custom_event(:Valid_Symbol_Underscore, {})
48+
49+
NewRelic::Agent.agent.send(:harvest_and_send_custom_event_data)
50+
events = last_posted_events
51+
52+
assert_equal(8, events.size)
53+
end
54+
55+
def test_record_custom_event_raises_on_invalid_event_types
56+
assert_raises(ArgumentError) { NewRelic::Agent.record_custom_event('', foo: :bar) }
57+
assert_raises(ArgumentError) { NewRelic::Agent.record_custom_event('[email protected]', foo: :bar) }
58+
assert_raises(ArgumentError) { NewRelic::Agent.record_custom_event('bang!', foo: :bar) }
59+
assert_raises(ArgumentError) { NewRelic::Agent.record_custom_event('hyphen-ated', foo: :bar) }
60+
assert_raises(ArgumentError) { NewRelic::Agent.record_custom_event('bad$news', foo: :bar) }
61+
assert_raises(ArgumentError) { NewRelic::Agent.record_custom_event(nil, foo: :bar) }
62+
end
63+
64+
def test_record_custom_event_skips_bad_event_types
4065
bad_event_type = 'bad$news'
4166
good_event_type = 'good news'
4267

43-
NewRelic::Agent.record_custom_event(bad_event_type, :foo => :bar)
44-
NewRelic::Agent.record_custom_event(good_event_type, :foo => :bar)
68+
assert_raises(ArgumentError) { NewRelic::Agent.record_custom_event(bad_event_type, foo: :bar) }
4569

70+
NewRelic::Agent.record_custom_event(good_event_type, :foo => :bar)
4671
NewRelic::Agent.agent.send(:harvest_and_send_custom_event_data)
4772
events = last_posted_events
4873

test/new_relic/agent/llm/llm_event_test.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@ def test_event_attributes_adds_custom_attributes
6060

6161
def test_record_does_not_create_an_event
6262
event = NewRelic::Agent::Llm::LlmEvent.new
63-
event.record
63+
assert_raises(ArgumentError) { event.record('', foo: :bar) }
64+
6465
_, events = NewRelic::Agent.agent.custom_event_aggregator.harvest!
6566

6667
assert_empty events

0 commit comments

Comments
 (0)