요약: 핵심 변경 사항만 빠르게 확인하고 싶다면 CHANGELOG를 참고하세요.
최근 Ruby 애플리케이션의 예외를 보고하는 저희 젬(gem)의 최신 메이저 업데이트를 출시했습니다. v2 릴리스가 새로운 설정 전략을 도입한 완전한 재작성이었다면, v3는 기존 코드를 깨는 변경 사항은 적으면서 기능과 사용성 면에서 큰 개선이 이루어진 버전입니다. 다룰 내용이 많으니 바로 시작하겠습니다.
순수 Ruby(Plain ol' Ruby) 모드
Rails 생태계에서는 젬을 설치하면 애플리케이션에 자동으로 통합되는 것이 당연하게 여겨집니다. 예를 들어 많은 젬이 Rails 초기화 시점에 자체 코드를 실행하기 위해 Railtie를 제공합니다.
honeybadger 젬 역시 이러한 방식을 완전히 수용하여, Rails, Sinatra, Sidekiq 등 인기 있는 프레임워크와 젬에 대한 포괄적인 오류 보고를 손쉽게 설정할 수 있도록 지원합니다. 실제로 require 'honeybadger' 한 줄이면 끝납니다.
하지만 일부 루비스트들은 통합 코드를 직접 작성하는 것을 선호합니다. (Rails에서 흔히 볼 수 있는) 몽키 패칭에 거부감을 느끼며, 단순히 require 하는 것만으로 젬이 눈에 잘 띄지 않는 방식으로 애플리케이션을 변경하는 것을 가장 경계합니다. 저도 그 마음을 충분히 이해합니다. 사실 저 역시 비슷한 성향을 가지고 있거든요.
또 어떤 개발자는 저희가 통합하는 라이브러리를 아예 사용하지 않고, 런타임 시 불필요한 초기화를 피하기 위해 Honeybadger.notify로 직접 오류를 보고하고 싶어할 수도 있습니다.
바로 이런 이유에서 "순수 Ruby" 모드(비공식 명칭)를 추가했습니다. 설정 파일을 직접 작성하고 미들웨어를 처음부터 구성하는 것을 즐기는 개발자, 혹은 순수 Ruby만 사용하는 분들이라면 이제 기존의 require 'honeybadger' 대신 require 'honeybadger/ruby'를 사용할 수 있습니다. 자동 통합이 전혀 활성화되지 않은 상태에서 Honeybadger.notify, Honeybadger.context 등을 그대로 사용할 수 있으니, 말 그대로 최소한의 예측 가능한 Ruby용 오류 추적입니다.
require 'honeybadger/ruby'
begin
# 오류가 발생하는 코드
rescue => exception
Honeybadger.notify(exception)
end
다중 에이전트(Multiple Agents)
순수 Ruby 모드와 이어지는 이야기인데, 이제 Ruby 코드로 추가 에이전트를 생성할 수 있습니다. 에이전트란 Honeybadger 프로젝트에 오류를 보고하는 주체를 말합니다. 즉, 드디어 하나의 애플리케이션에서 여러 Honeybadger 프로젝트로 동시에 오류를 보고할 수 있게 된 것입니다. 사용 예시는 다음과 같습니다.
OtherBadger = Honeybadger::Agent.new
OtherBadger.configure do |config|
config.api_key = 'project api key'
end
begin
# 오류가 발생하는 코드
rescue => exception
OtherBadger.notify(exception)
end
Honeybadger.configure의 부활
먼저 안심하셔도 됩니다. 현재 honeybadger.yml로 젬을 설정하고 있다면 아무것도 달라지지 않았으며, 여전히 기본 설정 방식입니다!
그럼에도 불구하고 Ruby 코드로 프로그래밍 방식으로 젬을 설정하는 기능을 그리워하는 고객들이 있었습니다. v3.0에서는 두 가지 방식의 장점을 모두 누릴 수 있습니다. honeybadger.yml과 환경 변수를 통한 전체 설정을 계속 지원하는 동시에 Honeybadger.configure를 다시 추가했습니다.
Honeybadger.configure do |config|
config.api_key = 'project api key'
config.exceptions.ignore += [CustomError]
end
설정 우선순위는 YAML → ENV → Ruby 순서입니다. 즉, 환경 변수가 honeybadger.yml 값을 덮어쓰고, Honeybadger.configure가 환경 변수를 덮어씁니다.
cron 작업 및 커맨드라인 프로그램의 오류 보고
cron의 오랜 문제 중 하나는 자동 이메일 기능이 오류 출력을 제대로 이해하지 못한다는 점입니다. 작업이 실패하면 이메일을 보내주지만, 정상적으로 완료된 작업이 표준 출력을 생성하는 경우에도 이메일을 발송합니다.
잠깐, 어차피 조치가 필요 없는 이메일 알림을 줄이려고 Honeybadger를 사용하지 않나요? cron 실패를 이메일 대신, 혹은 이메일과 함께 Honeybadger로 보고할 수 있다면 얼마나 좋을까요? 이제 그게 가능합니다.
CLI(커맨드라인 인터페이스)에 honeybadger exec 명령을 추가하여 cron 실패는 물론, 커맨드라인에서 실행하는 모든 명령의 오류를 보고할 수 있습니다. bash 스크립트, 실행 파일, make 태스크 등 무엇이든 해당됩니다. 사용법도 간단합니다. 명령 앞에 honeybadger exec만 붙이면 됩니다.
$ honeybadger exec my-command --my-flag
명령이 성공적으로 실행되면 종료 코드 0과 함께 아무 출력 없이 종료됩니다(기본적으로 표준 출력조차 비활성화되지만, 특별한 플래그로 활성화할 수 있습니다). 반면 명령이 실패하면 실행된 명령과 전체 출력을 포함한 Honeybadger 알림을 받게 됩니다.
honeybadger exec는 성공한 명령의 모든 출력을 기본적으로 차단하기 때문에 cron의 이메일 기능과 함께 사용할 때 특히 유용합니다. 두 기능을 함께 사용하면 명령이 실패했을 때 Honeybadger 알림을 받고, 만약 연결 문제 등으로 Honeybadger 알림 자체가 실패하더라도 원래 명령의 출력이 덤프되어 cron이 여전히 실패 사실을 이메일로 알려주므로 이중 안전장치가 됩니다.
커맨드라인에서 커스텀 오류 보고
이 기능은 아주 간단합니다. bash 스크립트(또는 어떤 셸이든)에서 커스텀 Honeybadger 알림을 보내고 싶다면 honeybadger notify를 사용하세요.
$ honeybadger notify --message "This is an error from the command line"
--class, --component, --action 등의 선택적 플래그를 사용해 알림에 추가 속성을 담을 수도 있습니다.
기타 개선 사항
v3에는 이 외에도 더 많은 기능과 개선이 포함되어 있습니다.
Honeybadger.notify가 이제 예외 객체 외에 문자열 인자도 받을 수 있습니다. 예를 들어Honeybadger.notify("these are not the badgers you're looking for")처럼 호출할 수 있습니다.- git 저장소 안에서 예외가 발생하면 git 리비전이 자동으로 함께 보고됩니다. 새로운
:revision설정 옵션으로 리비전을 수동으로 추가하거나 변경할 수도 있습니다. - CLI 사용자 인터페이스가 상세한 오류 메시지를 제공하도록 크게 개선되었으며, Rails 외부에서 독립 실행 파일로도 사용할 수 있습니다.
- 테스트 스위트가 약 10배 빨라져, 새로운 기능과 통합을 더욱 빠르게 개발할 수 있게 되었습니다.
- 요청 데이터 필터가 기본적으로 와일드카드 매칭 전략을 사용합니다. 따라서 "password"를 필터링하면 "password"와 "password_confirmation" 요청 파라미터가 모두 필터링됩니다(Rails 필터와 동일한 방식).
변경 및 제거 사항
더 이상 의미가 없어진 일부 기능은 변경하거나 제거했습니다.
- Ruby 1.9.3과 2.0.x에 대한 지원을 중단했습니다. 앞으로 2.1.0이 공식적으로 지원되는 최소 버전입니다.
- v2에서 폐기 예정(deprecated)으로 표시된 모든 항목을 제거했습니다.
- 폐기 예정이었던 메트릭(metrics)과 트레이싱(tracing) 관련 코드가 삭제되었습니다.
Honeybadger.start는 더 이상 필요하지 않으며, 호출 시 예외가 발생합니다. 이전에 Rails 밖에서 Honeybadger를 사용했다면, 별도의Honeybadger::Config인스턴스를 만들거나Honeybadger.start를 호출하지 않고도Honeybadger.configure만으로 에이전트를 설정할 수 있습니다.plugins.skip옵션명이skipped_plugins로 변경되었으며,sidekiq.use_component는 이제 기본값이true입니다.- CGI 변수가 화이트리스트 방식으로 처리되어, 민감한 데이터가 실수로 노출될 가능성이 줄었습니다.
- 개발 환경에서는 유효하지 않은 인자로
Honeybadger.notify를 호출하면 예외가 발생하고, 프로덕션 환경에서는 오류가 로그로 기록됩니다. - honeybadger.yml 평가 중 발생하는 오류는 이제 로그 대신 예외로 발생하여 설정 문제를 더 일찍 발견할 수 있습니다. ERB 태그 내부 오류의 백트레이스도 개선되어 디버깅이 한결 쉬워졌습니다.