ES /docs

Fail to create salesforce Facility resource. reason: STRING_TOO_LONG: Project Name: data value too l

RCA: Fail to create salesforce Facility resource (STRING_TOO_LONG)

Overview#

What Happened#

2026-05-26 15:32~15:53 UTC 사이에 cupixworks-worker의 SalesforceResourceCreateWorker가 Salesforce에 Facility(Project__c) 레코드를 생성하려 할 때, Facility 이름이 80자를 초과하여 Salesforce API가 STRING_TOO_LONG 에러를 반환했다. us-west-2 리전에서 3건 발생.

Quick Facts#

Field Value
exception.class Restforce::ErrorCode::StringTooLong (Salesforce API error)
exception.message STRING_TOO_LONG: Project Name: data value too large (max length=80)
top_frame app/services/cupix/salesforce/client/base.rb:23
env production, us-west-2
deploy production-us-west-2-20260526T0438Z0-dd7bd097-cupixworks

Affected Teams#

Team / Domain Error Count Impact
cupix (Salesforce integration) 3 Facility가 Salesforce에 동기화되지 않음. CRM에서 해당 프로젝트 추적 불가.

Timeline#

  1. 2026-05-26T15:32:56Z — Facility ID 20729 (82자 이름) 생성 실패
  2. 2026-05-26T15:51:33Z — Facility ID 20733 (92자 이름) 생성 실패
  3. 2026-05-26T15:53:19Z — Facility ID 20734 (85자 이름) 생성 실패
  4. 2026-05-27 — RCA 수행

Error Log#

Datadog Logs

text
Fail to create salesforce Facility resource. reason: STRING_TOO_LONG: Project Name: data value too large: Walmart/FMGI - 2829.1000 Fort Myers FL Neighborhood Market - New Construction Project (max length=80)
RESPONSE: [{"message":"Project Name: data value too large: Walmart/FMGI - 2829.1000 Fort Myers FL Neighborhood Market - New Construction Project (max length=80)","errorCode":"STRING_TOO_LONG","fields":["Name"]}]

Impact#

  • Service: cupixworks-worker
  • 발생 횟수: 3
  • 최초 발생: 2026-05-26T15:32:56.735Z
  • 최근 발생: 2026-05-26T15:53:19.365Z
  • 영향: Salesforce에 Facility(Project__c) 레코드가 생성되지 않아 CRM 추적이 누락됨. sf_resource_id가 nil로 남아 이후 업데이트 동기화도 불가.

Root Cause Summary#

Salesforce의 Project__c 커스텀 오브젝트에서 Name 필드의 최대 길이는 80자로 제한되어 있다. CupixWorks에서 Facility를 생성할 때 model.name을 그대로 Salesforce API에 전달하는데, 이름 길이에 대한 검증이나 truncation 로직이 전혀 없다. 사용자가 80자를 초과하는 긴 프로젝트 이름(예: "Walmart/FMGI - 2829.1000 Fort Myers FL Neighborhood Market - New Construction Project", 82자)을 입력하면 Salesforce API가 STRING_TOO_LONG 에러를 반환하고, create_resource!는 에러를 로깅만 하고 nil을 반환한다.

Technical Analysis#

Code Path#

  • Entry point: app/models/concerns/salesforce_integratable/facility.rb:14after_commit :create_salesforce_resource_in_worker
  • Worker: app/workers/salesforce_resource_create_worker.rb:8SalesforceService.create_resource!(model) 호출
  • API 호출: app/services/cupix/salesforce/client/base.rb:23@client.create!(sobject_name, create_params(model))
  • Failure point: app/services/cupix/salesforce/client/facility.rb:17Name: model.name (truncation 없이 직접 전달)

Facility가 생성되면 after_commit 훅이 SalesforceResourceCreateWorker를 비동기로 실행한다:

app/models/concerns/salesforce_integratable/facility.rb:14-21ruby
after_commit :create_salesforce_resource_in_worker, if: :create_salesforce_resource?, on: :create

def create_salesforce_resource?
  self.sf_resource_id.blank?
end

def create_salesforce_resource_in_worker
  SalesforceResourceCreateWorker.perform_async(self.id, self.class.name)
end

Worker가 SalesforceService.create_resource!를 호출하면 최종적으로 Cupix::Salesforce::Client::Facility#create_params에서 파라미터를 구성한다:

app/services/cupix/salesforce/client/facility.rb:14-21ruby
def create_params(model)
  {
    Account__c: parent_resource_id(model),
    Name: model.name,
    Project_ID__c: model.id,
    CupixWorks_Team_Domain__c: model.team.domain
  }
end

model.name이 80자를 초과하면 Salesforce API(Restforce)가 예외를 발생시키고, base 클래스에서 에러를 catch하여 로깅만 한다:

app/services/cupix/salesforce/client/base.rb:22-27ruby
begin
  resource_id = @client.create!(sobject_name, create_params(model))
  Cupix::Logger.info("Salesforce #{model.class.name} resource is created successful. salesforce_resource_id: #{resource_id}", class: self.class.name, function: __method__, model: log_meta(model))
rescue => e
  Cupix::Logger.error("Fail to create salesforce #{model.class.name} resource. reason: #{e.message}", class: self.class.name, function: __method__, model: log_meta(model))
end

resource_id는 nil 상태로 반환되고, worker에서 model.update!(sf_resource_id: nil)이 되어 향후 재시도/동기화도 불가능해진다.

Log Evidence#

Datadog 쿼리:

text
service:cupixworks-worker status:error @environment:production "STRING_TOO_LONG"

동일 시간대에 STRING_TOO_LONG으로 실패한 3건의 로그:

json
{
  "timestamp": "2026-05-26T15:32:56.735Z",
  "class": "Cupix::Salesforce::Client::Facility",
  "function": "create_resource!",
  "model": {"type": "Facility", "id": 20729, "name": "Walmart/FMGI - 2829.1000 Fort Myers FL Neighborhood Market - New Construction Project"},
  "message": "Fail to create salesforce Facility resource. reason: STRING_TOO_LONG: Project Name: data value too large (max length=80)"
}
json
{
  "timestamp": "2026-05-26T15:51:33.312Z",
  "class": "Cupix::Salesforce::Client::Facility",
  "function": "create_resource!",
  "model": {"type": "Facility", "id": 20733, "name": "7543 - Gold Ridge Fire Protection District Phase 2: Fire Station Remodel / Addition Project"},
  "message": "Fail to create salesforce Facility resource. reason: STRING_TOO_LONG: Project Name: data value too large (max length=80)"
}
json
{
  "timestamp": "2026-05-26T15:53:19.365Z",
  "class": "Cupix::Salesforce::Client::Facility",
  "function": "create_resource!",
  "model": {"type": "Facility", "id": 20734, "name": "Walmart/Mycon - Walmart Industrial 6069.1005 St. James, MO - Office Remodel Project"},
  "message": "Fail to create salesforce Facility resource. reason: STRING_TOO_LONG: Project Name: data value too large (max length=80)"
}

영향 받은 Facility ID: 20729, 20733, 20734 — 모두 이름 길이가 80자 초과 (82자, 92자, 85자).

Hypotheses Considered#

# Hypothesis Evidence for Evidence against Verdict
H1 Facility 이름이 Salesforce Name 필드 최대 길이(80자)를 초과하여 API 거부 Salesforce 응답에 STRING_TOO_LONG, max length=80 명시. create_params에서 model.name 직접 전달 (facility.rb:17). 실패한 이름 모두 80자 초과 확인. Confirmed
H2 Salesforce API 일시적 장애로 인한 에러 같은 시간대 다른 에러(FIELD_CUSTOM_VALIDATION_EXCEPTION)도 존재 에러 응답이 명확한 validation 메시지이며 재시도해도 동일 결과. 짧은 이름의 Facility는 성공적으로 생성됨. Rejected
H3 Restforce 라이브러리 버그로 인한 잘못된 인코딩/잘림 에러 메시지에 전체 이름이 올바르게 포함되어 있고, Salesforce 응답도 정상 형식. 라이브러리가 아닌 데이터 문제. Rejected

Fix Recommendation#

즉시 조치 (Critical)#

  • app/services/cupix/salesforce/client/facility.rb:17Name 파라미터에 truncation 적용 (80자 제한)
  • Truncation 시 말줄임 표시 추가 고려 (예: 77자 + "...")
  • 에러 발생 시 이미 누락된 Facility ID 20729, 20733, 20734에 대해 수동으로 이름을 줄여 재동기화 필요

단기 개선 (1주 이내)#

  • Cupix::Salesforce::Client::Base 레벨에서 Salesforce 필드별 길이 제한을 상수로 정의하고, create_params 결과에 대해 자동 truncation하는 공통 로직 추가
  • Truncation 발생 시 warn 레벨 로그 출력하여 추적 가능하게 설정
  • SalesforceResourceCreateWorker의 retry 설정(현재 retry: 1)을 STRING_TOO_LONG 같은 deterministic 에러에 대해서는 재시도하지 않도록 조건부 처리

장기 개선 (재발 방지)#

  • Facility 모델에 name 길이 validation 추가 (UI에서 사용자에게 80자 제한 안내)
  • Salesforce 필드 메타데이터를 Describe API로 조회하여 런타임에 필드 제한을 캐싱하는 방식 도입
  • Salesforce 동기화 실패한 레코드를 추적하는 대시보드/알림 구축 (현재는 에러 로그만 남고 재시도 메커니즘 없음)

Monitoring#

  • 추가 메트릭: Salesforce 동기화 실패 건수를 sf_resource_id IS NULL AND created_at < 1.hour.ago 조건으로 모니터링
  • Datadog 쿼리:
text
service:cupixworks-worker status:error "STRING_TOO_LONG"
  • 알림: STRING_TOO_LONG 에러가 1건 이상 발생 시 Slack 알림 설정

Risk Assessment#

  • Risk level: low
  • 예상 복잡도: trivial — create_params에서 truncation 한 줄 추가로 해결 가능. Salesforce CRM 데이터 정합성에는 truncated 이름이 들어가므로 비즈니스 팀과 확인 필요.