• This repository has been archived on 02/Jul/2020
  • Stars
    star
    3,832
  • Rank 10,323 (Top 0.3 %)
  • Language
    Scala
  • License
    Apache License 2.0
  • Created over 8 years ago
  • Updated over 3 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Find potential bugs in your services with Diffy

Twitter has decided to archive this project, as it was built on our outdated tech stack, making it unpractical to maintain it in its current form. Furthermore, we are reinventing in this space internally to accommodate newer use-cases for validating our services. As we mature these new approaches, we will reevaluate how and when to re-release these new solutions as open source software. Thank you for your understanding. We won't be accepting pull requests or responding to issues for this project anymore.

Note that @puneetkhanduri, this project's original author and a former Twitter employee maintains their own version of this project, called Opendiffy.

Diffy

GitHub license Build status Coverage status Project status Gitter Maven Central

What is Diffy?

Diffy finds potential bugs in your service using running instances of your new code and your old code side by side. Diffy behaves as a proxy and multicasts whatever requests it receives to each of the running instances. It then compares the responses, and reports any regressions that may surface from those comparisons. The premise for Diffy is that if two implementations of the service return β€œsimilar” responses for a sufficiently large and diverse set of requests, then the two implementations can be treated as equivalent and the newer implementation is regression-free. For a more detailed analysis of Diffy checkout this blogpost.

How does Diffy work?

Diffy acts as a proxy that accepts requests drawn from any source that you provide and multicasts each of those requests to three different service instances:

  1. A candidate instance running your new code
  2. A primary instance running your last known-good code
  3. A secondary instance running the same known-good code as the primary instance

As Diffy receives a request, it is multicast and sent to your candidate, primary, and secondary instances. When those services send responses back, Diffy compares those responses and looks for two things:

  1. Raw differences observed between the candidate and primary instances.
  2. Non-deterministic noise observed between the primary and secondary instances. Since both of these instances are running known-good code, you should expect responses to be in agreement. If not, your service may have non-deterministic behavior, which is to be expected. Diffy Topology

Diffy measures how often primary and secondary disagree with each other vs. how often primary and candidate disagree with each other. If these measurements are roughly the same, then Diffy determines that there is nothing wrong and that the error can be ignored.

How to get started?

Running the example

The example.sh script included here builds and launches example servers as well as a diffy instance. Verify that the following ports are available (9000, 9100, 9200, 8880, 8881, & 8888) and run ./example/run.sh start.

Once your local Diffy instance is deployed, you send it a few requests like curl --header "Canonical-Resource: Json" localhost:8880/json?Twitter. You can then go to your browser at http://localhost:8888 to see what the differences across our example instances look like.

Digging deeper

That was cool but now you want to compare old and new versions of your own service. Here’s how you can start using Diffy to compare three instances of your service:

  1. Deploy your old code to localhost:9990. This is your primary.

  2. Deploy your old code to localhost:9991. This is your secondary.

  3. Deploy your new code to localhost:9992. This is your candidate.

  4. Download the latest Diffy binary from maven central or build your own from the code using ./sbt assembly.

  5. Run the Diffy jar with following command line arguments:

    java -jar diffy-server.jar \
    -candidate=localhost:9992 \
    -master.primary=localhost:9990 \
    -master.secondary=localhost:9991 \
    -service.protocol=http \
    -serviceName=My-Service \
    -proxy.port=:8880 \
    -admin.port=:8881 \
    -http.port=:8888 \
    -rootUrl='localhost:8888'
    
  6. Send a few test requests to your Diffy instance on its proxy port:

    curl localhost:8880/your/application/route?with=queryparams
    
  7. Watch the differences show up in your browser at http://localhost:8888.

Using Diffy with Docker

You can pull the official docker image with docker pull diffy/diffy

And run it with

docker run -ti \
  -p 8880:8880 -p 8881:8881 -p 8888:8888 \
  diffy/diffy \
    -candidate=localhost:9992 \
    -master.primary=localhost:9990 \
    -master.secondary=localhost:9991 \
    -service.protocol=http \
    -serviceName="Test-Service" \
    -proxy.port=:8880 \
    -admin.port=:8881 \
    -http.port=:8888 \
    -rootUrl=localhost:8888

You should now be able to point to:

To build from source you can run docker build -t diffy .

FAQ's

For safety reasons POST, PUT, DELETE are ignored by default . Add -allowHttpSideEffects=true to your command line arguments to enable these verbs.

HTTPS

If you are trying to run Diffy over a HTTPS API, the config required is:

-service.protocol=https

And in case of the HTTPS port be different than 443:

-https.port=123

License

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this software except in compliance with the License.

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

More Repositories

1

snowflake

Snowflake is a network service for generating unique ID numbers at high scale with some simple guarantees.
Scala
7,445
star
2

flockdb

A distributed, fault-tolerant graph database
Scala
3,320
star
3

kestrel

simple, distributed message queue system (inactive)
Scala
2,778
star
4

twui

A UI framework for Mac based on Core Animation
Objective-C
2,756
star
5

CocoaSPDY

SPDY for iOS and OS X
Objective-C
2,399
star
6

gizzard

[Archived] A flexible sharding framework for creating eventually-consistent distributed datastores
Scala
2,247
star
7

distributedlog

A high performance replicated log service. (The development is moved to Apache Incubator)
Java
2,234
star
8

recess

A simple and attractive code quality tool for CSS built on top of LESS
CSS
2,196
star
9

commons

Twitter common libraries for python and the JVM (deprecated)
Java
2,111
star
10

iago

A load generator, built for engineers
Scala
1,357
star
11

twitter-text-js

A JavaScript implementation of Twitter's text processing library
1,214
star
12

ambrose

A platform for visualization and real-time monitoring of data workflows
Java
1,182
star
13

twitter-kit-android

Twitter Kit for Android
Java
820
star
14

ostrich

A stats collector & reporter for Scala servers (deprecated)
Scala
774
star
15

twitter-kit-ios

Twitter Kit is a native SDK to include Twitter content inside mobile apps.
Objective-C
678
star
16

twitter-text-rb

A library that does auto linking and extraction of usernames, lists and hashtags in tweets
615
star
17

mysos

Cotton (formerly known as Mysos)
591
star
18

twitter-text-objc

An Objective-C implementation of Twitter's text processing library
586
star
19

torch-autograd

Autograd automatically differentiates native Torch code
Lua
550
star
20

ospriet

An example audience moderation app built on Twitter
JavaScript
407
star
21

cloudhopper-smpp

Efficient, scalable, and flexible Java implementation of the Short Messaging Peer to Peer Protocol (SMPP)
Java
379
star
22

twitter-text-java

A Java implementation of Twitter's text processing library
361
star
23

jvmgcprof

A simple utility for profile allocation and garbage collection activity in the JVM
C
343
star
24

css-flip

A CSS BiDi flipper
JavaScript
311
star
25

clockworkraven

Human-Powered Data Analysis with Mechanical Turk
Ruby
299
star
26

torch-twrl

Torch-twrl is a package that enables reinforcement learning in Torch.
Lua
250
star
27

twemperf

A tool for measuring memcached server performance
C
240
star
28

cassie

A Scala client for Cassandra
Scala
238
star
29

hdfs-du

Visualize your HDFS cluster usage
JavaScript
229
star
30

pycascading

A Python wrapper for Cascading
Python
222
star
31

RTLtextarea

Automatically detects RTL and configures a text input
JavaScript
169
star
32

haplocheirus

A Redis-backed storage engine for timelines
Scala
132
star
33

standard-project

A slightly more standard sbt project plugin library
Scala
131
star
34

torch-decisiontree

This project implements random forests and gradient boosted decision trees (GBDT). The latter uses gradient tree boosting. Both use ensemble learning to produce ensembles of decision trees (that is, forests).
Lua
126
star
35

elephant-twin

Elephant Twin is a framework for creating indexes in Hadoop
Java
95
star
36

torch-ipc

A set of primitives for parallel computation in Torch
C
94
star
37

torch-distlearn

A set of distributed learning algorithms for Torch
Lua
92
star
38

libcrunch

A lightweight mapping framework that maps data objects to a number of nodes, subject to constraints
Java
89
star
39

scribe

A Ruby client library for Scribe
Ruby
89
star
40

sbt-package-dist

sbt 11 plugin codifying best practices for building, packaging, and publishing
Scala
87
star
41

twisitor

A simple and spectacular photo-tweeting birdhouse
JavaScript
83
star
42

flockdb-client

A Ruby client library for FlockDB
Ruby
82
star
43

code-of-conduct

Open Source Code of Conduct at Twitter
80
star
44

twitter-text-conformance

Conformance testing data for the twitter-text-* repositories
76
star
45

torch-dataset

An extensible and high performance method of reading, sampling and processing data for Torch
Lua
74
star
46

naggati2

Protocol builder for netty using scala (DEPRECATED)
Scala
74
star
47

cdk

CDK is a tool to quickly generate single-file html slide presentations from AsciiDoc
CSS
72
star
48

twitter-kit-unity

Twitter Kit for Unity
C#
70
star
49

plumage.js

Batteries Included App Framework for Data Intensive UIs
JavaScript
65
star
50

gozer

Prototype mesos framework using new low-level API built in Go
Go
60
star
51

bookkeeper

Twitter's fork of Apache BookKeeper (will push changes upstream eventually)
Java
58
star
52

grabby-hands

A JVM Kestrel client that aggregates queues from multiple servers. Implemented in Scala with Java bindings. In use at Twitter for all JVM Search and Streaming Kestrel interactions.
Scala
55
star
53

thrift

Twitter's out-of-date, forked thrift
C++
52
star
54

gizzmo

A command-line client for Gizzard
Ruby
51
star
55

time_constants

Time constants, in seconds, so you don't have to use slow ActiveSupport helpers
Ruby
48
star
56

libkestrel

libkestrel
Scala
46
star
57

sbt-scrooge

An SBT plugin that adds a mixin for doing Thrift code auto-generation during your compile phase
Scala
44
star
58

cli-guide.js

CLI Guide JQuery Plugin
JavaScript
40
star
59

sbt-thrift

sbt rules for generating source stubs out of thrift IDLs, for java & scala
Ruby
37
star
60

jaqen

A type-safe heterogenous Map or a Named field Tuple
Scala
34
star
61

spitball

A very simple gem package generation tool built on bundler
Ruby
32
star
62

torch-thrift

A Thrift codec for Torch
C
27
star
63

jsr166e

JSR166e for Twitter
Java
27
star
64

unishark

Unishark: Another unittest extension for Python
Python
25
star
65

raggiana

A simple standalone Finagle stats viewer
JavaScript
20
star
66

sekhmet

foundational tools and building blocks for gaining insights and diagnosing system health in real-time
19
star
67

periscope-live-engagement-unity-sdk

Periscope Live Engagement Unity SDK
C#
18
star
68

twitterActors

Improved Scala actors library; used internally at Twitter
Scala
17
star
69

finatra-activator-http-seed

Typesafe activator template for constructing a Finatra HTTP server application:
Scala
17
star
70

killdeer

Killdeer is a simple server for replaying a sample of responses to sythentically recreate production response characteristics.
Scala
15
star
71

elephant-twin-lzo

Elephant Twin LZO uses Elephant Twin to create LZO block indexes
Java
14
star
72

bittern

Bittern Cache uses nvdimm to speed up block io operations
C
13
star
73

finatra-activator-thrift-seed

Typesafe activator template for constructing a Finatra Thrift server application: https://twitter.github.io/finatra/user-guide/ β€”
Scala
10
star
74

chainsaw

A thin Scala wrapper for SLF4J
Scala
9
star
75

oscon-puzzles

OSCON 2014 Puzzle
JavaScript
6
star
76

PerfTracepoint

Perf tracepoint support for the JVM
Java
6
star
77

scala-json

JSON in Scala (deprecated)
Scala
3
star
78

scala-csp-config

A Scala library for configuring Content Security Policy headers for HTTP responses.
Scala
3
star
79

finatra-misc

Miscellaneous libraries and utils used by Finatra
Scala
2
star
80

.github

1
star