Make External API Dependency Healthy Again

with Contracts

by

Dolganov Sergey @ Evil Martians

Why?

Over and Over Again

Ideal World

Example 

Ossert:

  • 4 APIs already depends
  • Storage per quarter
  • Non-incremential storage

Twitter API:

  • Public data for last week only

Non-Increment al

Per Quarter Storage

Layout (for Ossert)

Incremental

Per Week

Storage

twitter gem

Failed

Requests

Recovery

Just Fire and Forget

App Life Cycle

Prevention

Test Coverage

Issue

Release

Diagnostics

Metrics, Alerts, Customers Feedback

What If ...

Risk Is a Human Life?

Car Diagnostics

Car Computer Diagnostics

Design for Testing

Design for Testing

  • Recognize State

  • Capture Statistics

  • Record Debugging Data

How to Determine State in the App?

Design by Contracts

  • What does a contract expect?

  • What does a contract guarantee?

  • What does a contract maintain?

PORO Contract

Under Microscope

Design for Testing

  • Recognize State

  • Capture Statistics

  • Record Debugging Data

Recognize State

Capture Statistics

+

Structured

Logs

Record Debugging Data

Tracing

Sampling

blood_contracts gem

"Rails" for Contracts

Contract is a test that runs all the time in production

App Life Cycle

Prevention

+ Contract Coverage

Issue

+ Contract  Exceptions

Release

Diagnostics

+ Contract Stats & Samples

Why?

Ruby encourages us:

  • to express our ideas

  • to experiment

  • to learn by doing

  • to understand complex things

  • to share

Thanks

Blood Contracts: sclinede/blood_contracts

PORO Contracts: sclinede/poro_contract