← 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 Callaghan → works_at → BiggerPockets
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 Callaghan → works_at → Dynatrace
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 Callaghan → authored → Fix 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 Faster → presented_at → wroclove.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 Callaghan → attended → wroclove.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 Faster → about → Structured 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 Faster → about → Steps 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 Faster → about → Semantic 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 Faster → about → OpenTelemetry 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 Faster → about → OpenTelemetry
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 Faster → about → Sidekiq
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 Faster → about → Faraday
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 Faster → about → Dynatrace
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 Faster → about → Ruby 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 Faster → about → Logs 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 Callaghan → recommends → Semantic 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 Callaghan → recommends → OpenTelemetry 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 Callaghan → recommends → Structured 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 Callaghan → recommends → Faraday
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 BiggerPockets → uses → Semantic 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 BiggerPockets → uses → Sidekiq
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 BiggerPockets → uses → Sentry
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 BiggerPockets → uses → Segment
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 BiggerPockets → uses → Ruby 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 Logger → related_to → Ruby 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 Logger → related_to → OpenTelemetry 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 Conventions → related_to → OpenTelemetry
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_tags → related_to → Semantic 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 middleware → uses → Faraday
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 middleware → uses → Semantic 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 Parameter → related_to → Ruby 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 Logging → related_to → Structured 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 Logging → related_to → Schema.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 Logging → related_to → JSON 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 events → related_to → Segment
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 events → related_to → Sentry
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 Instrumentation → related_to → Charity 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 Instrumentation → related_to → Datadog
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 Instrumentation → related_to → Dynatrace
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 Instrumentation → related_to → Segment
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 Instrumentation → related_to → PostHog
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 more → from_talk → Fix 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 more → about → Semantic 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 remain → from_talk → Fix 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 remain → about → OpenTelemetry
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 costs → from_talk → Fix 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 project → from_talk → Fix 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 project → about → Steps 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 none → from_talk → Fix 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 vendors → from_talk → Fix 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 vendors → about → Filter 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 addictive → from_talk → Fix 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 logging → asked_at → Fix 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 objects → asked_at → Fix 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 attributes → asked_at → Fix 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 scale → asked_at → Fix 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 best → asked_at → Fix 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 output → asked_at → Fix 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 logging → about → Domain 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 attributes → about → JSON 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 attributes → about → Schema.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 best → about → Logs 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 output → about → Events-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 output → about → Charity 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 Faster → about → Rails 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 Faster → about → Sentry
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