Skip to content

Commit

Permalink
Config factories
Browse files Browse the repository at this point in the history
  • Loading branch information
cep21 committed Jan 3, 2018
1 parent ee5d8a5 commit 5ffe776
Show file tree
Hide file tree
Showing 6 changed files with 30 additions and 38 deletions.
4 changes: 3 additions & 1 deletion benchmarking/benchmark_hystrix_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,9 @@ type circuitImpls struct {
}

func BenchmarkCiruits(b *testing.B) {
rollingTimeoutStats := rolling.CollectRollingStats(rolling.RunStatsConfig{}, rolling.FallbackStatsConfig{})("")
sf := rolling.StatFactory{}
rollingTimeoutStats := sf.CreateConfig("")
//rollingTimeoutStats := rolling.CollectRollingStats(rolling.RunStatsConfig{}, rolling.FallbackStatsConfig{})("")
rollingTimeoutStats.Merge(circuit.Config{
Execution: circuit.ExecutionConfig{
Timeout: -1,
Expand Down
9 changes: 6 additions & 3 deletions closers/hystrix/circuit_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,14 @@ import (
)

func TestCircuitCloses(t *testing.T) {
f := ConfigFactory{
ConfigureOpenOnErrPercentage: ConfigureOpenOnErrPercentage{
RequestVolumeThreshold: 1,
},
}
h := circuit.Manager{
DefaultCircuitProperties: []circuit.CommandPropertiesConstructor{
Config(ConfigureSleepyCloseCheck{}, ConfigureOpenOnErrPercentage{
RequestVolumeThreshold: 1,
}),
f.Configure,
},
}
c := h.MustCreateCircuit("TestCircuitCloses")
Expand Down
21 changes: 11 additions & 10 deletions closers/hystrix/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,17 @@ package circuit

import "github.com/cep21/circuit"

var _ circuit.CommandPropertiesConstructor = Config(ConfigureSleepyCloseCheck{}, ConfigureOpenOnErrPercentage{})
type ConfigFactory struct {
ConfigureSleepyCloseCheck ConfigureSleepyCloseCheck
ConfigureOpenOnErrPercentage ConfigureOpenOnErrPercentage
}

// Config creates a circuit configuration constructor that uses hystrix open/close logic
func Config(closeConfig ConfigureSleepyCloseCheck, openConfig ConfigureOpenOnErrPercentage) func(circuitName string) circuit.Config {
return func(_ string) circuit.Config {
return circuit.Config{
General: circuit.GeneralConfig{
OpenToClosedFactory: SleepyCloseCheckFactory(closeConfig),
ClosedToOpenFactory: OpenOnErrPercentageFactory(openConfig),
},
}
// Configure creates a circuit configuration constructor that uses hystrix open/close logic
func (c *ConfigFactory) Configure(circuitName string) circuit.Config {
return circuit.Config{
General: circuit.GeneralConfig{
OpenToClosedFactory: SleepyCloseCheckFactory(c.ConfigureSleepyCloseCheck),
ClosedToOpenFactory: OpenOnErrPercentageFactory(c.ConfigureOpenOnErrPercentage),
},
}
}
3 changes: 2 additions & 1 deletion example/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,9 @@ import (
const exampleURL = "http://localhost:7979/hystrix-dashboard/monitor/monitor.html?streams=%5B%7B%22name%22%3A%22%22%2C%22stream%22%3A%22http%3A%2F%2Flocalhost%3A8123%2Fhystrix.stream%22%2C%22auth%22%3A%22%22%2C%22delay%22%3A%22%22%7D%5D"

func main() {
f := rolling.StatFactory{}
h := circuit.Manager{
DefaultCircuitProperties: []circuit.CommandPropertiesConstructor{rolling.CollectRollingStats(rolling.RunStatsConfig{}, rolling.FallbackStatsConfig{})},
DefaultCircuitProperties: []circuit.CommandPropertiesConstructor{f.CreateConfig},
}
expvar.Publish("hystrix", h.Var())
es := metriceventstream.MetricEventStream{
Expand Down
19 changes: 0 additions & 19 deletions metrics/rolling/rolling.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,25 +65,6 @@ func (s *StatFactory) FallbackStats(circuitName string) *FallbackStats {
return s.fallbackStatsByCircuit[circuitName]
}

// CollectRollingStats enables stats needed to display metric event streams on a hystrix dashboard, as well as it
// gives easy access to rolling and total latency stats
func CollectRollingStats(runConfig RunStatsConfig, fallbackConfig FallbackStatsConfig) func(string) circuit.Config {
return func(_ string) circuit.Config {
rs := RunStats{}
runConfig.Merge(defaultRunStatsConfig)
rs.SetConfigNotThreadSafe(runConfig)
fs := FallbackStats{}
fallbackConfig.Merge(defaultFallbackStatsConfig)
fs.SetConfigNotThreadSafe(fallbackConfig)
return circuit.Config{
Metrics: circuit.MetricsCollectors{
Run: []circuit.RunMetrics{&rs},
Fallback: []circuit.FallbackMetrics{&fs},
},
}
}
}

// FindCommandMetrics searches a circuit for the previously stored run stats. Returns nil if never set.
func FindCommandMetrics(c *circuit.Circuit) *RunStats {
for _, r := range c.CmdMetricCollector {
Expand Down
12 changes: 8 additions & 4 deletions metrics/rolling/rolling_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ import (
)

func TestHappyCircuit(t *testing.T) {
c := circuit.NewCircuitFromConfig("TestHappyCircuit", CollectRollingStats(RunStatsConfig{}, FallbackStatsConfig{})(""))
s := StatFactory{}
c := circuit.NewCircuitFromConfig("TestHappyCircuit", s.CreateConfig(""))
err := c.Execute(context.Background(), testhelp.AlwaysPasses, nil)
if err != nil {
t.Error("saw error from circuit that always passes")
Expand All @@ -34,7 +35,8 @@ func TestHappyCircuit(t *testing.T) {
}

func TestBadRequest(t *testing.T) {
c := circuit.NewCircuitFromConfig("TestBadRequest", CollectRollingStats(RunStatsConfig{}, FallbackStatsConfig{})(""))
s := StatFactory{}
c := circuit.NewCircuitFromConfig("TestBadRequest", s.CreateConfig(""))
err := c.Execute(context.Background(), func(_ context.Context) error {
return circuit.SimpleBadRequest{
Err: errors.New("this request is bad"),
Expand All @@ -59,7 +61,8 @@ func TestBadRequest(t *testing.T) {
}

func TestFallbackCircuit(t *testing.T) {
c := circuit.NewCircuitFromConfig("TestFallbackCircuit", CollectRollingStats(RunStatsConfig{}, FallbackStatsConfig{})(""))
s := StatFactory{}
c := circuit.NewCircuitFromConfig("TestFallbackCircuit", s.CreateConfig(""))
err := c.Execute(context.Background(), testhelp.AlwaysFails, testhelp.AlwaysPassesFallback)
if err != nil {
t.Error("saw error from circuit that has happy fallback", err)
Expand All @@ -84,8 +87,9 @@ func TestFallbackCircuit(t *testing.T) {
}

func TestCircuitIgnoreContextFailures(t *testing.T) {
s := StatFactory{}
h := circuit.Manager{
DefaultCircuitProperties: []circuit.CommandPropertiesConstructor{CollectRollingStats(RunStatsConfig{}, FallbackStatsConfig{})},
DefaultCircuitProperties: []circuit.CommandPropertiesConstructor{s.CreateConfig},
}
c := h.MustCreateCircuit("TestFailingCircuit", circuit.Config{
Execution: circuit.ExecutionConfig{
Expand Down

0 comments on commit 5ffe776

Please sign in to comment.