chargebee 2.74.0 → 2.76.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +16 -0
  3. data/Gemfile.lock +2 -2
  4. data/README.md +53 -0
  5. data/VERSION +1 -1
  6. data/chargebee.gemspec +12 -2
  7. data/lib/chargebee/environment.rb +3 -2
  8. data/lib/chargebee/models/addon.rb +7 -7
  9. data/lib/chargebee/models/address.rb +2 -2
  10. data/lib/chargebee/models/alert.rb +6 -6
  11. data/lib/chargebee/models/alert_status.rb +2 -2
  12. data/lib/chargebee/models/attached_item.rb +5 -5
  13. data/lib/chargebee/models/business_entity.rb +2 -2
  14. data/lib/chargebee/models/card.rb +5 -5
  15. data/lib/chargebee/models/comment.rb +4 -4
  16. data/lib/chargebee/models/configuration.rb +1 -1
  17. data/lib/chargebee/models/coupon.rb +9 -9
  18. data/lib/chargebee/models/coupon_code.rb +4 -4
  19. data/lib/chargebee/models/coupon_set.rb +7 -7
  20. data/lib/chargebee/models/credit_note.rb +14 -14
  21. data/lib/chargebee/models/csv_tax_rule.rb +6 -1
  22. data/lib/chargebee/models/currency.rb +6 -6
  23. data/lib/chargebee/models/customer.rb +26 -26
  24. data/lib/chargebee/models/customer_entitlement.rb +1 -1
  25. data/lib/chargebee/models/differential_price.rb +5 -5
  26. data/lib/chargebee/models/entitlement.rb +2 -2
  27. data/lib/chargebee/models/entitlement_override.rb +2 -2
  28. data/lib/chargebee/models/estimate.rb +20 -20
  29. data/lib/chargebee/models/event.rb +2 -2
  30. data/lib/chargebee/models/export.rb +18 -18
  31. data/lib/chargebee/models/feature.rb +8 -8
  32. data/lib/chargebee/models/gift.rb +7 -7
  33. data/lib/chargebee/models/grant_block.rb +1 -1
  34. data/lib/chargebee/models/hosted_page.rb +22 -22
  35. data/lib/chargebee/models/in_app_subscription.rb +4 -4
  36. data/lib/chargebee/models/invoice.rb +40 -40
  37. data/lib/chargebee/models/item.rb +5 -5
  38. data/lib/chargebee/models/item_entitlement.rb +4 -4
  39. data/lib/chargebee/models/item_family.rb +5 -5
  40. data/lib/chargebee/models/item_price.rb +7 -7
  41. data/lib/chargebee/models/ledger_account_balance.rb +1 -1
  42. data/lib/chargebee/models/ledger_operation.rb +6 -6
  43. data/lib/chargebee/models/non_subscription.rb +1 -1
  44. data/lib/chargebee/models/offer_event.rb +1 -1
  45. data/lib/chargebee/models/offer_fulfillment.rb +3 -3
  46. data/lib/chargebee/models/omnichannel_one_time_order.rb +2 -2
  47. data/lib/chargebee/models/omnichannel_subscription.rb +4 -4
  48. data/lib/chargebee/models/omnichannel_subscription_item.rb +1 -1
  49. data/lib/chargebee/models/order.rb +12 -12
  50. data/lib/chargebee/models/payment_intent.rb +3 -3
  51. data/lib/chargebee/models/payment_schedule_scheme.rb +3 -3
  52. data/lib/chargebee/models/payment_source.rb +16 -16
  53. data/lib/chargebee/models/payment_voucher.rb +4 -4
  54. data/lib/chargebee/models/personalized_offer.rb +1 -1
  55. data/lib/chargebee/models/plan.rb +7 -7
  56. data/lib/chargebee/models/portal_session.rb +4 -4
  57. data/lib/chargebee/models/price_variant.rb +5 -5
  58. data/lib/chargebee/models/pricing_page_session.rb +2 -2
  59. data/lib/chargebee/models/promotional_credit.rb +5 -5
  60. data/lib/chargebee/models/promotional_grant.rb +1 -1
  61. data/lib/chargebee/models/purchase.rb +2 -2
  62. data/lib/chargebee/models/quote.rb +26 -26
  63. data/lib/chargebee/models/ramp.rb +5 -5
  64. data/lib/chargebee/models/recorded_purchase.rb +2 -2
  65. data/lib/chargebee/models/resource_migration.rb +1 -1
  66. data/lib/chargebee/models/rule.rb +1 -1
  67. data/lib/chargebee/models/site_migration_detail.rb +1 -1
  68. data/lib/chargebee/models/subscription.rb +37 -37
  69. data/lib/chargebee/models/subscription_entitlement.rb +2 -2
  70. data/lib/chargebee/models/time_machine.rb +3 -3
  71. data/lib/chargebee/models/transaction.rb +11 -11
  72. data/lib/chargebee/models/unbilled_charge.rb +6 -6
  73. data/lib/chargebee/models/usage.rb +5 -5
  74. data/lib/chargebee/models/usage_charge.rb +1 -1
  75. data/lib/chargebee/models/usage_event.rb +2 -2
  76. data/lib/chargebee/models/usage_file.rb +2 -2
  77. data/lib/chargebee/models/usage_summary.rb +1 -1
  78. data/lib/chargebee/models/virtual_bank_account.rb +6 -6
  79. data/lib/chargebee/models/webhook_endpoint.rb +5 -5
  80. data/lib/chargebee/request.rb +37 -8
  81. data/lib/chargebee/telemetry/request_telemetry_context.rb +29 -0
  82. data/lib/chargebee/telemetry/request_telemetry_error.rb +20 -0
  83. data/lib/chargebee/telemetry/request_telemetry_result.rb +20 -0
  84. data/lib/chargebee/telemetry/telemetry_adapter.rb +32 -0
  85. data/lib/chargebee/telemetry/telemetry_attribute_keys.rb +33 -0
  86. data/lib/chargebee/telemetry/telemetry_support.rb +123 -0
  87. data/lib/chargebee/telemetry_executor.rb +95 -0
  88. data/lib/chargebee.rb +9 -1
  89. data/spec/chargebee/request_telemetry_spec.rb +75 -0
  90. data/spec/chargebee/telemetry_executor_spec.rb +147 -0
  91. data/spec/chargebee/telemetry_support_spec.rb +29 -0
  92. metadata +15 -2
@@ -0,0 +1,147 @@
1
+ require 'spec_helper'
2
+
3
+ module ChargeBee
4
+ class RecordingTelemetryAdapter
5
+ include Telemetry::TelemetryAdapter
6
+
7
+ attr_reader :events, :start_context, :end_result
8
+
9
+ def initialize
10
+ @events = []
11
+ end
12
+
13
+ def on_request_start(context, request_headers)
14
+ @events << 'start'
15
+ @start_context = context
16
+ request_headers['traceparent'] = '00-test-trace'
17
+ 'span-1'
18
+ end
19
+
20
+ def on_request_end(handle, result)
21
+ @events << 'end'
22
+ @end_result = result
23
+ end
24
+ end
25
+ end
26
+
27
+ describe ChargeBee::TelemetryExecutor do
28
+ let(:env) do
29
+ ChargeBee::Environment.new(api_key: 'test_key', site: 'acme')
30
+ end
31
+
32
+ it 'skips telemetry when no adapter is configured' do
33
+ result = ChargeBee::TelemetryExecutor.execute(
34
+ env,
35
+ telemetry_resource: 'customer',
36
+ telemetry_operation: 'list',
37
+ method: 'get',
38
+ http_url: 'https://acme.chargebee.com/api/v2/customers',
39
+ ) do |headers|
40
+ expect(headers).to be_nil
41
+ [200, :ok]
42
+ end
43
+
44
+ expect(result).to eq(:ok)
45
+ end
46
+
47
+ it 'skips telemetry when resource or operation metadata is missing' do
48
+ adapter = ChargeBee::RecordingTelemetryAdapter.new
49
+ env.telemetry_adapter = adapter
50
+
51
+ result = ChargeBee::TelemetryExecutor.execute(
52
+ env,
53
+ telemetry_resource: '',
54
+ telemetry_operation: 'list',
55
+ method: 'get',
56
+ http_url: 'https://acme.chargebee.com/api/v2/customers',
57
+ ) do |_headers|
58
+ [200, :ok]
59
+ end
60
+
61
+ expect(result).to eq(:ok)
62
+ expect(adapter.events).to be_empty
63
+ end
64
+
65
+ it 'calls adapter once per request and injects trace headers' do
66
+ adapter = ChargeBee::RecordingTelemetryAdapter.new
67
+ env.telemetry_adapter = adapter
68
+
69
+ result = ChargeBee::TelemetryExecutor.execute(
70
+ env,
71
+ telemetry_resource: 'customer',
72
+ telemetry_operation: 'list',
73
+ method: 'get',
74
+ http_url: 'https://acme.chargebee.com/api/v2/customers',
75
+ ) do |headers|
76
+ expect(headers['traceparent']).to eq('00-test-trace')
77
+ [200, :ok]
78
+ end
79
+
80
+ expect(result).to eq(:ok)
81
+ expect(adapter.events).to eq(%w[start end])
82
+ expect(adapter.start_context.span_name).to eq('chargebee.customer.list')
83
+ expect(adapter.end_result.http_status_code).to eq(200)
84
+ end
85
+
86
+ it 'captures chargebee-* request headers and excludes the PII origin family' do
87
+ adapter = ChargeBee::RecordingTelemetryAdapter.new
88
+ env.telemetry_adapter = adapter
89
+ request_headers = {
90
+ 'chargebee-foo' => 'bar',
91
+ 'Chargebee-Idempotency-Key' => 'idem-key-1',
92
+ 'Authorization' => 'Basic super-secret',
93
+ 'chargebee-request-origin-ip' => '202.170.207.70',
94
+ }
95
+
96
+ ChargeBee::TelemetryExecutor.execute(
97
+ env,
98
+ telemetry_resource: 'customer',
99
+ telemetry_operation: 'list',
100
+ method: 'get',
101
+ http_url: 'https://acme.chargebee.com/api/v2/customers',
102
+ request_headers: request_headers,
103
+ ) do |_headers|
104
+ [200, :ok]
105
+ end
106
+
107
+ attrs = adapter.start_context.start_attributes
108
+ expect(attrs['http.request.header.chargebee-foo']).to eq('bar')
109
+ expect(attrs['http.request.header.chargebee-idempotency-key']).to eq('idem-key-1')
110
+ expect(attrs['http.request.header.authorization']).to be_nil
111
+ expect(attrs['http.request.header.chargebee-request-origin-ip']).to be_nil
112
+ expect(attrs.to_s).not_to include('202.170.207.70')
113
+ end
114
+
115
+ it 'records chargebee API errors on failure' do
116
+ adapter = ChargeBee::RecordingTelemetryAdapter.new
117
+ env.telemetry_adapter = adapter
118
+ api_error = ChargeBee::InvalidRequestError.new(
119
+ 404,
120
+ {
121
+ message: 'Not found',
122
+ type: 'invalid_request',
123
+ api_error_code: 'resource_not_found',
124
+ param: 'customer_id',
125
+ },
126
+ )
127
+
128
+ expect do
129
+ ChargeBee::TelemetryExecutor.execute(
130
+ env,
131
+ telemetry_resource: 'customer',
132
+ telemetry_operation: 'retrieve',
133
+ method: 'get',
134
+ http_url: 'https://acme.chargebee.com/api/v2/customers/1',
135
+ ) do |_headers|
136
+ raise api_error
137
+ end
138
+ end.to raise_error(api_error)
139
+
140
+ expect(adapter.events).to eq(%w[start end])
141
+ expect(adapter.end_result.http_status_code).to eq(404)
142
+ expect(adapter.end_result.error.chargebee_error_code).to eq('resource_not_found')
143
+ expect(adapter.end_result.end_attributes['error.type']).to eq('invalid_request')
144
+ expect(adapter.end_result.end_attributes['chargebee.error.type']).to eq('invalid_request')
145
+ expect(adapter.end_result.end_attributes['error.type']).not_to eq('404')
146
+ end
147
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe ChargeBee::Telemetry::TelemetrySupport do
4
+ describe '.build_request_end_span_attributes' do
5
+ it 'uses chargebee error type for error.type' do
6
+ error = ChargeBee::Telemetry::RequestTelemetryError.new(
7
+ message: 'Not found',
8
+ chargebee_error_code: 'resource_not_found',
9
+ chargebee_api_error_type: 'invalid_request',
10
+ )
11
+
12
+ attributes = described_class.build_request_end_span_attributes(404, error)
13
+
14
+ expect(attributes[ChargeBee::Telemetry::TelemetryAttributeKeys::HTTP_RESPONSE_STATUS_CODE]).to eq(404)
15
+ expect(attributes[ChargeBee::Telemetry::TelemetryAttributeKeys::ERROR_TYPE]).to eq('invalid_request')
16
+ expect(attributes[ChargeBee::Telemetry::TelemetryAttributeKeys::CHARGEBEE_ERROR_TYPE]).to eq('invalid_request')
17
+ end
18
+
19
+ it 'omits error.type when chargebee error classification is unavailable' do
20
+ error = ChargeBee::Telemetry::RequestTelemetryError.new(message: 'request failed')
21
+
22
+ attributes = described_class.build_request_end_span_attributes(500, error)
23
+
24
+ expect(attributes[ChargeBee::Telemetry::TelemetryAttributeKeys::HTTP_RESPONSE_STATUS_CODE]).to eq(500)
25
+ expect(attributes).not_to have_key(ChargeBee::Telemetry::TelemetryAttributeKeys::ERROR_TYPE)
26
+ expect(attributes).not_to have_key(ChargeBee::Telemetry::TelemetryAttributeKeys::CHARGEBEE_ERROR_TYPE)
27
+ end
28
+ end
29
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chargebee
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.74.0
4
+ version: 2.76.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rajaraman S
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2026-06-18 00:00:00.000000000 Z
12
+ date: 2026-07-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: cgi
@@ -200,10 +200,20 @@ files:
200
200
  - lib/chargebee/request.rb
201
201
  - lib/chargebee/rest.rb
202
202
  - lib/chargebee/result.rb
203
+ - lib/chargebee/telemetry/request_telemetry_context.rb
204
+ - lib/chargebee/telemetry/request_telemetry_error.rb
205
+ - lib/chargebee/telemetry/request_telemetry_result.rb
206
+ - lib/chargebee/telemetry/telemetry_adapter.rb
207
+ - lib/chargebee/telemetry/telemetry_attribute_keys.rb
208
+ - lib/chargebee/telemetry/telemetry_support.rb
209
+ - lib/chargebee/telemetry_executor.rb
203
210
  - lib/chargebee/util.rb
204
211
  - lib/ssl/ca-certs.crt
205
212
  - spec/chargebee/list_result_spec.rb
206
213
  - spec/chargebee/native_request_spec.rb
214
+ - spec/chargebee/request_telemetry_spec.rb
215
+ - spec/chargebee/telemetry_executor_spec.rb
216
+ - spec/chargebee/telemetry_support_spec.rb
207
217
  - spec/chargebee_spec.rb
208
218
  - spec/errors_spec.rb
209
219
  - spec/sample_response.rb
@@ -236,6 +246,9 @@ summary: Ruby client for Chargebee API.
236
246
  test_files:
237
247
  - spec/chargebee/list_result_spec.rb
238
248
  - spec/chargebee/native_request_spec.rb
249
+ - spec/chargebee/request_telemetry_spec.rb
250
+ - spec/chargebee/telemetry_executor_spec.rb
251
+ - spec/chargebee/telemetry_support_spec.rb
239
252
  - spec/chargebee_spec.rb
240
253
  - spec/errors_spec.rb
241
254
  - spec/sample_response.rb