← Extractions

Fix Production Bugs 20× Faster with Structured Logging — John Callaghan, wroclove.rb 2025

John Callaghan shares a five-step 'Steps to Observable Software' (SOS) methodology for diagnosing production bugs using structured logging in Rails, built on Semantic Logger and OpenTelemetry semantic conventions. He walks through a real BiggerPockets incident where scraper-induced queue congestion delayed password reset emails, and answers extensive Q&A on logging costs, domain objects, privacy, schemas, alerts, and tracing vs logging.

Model
claude-opus-4-7
Ingestion
c3878fb3
Input tokens
227,743
fresh
138,893
cached
75,169
cache write
13,681
Output tokens
16,484
Duration
247.1s
Roundtrips
5
Tool calls
19
Cost
$0.00
Nodes/edges extracted
35 / 66
Read set (nodes/edges)
122 / 0

Nodes (35)

create John Callaghan person
kind (empty) person
name (empty) John Callaghan
slug (empty) john-callaghan
attrs (empty) {"rails_experience_years" => "15"}
description (empty) Ruby on Rails engineer with 15 years of experience. At the time of the talk works at BiggerPockets, soon moving to Dy...
short_description (empty) Ruby/Rails observability expert, formerly BiggerPockets, moving to Dynatrace.
create BiggerPockets company
kind (empty) company
name (empty) BiggerPockets
slug (empty) biggerpockets
attrs (empty) {"members" => "3M+", "industry" => "real estate", "location" => "US"}
description (empty) US real estate company with ~3 million members on its platform. Callaghan's employer at the time of the talk; the con...
short_description (empty) US-based real estate platform; Callaghan's employer at the time of the talk.
create Dynatrace company
kind (empty) company
name (empty) Dynatrace
slug (empty) dynatrace
attrs (empty) {"industry" => "observability"}
description (empty) Observability vendor. Callaghan is joining Dynatrace to develop the best Ruby agent/client. The talk demonstrates sen...
short_description (empty) Observability vendor; Callaghan's next employer after BiggerPockets.
create Fix Production Bugs 20 Times Faster talk
kind (empty) talk
name (empty) Fix Production Bugs 20 Times Faster
slug (empty) fix-production-bugs-20-times-faster
attrs (empty) {"type" => "talk", "subtitle" => "The Power of Structured Logging"}
description (empty) Callaghan's wroclove.rb 2025 talk subtitled 'The Power of Structured Logging'. Opens with a Friday-afternoon on-call ...
short_description (empty) Callaghan's wroclove.rb 2025 talk on structured logging and the SOS methodology.
create Semantic Logger tool
kind (empty) tool
name (empty) Semantic Logger
slug (empty) semantic-logger
attrs (empty) {"category" => "library", "language" => "Ruby"}
description (empty) Ruby logging library (installed via rails_semantic_logger for Rails bindings). Supports structured JSON payloads, aut...
short_description (empty) Mature Ruby logging library supporting structured JSON payloads and appenders.
create OpenTelemetry Semantic Conventions concept
kind (empty) concept
name (empty) OpenTelemetry Semantic Conventions
slug (empty) opentelemetry-semantic-conventions
attrs (empty) {"category" => "pattern"}
description (empty) Set of standard attribute names published by the OpenTelemetry project. Do not require installing the OpenTelemetry S...
short_description (empty) Standardized attribute-naming conventions for telemetry across vendors.
create Structured Logging concept
kind (empty) concept
name (empty) Structured Logging
slug (empty) structured-logging
attrs (empty) {"category" => "practice"}
description (empty) Logging approach where each log line carries a structured payload (essentially a hash / JSON object of attributes) ra...
short_description (empty) Emitting logs as key/value attributes instead of plain strings.
create Steps to Observable Software concept
kind (empty) concept
name (empty) Steps to Observable Software
slug (empty) steps-to-observable-software
attrs (empty) {"category" => "methodology"}
description (empty) Callaghan's five-step methodology (abbreviated SOS) developed at BiggerPockets for adding observability incrementally...
short_description (empty) Callaghan's five-step SOS cycle for adding observability to fix specific bugs.
create config.log_tags concept
kind (empty) concept
name (empty) config.log_tags
slug (empty) config-log_tags
attrs (empty) {"category" => "practice"}
description (empty) Rails application configuration setting (in application.rb) that defines a hash of tags attached to every request log...
short_description (empty) Rails config hook to attach per-request attributes to every log line.
create Faraday outbound logging middleware concept
kind (empty) concept
name (empty) Faraday outbound logging middleware
slug (empty) faraday-outbound-logging-middleware
attrs (empty) {"category" => "pattern"}
description (empty) Pattern shown in the talk: define a Faraday middleware that fires on every response returned from an outbound API cal...
short_description (empty) Faraday middleware logging URL, duration, and attributes of every outbound API call.
create Filter Parameter concept
kind (empty) concept
name (empty) Filter Parameter
slug (empty) filter-parameter
attrs (empty) {"category" => "practice"}
description (empty) Built-in Rails facility (parameter filter) that, given a configured list of regular expressions or strings, redacts m...
short_description (empty) Rails facility that redacts configured attributes (PII) from payloads.
create Domain Object Structured Logging concept
kind (empty) concept
name (empty) Domain Object Structured Logging
slug (empty) domain-object-structured-logging
attrs (empty) {"category" => "pattern"}
description (empty) Callaghan's pattern for extending observability to business logic. Every domain object in the codebase responds to to...
short_description (empty) Logging to_formatted_h representations of business domain objects.
create Events-all-the-way-down Instrumentation concept
kind (empty) concept
name (empty) Events-all-the-way-down Instrumentation
slug (empty) events-all-the-way-down-instrumentation
attrs (empty) {"category" => "architecture"}
description (empty) Architectural direction Callaghan is pursuing: instrument the codebase once with domain events (a basic value object)...
short_description (empty) Instrument code with generic events, independent of log/trace/metric output sink.
create Logs vs Traces vs Metrics concept
kind (empty) concept
name (empty) Logs vs Traces vs Metrics
slug (empty) logs-vs-traces-vs-metrics
attrs (empty) {"category" => "practice"}
description (empty) Callaghan argues the phrase 'three pillars of observability' is misleading — traces, logs, and metrics are three data...
short_description (empty) Callaghan's take on the three observability data types.
create Faraday tool
kind (empty) tool
name (empty) Faraday
slug (empty) faraday
attrs (empty) {"category" => "library", "language" => "Ruby"}
description (empty) Ruby HTTP client with a middleware architecture. Callaghan (tongue-in-cheek) calls it the best HTTP client in Ruby an...
short_description (empty) Ruby HTTP client with pluggable middleware.
create Schema.org resource
kind (empty) resource
name (empty) Schema.org
slug (empty) schema-org
attrs (empty) {"type" => "documentation"}
description (empty) Open standard vocabulary for marking up web pages with standard attributes derived from business objects. Callaghan h...
short_description (empty) Open vocabulary for marking up web pages with business-object attributes.
create JSON Schema for analytics events concept
kind (empty) concept
name (empty) JSON Schema for analytics events
slug (empty) json-schema-for-analytics-events
attrs (empty) {"category" => "practice"}
description (empty) Callaghan's working solution for enforcing consistency on domain-object events: JSON Schemas validate attributes of e...
short_description (empty) Using JSON Schema to enforce attribute shapes on analytics/observability events.
create Segment tool
kind (empty) tool
name (empty) Segment
slug (empty) segment
attrs (empty) {"category" => "service"}
description (empty) Analytics platform Callaghan's team uses as the destination for validated domain events. Referenced alongside PostHog...
short_description (empty) Customer-data and analytics event routing platform.
create PostHog tool
kind (empty) tool
name (empty) PostHog
slug (empty) posthog
attrs (empty) {"category" => "service"}
description (empty) Product analytics tool Callaghan lists alongside Segment and Google Analytics as examples of the analytics/observabil...
short_description (empty) Open-source product analytics platform.
create Google Analytics tool
kind (empty) tool
name (empty) Google Analytics
slug (empty) google-analytics
attrs (empty) {"category" => "service"}
description (empty) Referenced by Callaghan as one of the analytics tools whose data concerns overlap significantly with observability.
short_description (empty) Google's web analytics service.
create Audit and reduce existing log volume before adding more takeaway
kind (empty) takeaway
name (empty) Audit and reduce existing log volume before adding more
slug (empty) audit-and-reduce-existing-log-volume-before-adding-more
attrs (empty) {"type" => "recommendation"}
description (empty) Callaghan's cost-control advice: audit what's being logged. At BiggerPockets a three-day audit reduced the logging bi...
short_description (empty) Cut logging cost by auditing volume; structured logging reveals duplicates.
create OpenTelemetry lowers vendor lock-in but switching costs remain takeaway
kind (empty) takeaway
name (empty) OpenTelemetry lowers vendor lock-in but switching costs remain
slug (empty) opentelemetry-lowers-vendor-lock-in-but-switching-costs-remain
attrs (empty) {"type" => "insight"}
description (empty) Using OpenTelemetry semantic conventions makes it meaningfully cheaper to move between observability vendors as price...
short_description (empty) OTel makes swapping vendors easier, but alerts/dashboards/UI still lock you in.
create Connect engineers to observability costs takeaway
kind (empty) takeaway
name (empty) Connect engineers to observability costs
slug (empty) connect-engineers-to-observability-costs
attrs (empty) {"type" => "insight"}
description (empty) Callaghan's observation that one of the craziest things the industry does is hide observability costs from the engine...
short_description (empty) Engineers don't see observability bills; close that feedback loop.
create Start from a live problem, not a three-month observability project takeaway
kind (empty) takeaway
name (empty) Start from a live problem, not a three-month observability project
slug (empty) start-from-a-live-problem-not-a-three-month-observability-project
attrs (empty) {"type" => "recommendation"}
description (empty) Callaghan has seen multiple companies spend months adding 'complete' observability that nobody uses. Better approach:...
short_description (empty) Add only the observability needed to answer a real question today.
create Prefer exploration over alerts; noisy alerts are worse than none takeaway
kind (empty) takeaway
name (empty) Prefer exploration over alerts; noisy alerts are worse than none
slug (empty) prefer-exploration-over-alerts-noisy-alerts-are-worse-than-none
attrs (empty) {"type" => "recommendation"}
description (empty) Callaghan is reticent to add alerts. Noisy alerts train teams to ignore them — the boy-who-cried-wolf effect — and be...
short_description (empty) Build exploratory tools; reserve alerts for truly critical thresholds.
create Redact PII in one central place before sending to vendors takeaway
kind (empty) takeaway
name (empty) Redact PII in one central place before sending to vendors
slug (empty) redact-pii-in-one-central-place-before-sending-to-vendors
attrs (empty) {"type" => "recommendation"}
description (empty) Pipe all payloads destined for the observability vendor through Rails' parameter filter (configured with regex/string...
short_description (empty) Use Rails parameter filter centrally; don't rely on vendor-side redaction.
create Observability becomes addictive takeaway
kind (empty) takeaway
name (empty) Observability becomes addictive
slug (empty) observability-becomes-addictive
attrs (empty) {"type" => "insight"}
description (empty) Callaghan's lived experience: once graphs and structured logs are in place, answering one question surfaces other une...
short_description (empty) Once teams have graphs, curiosity drives continuous bug discovery.
create Cost control for structured logging question
kind (empty) question
name (empty) Cost control for structured logging
slug (empty) cost-control-for-structured-logging
attrs (empty) {"answer_summary" => "OTel eases vendor switching but dashboards/alerts are sticky. Audit and slash noisy logs (cut 4...
description (empty) Audience member asks a compound question about observability bills and approaches for logging business-logic operatio...
short_description (empty) How to manage observability costs; rules of thumb for business-logic logging.
create PII privacy when logging domain objects question
kind (empty) question
name (empty) PII privacy when logging domain objects
slug (empty) pii-privacy-when-logging-domain-objects
attrs (empty) {"answer_summary" => "Use Rails parameter filter with a list of regex/strings; redact centrally in the observability ...
description (empty) Audience follow-up on privacy implications of logging domain objects to third-party observability vendors. Callaghan ...
short_description (empty) How to handle PII when logging domain objects to a vendor.
create Schemas for structured log attributes question
kind (empty) question
name (empty) Schemas for structured log attributes
slug (empty) schemas-for-structured-log-attributes
attrs (empty) {"answer_summary" => "No universal schema for domain objects (they're per-app). OTel may tackle it in ~10 years; Sche...
description (empty) Audience asks whether there's a way to let developers send arbitrary attributes while still being able to aggregate/g...
short_description (empty) How to reconcile structured logging with per-app attribute variability.
create Alerts on logs vs metrics at scale question
kind (empty) question
name (empty) Alerts on logs vs metrics at scale
slug (empty) alerts-on-logs-vs-metrics-at-scale
attrs (empty) {"answer_summary" => "He hasn't hit a log-volume ceiling for alerting at 3M-member scale; runs rolling aggregations w...
description (empty) Audience asks at what volume logs become too slow to power 1-minute or 5-minute alerts, forcing a switch to metrics. ...
short_description (empty) Can log queries support alerting or must you switch to metrics?
create Why logs if traces are the best question
kind (empty) question
name (empty) Why logs if traces are the best
slug (empty) why-logs-if-traces-are-the-best
attrs (empty) {"answer_summary" => "Traces are more powerful (hierarchical context) but harder to sell, more expensive, slower, and...
description (empty) Audience asks why the talk is about logs when Callaghan declared traces the most powerful data type. Answer: pragmati...
short_description (empty) Why focus on logs when Callaghan says traces are more powerful.
create Instrumentation as events, independent of output question
kind (empty) question
name (empty) Instrumentation as events, independent of output
slug (empty) instrumentation-as-events-independent-of-output
attrs (empty) {"answer_summary" => "Yes — 'events all the way down' (Charity Majors). Callaghan is building a value-object Event + ...
description (empty) Audience member observes that payloads still carry an interpolated content string and asks whether the architecture s...
short_description (empty) Should the codebase emit events independent of log/trace/metric destination?
create Charity Majors person
kind (empty) person
name (empty) Charity Majors
slug (empty) charity-majors
description (empty) Observability thought leader whose 'events all the way down' framing Callaghan cites approvingly. The idea: at the ro...
short_description (empty) Observability thought leader; advocate of 'events all the way down'.
create Rails 8.1 tool
kind (empty) tool
name (empty) Rails 8.1
slug (empty) rails-8-1
attrs (empty) {"category" => "framework"}
description (empty) Callaghan notes that big improvements for structured logging are coming in Rails 8.1 but aren't here yet, and many Ra...
short_description (empty) Upcoming Rails release with major structured-logging improvements.

Edges (66)

create John Callaghanworks_atBiggerPockets
attrs (empty) {"role" => "engineer"}
context (empty) Rails engineer at BiggerPockets at the time of the talk; all production stories are from there.
relation (empty) works_at
source_node_id (empty) a5e45cca-373c-4288-be9e-ff31cf9ebaef
target_node_id (empty) 530a80e5-973b-45c9-b3d7-d5354589b2eb
create John Callaghanworks_atDynatrace
attrs (empty) {"role" => "Ruby agent developer", "status" => "upcoming"}
context (empty) Joining Dynatrace after BiggerPockets to develop a Ruby agent/client.
relation (empty) works_at
source_node_id (empty) a5e45cca-373c-4288-be9e-ff31cf9ebaef
target_node_id (empty) fb73499d-3263-4e86-b8ef-d17d6e0d63db
create John CallaghanauthoredFix Production Bugs 20 Times Faster
context (empty) Callaghan is the sole speaker for this talk.
relation (empty) authored
source_node_id (empty) a5e45cca-373c-4288-be9e-ff31cf9ebaef
target_node_id (empty) acb6d71d-2874-435c-88f9-e8ca1e844a7e
create Fix Production Bugs 20 Times Fasterpresented_atwroclove.rb 2025
context (empty) Talk delivered at wroclove.rb 2025 as the first speaker.
relation (empty) presented_at
source_node_id (empty) acb6d71d-2874-435c-88f9-e8ca1e844a7e
target_node_id (empty) 4a9688cf-482e-48ac-a0b5-de88900bdb2b
create John Callaghanattendedwroclove.rb 2025
context (empty) Delivered the talk and took questions; noted he was leaving at 4pm to catch a flight.
relation (empty) attended
source_node_id (empty) a5e45cca-373c-4288-be9e-ff31cf9ebaef
target_node_id (empty) 4a9688cf-482e-48ac-a0b5-de88900bdb2b
create Fix Production Bugs 20 Times FasteraboutStructured Logging
context (empty) Talk is subtitled 'The Power of Structured Logging' and makes the case for structured over plain logs.
relation (empty) about
source_node_id (empty) acb6d71d-2874-435c-88f9-e8ca1e844a7e
target_node_id (empty) 52228e06-6668-4f32-892c-60f2f6c0a315
create Fix Production Bugs 20 Times FasteraboutSteps to Observable Software
context (empty) Introduces and walks through the SOS five-step cycle.
relation (empty) about
source_node_id (empty) acb6d71d-2874-435c-88f9-e8ca1e844a7e
target_node_id (empty) 07d700e2-345a-451a-a002-7ed17100289b
create Fix Production Bugs 20 Times FasteraboutSemantic Logger
context (empty) Recommends and demonstrates semantic_logger as the structured-logging library of choice.
relation (empty) about
source_node_id (empty) acb6d71d-2874-435c-88f9-e8ca1e844a7e
target_node_id (empty) 4c4f33c3-165e-4bf6-8dbc-f230ad943bd0
create Fix Production Bugs 20 Times FasteraboutOpenTelemetry Semantic Conventions
context (empty) Adopts OTel semantic conventions for attribute names over structured logs.
relation (empty) about
source_node_id (empty) acb6d71d-2874-435c-88f9-e8ca1e844a7e
target_node_id (empty) 96d66575-17d7-4130-9b9a-c26dd5045e44
create Fix Production Bugs 20 Times FasteraboutOpenTelemetry
context (empty) Discusses OTel as a standards body and the maturity status of its Ruby library.
relation (empty) about
source_node_id (empty) acb6d71d-2874-435c-88f9-e8ca1e844a7e
target_node_id (empty) 39ce1c2f-63e7-4a8d-859f-40e7f1bd6d4b
create Fix Production Bugs 20 Times FasteraboutSidekiq
context (empty) Password-reset background jobs run on Sidekiq; the dashboard was insufficient for diagnosing queue delays.
relation (empty) about
source_node_id (empty) acb6d71d-2874-435c-88f9-e8ca1e844a7e
target_node_id (empty) 2365c22d-c83e-4553-b865-ec22d0b5b225
create Fix Production Bugs 20 Times FasteraboutFaraday
context (empty) Outbound API logging middleware is demonstrated on Faraday.
relation (empty) about
source_node_id (empty) acb6d71d-2874-435c-88f9-e8ca1e844a7e
target_node_id (empty) 860f9ba1-53d5-44dd-9504-876203cf04d1
create Fix Production Bugs 20 Times FasteraboutDynatrace
context (empty) Demonstrates shipping structured logs to Dynatrace via an HTTP appender.
relation (empty) about
source_node_id (empty) acb6d71d-2874-435c-88f9-e8ca1e844a7e
target_node_id (empty) fb73499d-3263-4e86-b8ef-d17d6e0d63db
create Fix Production Bugs 20 Times FasteraboutRuby on Rails
context (empty) Entire talk is scoped to a Rails production application.
relation (empty) about
source_node_id (empty) acb6d71d-2874-435c-88f9-e8ca1e844a7e
target_node_id (empty) 7aac705a-0987-49f2-b665-9d4e08a6acee
create Fix Production Bugs 20 Times FasteraboutLogs vs Traces vs Metrics
context (empty) Argues against the 'three pillars' framing and ranks the three data types.
relation (empty) about
source_node_id (empty) acb6d71d-2874-435c-88f9-e8ca1e844a7e
target_node_id (empty) 62710c32-81ff-4b21-8e60-028d5ded479b
create John CallaghanrecommendsSemantic Logger
context (empty) Evaluates logging libraries against criteria and recommends semantic_logger.
relation (empty) recommends
source_node_id (empty) a5e45cca-373c-4288-be9e-ff31cf9ebaef
target_node_id (empty) 4c4f33c3-165e-4bf6-8dbc-f230ad943bd0
create John CallaghanrecommendsOpenTelemetry Semantic Conventions
context (empty) Recommends adopting OTel semantic conventions even without the SDK.
relation (empty) recommends
source_node_id (empty) a5e45cca-373c-4288-be9e-ff31cf9ebaef
target_node_id (empty) 96d66575-17d7-4130-9b9a-c26dd5045e44
create John CallaghanrecommendsStructured Logging
context (empty) Core advocacy of the talk: structured over plain logs.
relation (empty) recommends
source_node_id (empty) a5e45cca-373c-4288-be9e-ff31cf9ebaef
target_node_id (empty) 52228e06-6668-4f32-892c-60f2f6c0a315
create John CallaghanrecommendsFaraday
context (empty) Jokingly endorses Faraday as the best Ruby HTTP client while demonstrating logging middleware.
relation (empty) recommends
source_node_id (empty) a5e45cca-373c-4288-be9e-ff31cf9ebaef
target_node_id (empty) 860f9ba1-53d5-44dd-9504-876203cf04d1
create BiggerPocketsusesSemantic Logger
attrs (empty) {"since" => "~2022"}
context (empty) Used in production at BiggerPockets for three years; called solid as a rock.
relation (empty) uses
source_node_id (empty) 530a80e5-973b-45c9-b3d7-d5354589b2eb
target_node_id (empty) 4c4f33c3-165e-4bf6-8dbc-f230ad943bd0
create BiggerPocketsusesSidekiq
context (empty) Background-job processing (password reset emails, analytics jobs) runs on Sidekiq.
relation (empty) uses
source_node_id (empty) 530a80e5-973b-45c9-b3d7-d5354589b2eb
target_node_id (empty) 2365c22d-c83e-4553-b865-ec22d0b5b225
create BiggerPocketsusesSentry
context (empty) Team checked Sentry to rule out failing jobs; also used to surface JSON-schema validation failures in the analytics p...
relation (empty) uses
source_node_id (empty) 530a80e5-973b-45c9-b3d7-d5354589b2eb
target_node_id (empty) 9b81df6c-7817-4cd8-91a1-bfeefb7fbce8
create BiggerPocketsusesSegment
context (empty) Destination for validated analytics events; JSON Schema blocks invalid events from reaching Segment.
relation (empty) uses
source_node_id (empty) 530a80e5-973b-45c9-b3d7-d5354589b2eb
target_node_id (empty) ad619a73-bd9e-4644-8c22-8934832df964
create BiggerPocketsusesRuby on Rails
context (empty) Application stack is Ruby on Rails.
relation (empty) uses
source_node_id (empty) 530a80e5-973b-45c9-b3d7-d5354589b2eb
target_node_id (empty) 7aac705a-0987-49f2-b665-9d4e08a6acee
create Semantic Loggerrelated_toRuby on Rails
context (empty) rails_semantic_logger provides Rails bindings and autologging for ActiveJob and other libraries.
relation (empty) related_to
source_node_id (empty) 4c4f33c3-165e-4bf6-8dbc-f230ad943bd0
target_node_id (empty) 7aac705a-0987-49f2-b665-9d4e08a6acee
create Semantic Loggerrelated_toOpenTelemetry Semantic Conventions
context (empty) Talk shows patching semantic_logger's subscriber and event formatter to emit OpenTelemetry attribute names.
relation (empty) related_to
source_node_id (empty) 4c4f33c3-165e-4bf6-8dbc-f230ad943bd0
target_node_id (empty) 96d66575-17d7-4130-9b9a-c26dd5045e44
create OpenTelemetry Semantic Conventionsrelated_toOpenTelemetry
context (empty) Semantic conventions are a deliverable of the OpenTelemetry standards project.
relation (empty) related_to
source_node_id (empty) 96d66575-17d7-4130-9b9a-c26dd5045e44
target_node_id (empty) 39ce1c2f-63e7-4a8d-859f-40e7f1bd6d4b
create config.log_tagsrelated_toSemantic Logger
context (empty) Tags set via config.log_tags are forwarded through Rails logging to semantic_logger and then to the observability tool.
relation (empty) related_to
source_node_id (empty) c0b4f716-c054-4554-8323-9bf08cb153fc
target_node_id (empty) 4c4f33c3-165e-4bf6-8dbc-f230ad943bd0
create Faraday outbound logging middlewareusesFaraday
context (empty) Pattern is implemented as Faraday middleware.
relation (empty) uses
source_node_id (empty) 2587a04c-5912-4be2-8692-d2d7580f411e
target_node_id (empty) 860f9ba1-53d5-44dd-9504-876203cf04d1
create Faraday outbound logging middlewareusesSemantic Logger
context (empty) The middleware emits structured log events via semantic_logger.
relation (empty) uses
source_node_id (empty) 2587a04c-5912-4be2-8692-d2d7580f411e
target_node_id (empty) 4c4f33c3-165e-4bf6-8dbc-f230ad943bd0
create Filter Parameterrelated_toRuby on Rails
context (empty) Parameter filter is a built-in Rails facility.
relation (empty) related_to
source_node_id (empty) 6aaeaf81-e0b0-4f32-a467-8f3968333b80
target_node_id (empty) 7aac705a-0987-49f2-b665-9d4e08a6acee
create Domain Object Structured Loggingrelated_toStructured Logging
context (empty) Extension of structured logging to business domain objects via to_formatted_h.
relation (empty) related_to
source_node_id (empty) 43a7e884-8b25-4ea4-b6fd-0eeda19e4a0f
target_node_id (empty) 52228e06-6668-4f32-892c-60f2f6c0a315
create Domain Object Structured Loggingrelated_toSchema.org
context (empty) Callaghan explored Schema.org as a shared vocabulary for domain-object attributes but found it too generic.
relation (empty) related_to
source_node_id (empty) 43a7e884-8b25-4ea4-b6fd-0eeda19e4a0f
target_node_id (empty) 7587bcbe-ea2c-4586-aa44-0d465bc4836d
create Domain Object Structured Loggingrelated_toJSON Schema for analytics events
context (empty) Current working solution for validating attributes of domain events in the Segment pipeline.
relation (empty) related_to
source_node_id (empty) 43a7e884-8b25-4ea4-b6fd-0eeda19e4a0f
target_node_id (empty) 2a1bee31-1a6b-4194-ae83-80738398d317
create JSON Schema for analytics eventsrelated_toSegment
context (empty) Events that fail JSON Schema validation are blocked from reaching Segment and surface as Sentry errors.
relation (empty) related_to
source_node_id (empty) 2a1bee31-1a6b-4194-ae83-80738398d317
target_node_id (empty) ad619a73-bd9e-4644-8c22-8934832df964
create JSON Schema for analytics eventsrelated_toSentry
context (empty) Validation failures are reported to Sentry for follow-up.
relation (empty) related_to
source_node_id (empty) 2a1bee31-1a6b-4194-ae83-80738398d317
target_node_id (empty) 9b81df6c-7817-4cd8-91a1-bfeefb7fbce8
create Events-all-the-way-down Instrumentationrelated_toCharity Majors
context (empty) Callaghan credits Charity Majors' 'events all the way down' framing.
relation (empty) related_to
source_node_id (empty) dc5498a3-66aa-4b22-9a3e-7a42d1102ffc
target_node_id (empty) 95a0ea82-005d-45b5-96d5-9d3e5c0bd47f
create Events-all-the-way-down Instrumentationrelated_toDatadog
context (empty) One of the listener destinations in the envisioned architecture.
relation (empty) related_to
source_node_id (empty) dc5498a3-66aa-4b22-9a3e-7a42d1102ffc
target_node_id (empty) 1ac68a55-87d0-4b79-93cf-cbdb1e49d853
create Events-all-the-way-down Instrumentationrelated_toDynatrace
context (empty) One of the listener destinations in the envisioned architecture.
relation (empty) related_to
source_node_id (empty) dc5498a3-66aa-4b22-9a3e-7a42d1102ffc
target_node_id (empty) fb73499d-3263-4e86-b8ef-d17d6e0d63db
create Events-all-the-way-down Instrumentationrelated_toSegment
context (empty) Analytics-side listener destination for the same events.
relation (empty) related_to
source_node_id (empty) dc5498a3-66aa-4b22-9a3e-7a42d1102ffc
target_node_id (empty) ad619a73-bd9e-4644-8c22-8934832df964
create Events-all-the-way-down Instrumentationrelated_toPostHog
context (empty) Analytics-side listener destination for the same events.
relation (empty) related_to
source_node_id (empty) dc5498a3-66aa-4b22-9a3e-7a42d1102ffc
target_node_id (empty) 43f92bae-bd33-4794-8420-d0b5804acdb3
create Audit and reduce existing log volume before adding morefrom_talkFix Production Bugs 20 Times Faster
context (empty) Callaghan's cost-control story during Q&A about a 41% logging-bill reduction at BiggerPockets.
relation (empty) from_talk
source_node_id (empty) c11632fe-f8b5-4285-84d1-fdb5080db389
target_node_id (empty) acb6d71d-2874-435c-88f9-e8ca1e844a7e
create Audit and reduce existing log volume before adding moreaboutSemantic Logger
context (empty) Recommends using semantic_logger's proc-based filter to drop noisy log patterns.
relation (empty) about
source_node_id (empty) c11632fe-f8b5-4285-84d1-fdb5080db389
target_node_id (empty) 4c4f33c3-165e-4bf6-8dbc-f230ad943bd0
create OpenTelemetry lowers vendor lock-in but switching costs remainfrom_talkFix Production Bugs 20 Times Faster
context (empty) Q&A insight about cost and vendor lock-in.
relation (empty) from_talk
source_node_id (empty) b52e204b-1204-4e22-84e8-96287bfa7467
target_node_id (empty) acb6d71d-2874-435c-88f9-e8ca1e844a7e
create OpenTelemetry lowers vendor lock-in but switching costs remainaboutOpenTelemetry
context (empty) About OTel's role in reducing — but not eliminating — switching costs.
relation (empty) about
source_node_id (empty) b52e204b-1204-4e22-84e8-96287bfa7467
target_node_id (empty) 39ce1c2f-63e7-4a8d-859f-40e7f1bd6d4b
create Connect engineers to observability costsfrom_talkFix Production Bugs 20 Times Faster
context (empty) Q&A observation about engineer cost visibility.
relation (empty) from_talk
source_node_id (empty) 1be30880-e11f-4368-8fe8-80bfb97a753e
target_node_id (empty) acb6d71d-2874-435c-88f9-e8ca1e844a7e
create Start from a live problem, not a three-month observability projectfrom_talkFix Production Bugs 20 Times Faster
context (empty) Core principle of the SOS cycle articulated during Q&A.
relation (empty) from_talk
source_node_id (empty) 482059d1-9351-4d05-a883-403b4acb2c5e
target_node_id (empty) acb6d71d-2874-435c-88f9-e8ca1e844a7e
create Start from a live problem, not a three-month observability projectaboutSteps to Observable Software
context (empty) Recommendation underpins the SOS cycle's focus on a live question.
relation (empty) about
source_node_id (empty) 482059d1-9351-4d05-a883-403b4acb2c5e
target_node_id (empty) 07d700e2-345a-451a-a002-7ed17100289b
create Prefer exploration over alerts; noisy alerts are worse than nonefrom_talkFix Production Bugs 20 Times Faster
context (empty) Q&A answer to the alerts-on-logs-vs-metrics question.
relation (empty) from_talk
source_node_id (empty) 1a3bb9bb-cb0b-442a-8dc5-096df1fe4846
target_node_id (empty) acb6d71d-2874-435c-88f9-e8ca1e844a7e
create Redact PII in one central place before sending to vendorsfrom_talkFix Production Bugs 20 Times Faster
context (empty) Q&A answer to the PII privacy question.
relation (empty) from_talk
source_node_id (empty) 636413bb-e61e-4d97-9bfa-195e93203c80
target_node_id (empty) acb6d71d-2874-435c-88f9-e8ca1e844a7e
create Redact PII in one central place before sending to vendorsaboutFilter Parameter
context (empty) Concrete technique is Rails' built-in parameter filter applied centrally in the observability pipeline.
relation (empty) about
source_node_id (empty) 636413bb-e61e-4d97-9bfa-195e93203c80
target_node_id (empty) 6aaeaf81-e0b0-4f32-a467-8f3968333b80
create Observability becomes addictivefrom_talkFix Production Bugs 20 Times Faster
context (empty) Callaghan's closing reflection on how observability work feeds curiosity (e.g. the 404/username-scraper discovery).
relation (empty) from_talk
source_node_id (empty) cbd71dce-0a9f-464e-9918-04ce16a1d27b
target_node_id (empty) acb6d71d-2874-435c-88f9-e8ca1e844a7e
create Cost control for structured loggingasked_atFix Production Bugs 20 Times Faster
context (empty) First Q&A question covering both bills and business-logic logging.
relation (empty) asked_at
source_node_id (empty) fa5a074a-5c12-459a-af47-0a21a677d906
target_node_id (empty) acb6d71d-2874-435c-88f9-e8ca1e844a7e
create PII privacy when logging domain objectsasked_atFix Production Bugs 20 Times Faster
context (empty) Follow-up on logging domain objects responsibly.
relation (empty) asked_at
source_node_id (empty) 4918a050-a5fa-4017-ba75-f5f54711c451
target_node_id (empty) acb6d71d-2874-435c-88f9-e8ca1e844a7e
create Schemas for structured log attributesasked_atFix Production Bugs 20 Times Faster
context (empty) Audience question on schema vs schemaless tradeoffs.
relation (empty) asked_at
source_node_id (empty) 2a0ce571-ce2b-4aba-a572-42884127c4ed
target_node_id (empty) acb6d71d-2874-435c-88f9-e8ca1e844a7e
create Alerts on logs vs metrics at scaleasked_atFix Production Bugs 20 Times Faster
context (empty) Audience asked at what log volume metrics become necessary for alerts.
relation (empty) asked_at
source_node_id (empty) 04d3f4a0-3c5b-47c0-8de8-6a32dbef4a82
target_node_id (empty) acb6d71d-2874-435c-88f9-e8ca1e844a7e
create Why logs if traces are the bestasked_atFix Production Bugs 20 Times Faster
context (empty) Audience challenged Callaghan's framing that traces are superior yet the talk focused on logs.
relation (empty) asked_at
source_node_id (empty) feba26eb-682d-4f99-b93a-0fae4ec241a4
target_node_id (empty) acb6d71d-2874-435c-88f9-e8ca1e844a7e
create Instrumentation as events, independent of outputasked_atFix Production Bugs 20 Times Faster
context (empty) Final Q&A question framing instrumentation as events with pluggable sinks.
relation (empty) asked_at
source_node_id (empty) 130ba2f9-c525-4933-a5a9-c94061837b91
target_node_id (empty) acb6d71d-2874-435c-88f9-e8ca1e844a7e
create Cost control for structured loggingaboutDomain Object Structured Logging
context (empty) Second half of the question addresses how to log business/domain logic.
relation (empty) about
source_node_id (empty) fa5a074a-5c12-459a-af47-0a21a677d906
target_node_id (empty) 43a7e884-8b25-4ea4-b6fd-0eeda19e4a0f
create Schemas for structured log attributesaboutJSON Schema for analytics events
context (empty) Callaghan's working solution to the schema problem.
relation (empty) about
source_node_id (empty) 2a0ce571-ce2b-4aba-a572-42884127c4ed
target_node_id (empty) 2a1bee31-1a6b-4194-ae83-80738398d317
create Schemas for structured log attributesaboutSchema.org
context (empty) Evaluated as one potential solution, judged too generic.
relation (empty) about
source_node_id (empty) 2a0ce571-ce2b-4aba-a572-42884127c4ed
target_node_id (empty) 7587bcbe-ea2c-4586-aa44-0d465bc4836d
create Why logs if traces are the bestaboutLogs vs Traces vs Metrics
context (empty) Question about tradeoffs between data types.
relation (empty) about
source_node_id (empty) feba26eb-682d-4f99-b93a-0fae4ec241a4
target_node_id (empty) 62710c32-81ff-4b21-8e60-028d5ded479b
create Instrumentation as events, independent of outputaboutEvents-all-the-way-down Instrumentation
context (empty) Question directly describes the events-all-the-way-down architecture.
relation (empty) about
source_node_id (empty) 130ba2f9-c525-4933-a5a9-c94061837b91
target_node_id (empty) dc5498a3-66aa-4b22-9a3e-7a42d1102ffc
create Instrumentation as events, independent of outputaboutCharity Majors
context (empty) Callaghan cites Charity Majors in his answer.
relation (empty) about
source_node_id (empty) 130ba2f9-c525-4933-a5a9-c94061837b91
target_node_id (empty) 95a0ea82-005d-45b5-96d5-9d3e5c0bd47f
create Fix Production Bugs 20 Times FasteraboutRails 8.1
context (empty) Mentions upcoming structured-logging improvements in Rails 8.1.
relation (empty) about
source_node_id (empty) acb6d71d-2874-435c-88f9-e8ca1e844a7e
target_node_id (empty) ad79f65b-a79e-409b-9c0c-a3e509fa1f8c
create Fix Production Bugs 20 Times FasteraboutSentry
context (empty) Team used Sentry to confirm that jobs weren't failing.
relation (empty) about
source_node_id (empty) acb6d71d-2874-435c-88f9-e8ca1e844a7e
target_node_id (empty) 9b81df6c-7817-4cd8-91a1-bfeefb7fbce8

Read set

122 nodes

takeaway ActiveSupport Notifications as cheap built-in instrumentation search_nodes talk Toolbelt of a Seasoned Bug Hunter search_nodes talk Ruby Rendezvous Method Call, Proc, and Beyond search_nodes talk When REST is Not Enough: Implementing Alternative Protocols in Ruby on Rails search_nodes tool Speedscope search_nodes tool ViewComponent search_nodes tool Representable search_nodes talk Better ActiveRecord IRB Output Gem Lightning Talk search_nodes event Rails World search_nodes resource Short Ruby Newsletter search_nodes project logux-rails search_nodes concept Structured LLM Output search_nodes tool paper_trail search_nodes takeaway Use Logux for optimistic UI with Rails search_nodes tool rails_event_store search_nodes question Real large apps using this pattern search_nodes tool Ruby Event Store search_nodes takeaway Use Unlogged Tables to Speed Up Rails Test Suites search_nodes tool rbspy search_nodes tool log4j search_nodes concept ObjectSpace heap dumps search_nodes concept TracePoint API search_nodes tool Ruby LLM search_nodes tool OpenTelemetry search_nodes tool Honeycomb search_nodes tool Prometheus search_nodes takeaway Reuse existing observability infrastructure search_nodes resource Rocket Real-Time Benchmark search_nodes takeaway Trailblazer tracing saves thousands of debugging hours search_nodes tool Datadog search_nodes tool Codecov search_nodes tool Apollo GraphQL Platform search_nodes tool New Relic search_nodes takeaway Narrow the Blocker by Comparing Environments search_nodes tool webpagetest.org search_nodes tool PagerDuty search_nodes tool pganalyze search_nodes tool Grafana search_nodes concept AI Agent search_nodes concept Retrieval Augmented Generation search_nodes takeaway Name Things To Find Their Properties search_nodes project Nerds and Threads search_nodes tool langchainrb search_nodes tool ChatGPT search_nodes project Check search_nodes concept GraphQL max_depth search_nodes tool RealtimeBoard search_nodes concept Vector Database search_nodes tool HTTP gem search_nodes tool Net::HTTP search_nodes tool OHA search_nodes takeaway Enable WebMock on legacy apps search_nodes tool WebMock search_nodes question Tracking HTTP client library changes search_nodes tool Requestly search_nodes tool FakeWeb search_nodes tool curl search_nodes tool async search_nodes tool Sidekiq search_nodes takeaway Prefer Small Sidekiq Jobs search_nodes concept Sidekiq Batches search_nodes takeaway Delay mutations to background jobs search_nodes takeaway Pass IDs to background jobs, not objects search_nodes takeaway Keep Sidekiq Job Parameters Simple search_nodes question Scaling Sidekiq Elastically search_nodes concept Background Job Serialization Overhead search_nodes question Application-Level Back Pressure For Sidekiq search_nodes project Solid Queue search_nodes event wroclove.rb 2025 search_nodes event wroclove.rb 2024 search_nodes event wroclove.rb 2022 search_nodes event wroclove.rb 2023 search_nodes event wroclove.rb 2026 search_nodes event wroclove.rb 2019 search_nodes event wroclove.rb 2018 search_nodes talk Gregorian Calendar search_nodes talk Performance Panel wroclove.rb 2024 search_nodes talk Rewrite with confidence search_nodes talk Events events events search_nodes question How do you search across millions of events for top items? search_nodes takeaway Don't Cram Eventide Into Legacy Apps search_nodes tool Sentry search_nodes takeaway Enhanced Charisma With Regulators search_nodes tool Speaker Deck search_nodes concept Login Session Tracking search_nodes tool AppSignal search_nodes concept Expected vs Unexpected Errors search_nodes takeaway Don't kill your team — alert only on unexpected errors search_nodes takeaway Replay events to reproduce bugs search_nodes tool GraphQL search_nodes tool Apollo GraphQL search_nodes concept JSON API search_nodes tool SXG Validator search_nodes takeaway Record CloudFront request headers on sessions search_nodes tool Klaviyo search_nodes tool ruby-openai search_nodes talk Scientific Ruby Lightning Talk search_nodes talk Ruby Standard Library Hidden Gems Lightning Talk search_nodes concept Pub/Sub Messaging search_nodes tool Apache Kafka search_nodes concept At-Least-Once Plus Idempotence Recipe search_nodes tool MessageDB search_nodes question Deduplicating Jobs For The Same Record search_nodes tool Redis search_nodes takeaway Use at-least-once plus idempotence to build self-healing systems search_nodes takeaway Don't kill dependencies — use backoff search_nodes tool Ruby on Rails search_nodes concept Cynefin Framework search_nodes tool Hanami search_nodes project monolith framework search_nodes resource Woman on Rails search_nodes tool Ember.js search_nodes tool Rack search_nodes tool merb search_nodes takeaway Ruby as a Data Management Language search_nodes project BBC Sport App search_nodes concept GitHub Self-Hosted Runner search_nodes concept xkcd Dependency / Nebraska Problem search_nodes concept ActiveSupport Core Extensions search_nodes project Ruby News search_nodes tool Release Drafter search_nodes talk Offline Sandwich Focus Workflow search_nodes