Advanced
Custom Instrumentation
Leverage the re-exported Sentry SDK to record custom spans, breadcrumbs, tags, and messages.
@eienjs/adonisjs-sentry directly re-exports the full @sentry/node namespace through Sentry. You can import Sentry anywhere in your application without adding duplicate dependencies:
import { Sentry } from '@eienjs/adonisjs-sentry';
Adding Breadcrumbs
Breadcrumbs record a trail of events that took place prior to an error. Sentry automatically captures console and HTTP breadcrumbs, but you can add business-level milestones manually:
app/services/checkout_service.ts
import { Sentry } from '@eienjs/adonisjs-sentry';
export class CheckoutService {
async processCart(cartId: string) {
Sentry.addBreadcrumb({
category: 'checkout',
message: `Starting checkout validation for cart ${cartId}`,
level: 'info',
data: { cartId },
});
// ... continue processing
}
}
Capturing Custom Messages
To log informational or warning events to Sentry without throwing an exception:
app/services/subscription_service.ts
import { Sentry } from '@eienjs/adonisjs-sentry';
export class SubscriptionService {
renewSubscription(subscriptionId: string) {
Sentry.captureMessage(`Auto-renewal grace period triggered for ${subscriptionId}`, 'warning');
}
}
Custom Spans and Background Tasks
For long-running background tasks, queue jobs, or external API interactions, create custom spans with Sentry.startSpan:
app/tasks/sync_inventory.ts
import { Sentry } from '@eienjs/adonisjs-sentry';
export async function syncInventory() {
return await Sentry.startSpan(
{
name: 'inventory.sync',
op: 'task.sync',
},
async (span) => {
span.setAttribute('sync.source', 'warehouse_api');
const items = await fetchWarehouseItems();
span.setAttribute('sync.items_count', items.length);
await updateDatabaseRecords(items);
}
);
}
Setting Custom Tags and Context
You can enrich the current scope with domain-specific metadata that helps you query and filter issues in Sentry:
app/controllers/tenants_controller.ts
import type { HttpContext } from '@adonisjs/core/http';
import { Sentry } from '@eienjs/adonisjs-sentry';
export default class TenantsController {
async show({ params }: HttpContext) {
Sentry.setTag('tenant.plan', 'enterprise');
Sentry.setContext('tenant', {
id: params.id,
region: 'us-east-1',
});
// ...
}
}
