Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
4fe0916
Add OpenTelemetry collector mode
unflxw Jul 8, 2026
781eac6
Emit OpenTelemetry logs in collector mode
unflxw Jul 8, 2026
f58e01f
Emit OpenTelemetry metrics in collector mode
unflxw Jul 8, 2026
120e06e
Test the metric probes in collector mode
unflxw Jul 8, 2026
11c8e1f
Emit OpenTelemetry traces in collector mode
unflxw Jul 8, 2026
eedcecb
Test integrations in collector mode
unflxw Jul 8, 2026
38cf810
Inject trace context into outgoing HTTP requests
unflxw Jul 8, 2026
f46d524
Extract trace context from incoming web requests
unflxw Jul 8, 2026
116cd3c
Propagate trace context across background jobs
unflxw Jul 8, 2026
8673a06
Run error blocks eagerly in collector mode
unflxw Jul 10, 2026
511c7dc
Tag Sequel query spans CLIENT in collector mode
unflxw Jul 14, 2026
dd607b6
Extract trace context onto an empty context
unflxw Jul 16, 2026
a444da2
Guard blocks handed to the transaction
unflxw Jul 16, 2026
9fbba00
Drop actionless transactions in collector mode
unflxw Jul 16, 2026
4ddb131
Record the Delayed Job enqueue as a producer span
unflxw Jul 16, 2026
666148b
Dual-mode transaction and helper spec coverage
unflxw Jul 16, 2026
06bb4e8
Resolve OTel logger per emit, drop the cache
unflxw Jul 21, 2026
fcae93f
Add opentelemetry_scope to instrumentation
unflxw Jul 21, 2026
1bfbc24
Derive AS::N span scope from the event group
unflxw Jul 20, 2026
6f3004e
Test AS::N derived instrumentation scope
unflxw Jul 20, 2026
c7ade96
Tag Rack and web framework spans with scope
unflxw Jul 21, 2026
f83bf78
Test Rack and web framework span scope
unflxw Jul 21, 2026
0cb1e43
Tag remaining integration spans with scope
unflxw Jul 21, 2026
6bc76a1
Test remaining integration scopes
unflxw Jul 21, 2026
ee4fd8a
Add changeset for per-integration scopes
unflxw Jul 29, 2026
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
10 changes: 10 additions & 0 deletions .changesets/add-collector-attribute-options.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
bump: minor
type: add
---

Add configuration options that map to OpenTelemetry resource attributes under collector mode: `service_name`, `filter_attributes`, `filter_function_parameters`, `filter_request_query_parameters`, `filter_request_payload`, `response_headers`, `send_function_parameters`, `send_request_query_parameters`, and `send_request_payload`. These tell the AppSignal Collector how to filter and forward telemetry data.

When collector mode is active, existing configuration options (`name`, environment, `hostname`, `revision`, `ignore_actions`, `ignore_errors`, `ignore_namespaces`, `request_headers`, `filter_session_data`, `send_session_data`) are now passed to the collector as OpenTelemetry resource attributes.

Setting any of these options without `collector_endpoint`, or `filter_parameters`/`filter_metadata`/`send_params` with `collector_endpoint`, now logs a warning at startup.
19 changes: 19 additions & 0 deletions .changesets/add-collector-mode.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
---
bump: minor
type: add
---

Add a new `collector_endpoint` configuration option (`APPSIGNAL_COLLECTOR_ENDPOINT` environment variable) that puts the integration in _collector mode_. When set, AppSignal additionally configures an OpenTelemetry SDK that exports OTLP/HTTP protobuf traces, metrics, and logs to the configured endpoint. The existing AppSignal agent continues to run unchanged; no AppSignal-collected data flows through the OpenTelemetry SDK yet.

Collector mode requires Ruby 3.1 or newer and the OpenTelemetry gems, which are optional and not installed by default. To use it, add them to your application's `Gemfile`:

```ruby
gem "opentelemetry-sdk", ">= 1.8.0"
gem "opentelemetry-metrics-sdk", ">= 0.7.1"
gem "opentelemetry-logs-sdk", ">= 0.2.0"
gem "opentelemetry-exporter-otlp", ">= 0.30.0"
gem "opentelemetry-exporter-otlp-metrics", ">= 0.4.0"
gem "opentelemetry-exporter-otlp-logs", ">= 0.2.0"
```

If these gems are missing or older than the minimum versions, AppSignal logs a warning and falls back to the bundled agent.
6 changes: 6 additions & 0 deletions .changesets/add-que-distributed-tracing.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
bump: minor
type: add
---

Improve Que support. In collector mode, AppSignal now propagates trace context when enqueuing Que jobs, so each job links back to the trace that enqueued it. This covers single and bulk enqueues, on both Que 1 and Que 2.
10 changes: 10 additions & 0 deletions .changesets/complete-transaction-when-a-block-raises.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
bump: patch
type: fix
---

Complete the transaction even when a block handed to it raises.

The error block given to `Appsignal.send_error` and `Appsignal.report_error`, and the internal `after_create` and `before_complete` hooks, are user code that can raise. An error block runs at completion in agent mode, and the hooks run during creation and completion, so these blocks run far from where they were defined.

Until now, an exception from any of these blocks propagated out of transaction creation or completion. That surfaced the error in unrelated code, and it could leave the transaction unfinished. These blocks are now run defensively. The failure is logged, naming the error and where the block was defined, and creation and completion carry on.
6 changes: 6 additions & 0 deletions .changesets/drop-actionless-collector-transactions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
bump: patch
type: fix
---

In collector mode, drop a transaction that never set an action name instead of reporting it under the placeholder `appsignal.transaction <namespace>` action. A request that is not routed to an action -- for example a static asset served without a controller -- has no action to group by. Agent mode does not report such a transaction, but collector mode was surfacing every one of them under a single shared placeholder action. The transaction's root span is now flagged with `appsignal.ignore_subtrace` on completion, so the AppSignal Collector (0.10.0 and newer) drops it, matching agent mode.
11 changes: 11 additions & 0 deletions .changesets/sequel-query-spans-client-kind.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
bump: patch
type: fix
---

Mark Sequel query spans as CLIENT kind in collector mode. The sequel-rails gem
emits its queries as `sql.sequel` ActiveSupport::Notifications events, which are
recorded through the generic notifications integration rather than the dedicated
Sequel hook. That path only tagged `sql.active_record` as an outgoing datastore
call, so Sequel queries were exported with the default span kind. They now carry
CLIENT kind, matching ActiveRecord and the dedicated Sequel hook.
6 changes: 6 additions & 0 deletions .changesets/tag-integration-instrumentation-scope.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
bump: patch
type: change
---

In collector mode, each AppSignal integration now records its spans under its own OpenTelemetry instrumentation scope. The scope is named after the integration, for example `appsignal-ruby/sidekiq` or `appsignal-ruby/net_http`. The Rails components that are bridged through `ActiveSupport::Notifications` are named after the component, for example `appsignal-ruby/active_record` and `appsignal-ruby/action_view`. This makes it possible to group spans by the integration that produced them. Custom instrumentation keeps the default `appsignal-ruby` scope, and so does anything else without a more specific scope.
Loading
Loading