Skip to content

Latest commit

 

History

History
88 lines (70 loc) · 2.53 KB

manual.md

File metadata and controls

88 lines (70 loc) · 2.53 KB
title sidebar_position slug keywords
Manually setting feature control points
1
manually-setting-feature-control-points-using-golang-sdk
go
sdk
feature
flow
control
points
manual

<a href={https://pkg.go.dev/github.com/fluxninja/aperture-go}>Aperture Go SDK can be used to manually set feature control points within a Go service.

To do so, first create an instance of ApertureClient:

agentHost := "localhost"
agentPort := "8089"

apertureAgentGRPCClient, err := grpcClient(ctx, net.JoinHostPort(agentHost, agentPort))
if err != nil {
  log.Fatalf("failed to create flow control client: %v", err)
}

opts := aperture.Options{
  ApertureAgentGRPCClientConn: apertureAgentGRPCClient,
  CheckTimeout:                200 * time.Millisecond,
}

// initialize Aperture Client with the provided options.
apertureClient, err := aperture.NewClient(ctx, opts)
if err != nil {
  log.Fatalf("failed to create client: %v", err)
}

The created instance can then be used to start a flow:

    // business logic produces labels
    labels := map[string]string{
        "key": "value",
    }

    rampMode := false

    // StartFlow performs a flowcontrolv1.Check call to Aperture Agent. It returns a Flow and an error if any.
    flow, err := a.apertureClient.StartFlow(ctx, "featureName", labels, rampMode)
    if err != nil {
        log.Printf("Aperture flow control got error. Returned flow defaults to Allowed. flow.ShouldRun(): %t", flow.ShouldRun())
    }

    // See whether flow was accepted by Aperture Agent.
    if flow.ShouldRun() {
        // do actual work
    } else {
        // handle flow rejection by Aperture Agent
        flow.SetStatus(aperture.Error)
    }
    _ = flow.End()

For more context on using Aperture Go SDK to set feature control points, refer to the example app available in the repository.

HTTP Middleware

You can also automatically set middleware for your HTTP server using the SDK. To do so, after creating an instance of ApertureClient, use the middleware on your router:

  mux.Use(aperturemiddlewares.NewHTTPMiddleware(apertureClient, "awesomeFeature", nil))

For simplicity, you can also pass a list of regexp patterns to match against the request path, for which the middleware will pass through. This is especially useful for endpoints like /healthz:

  mux.Use(aperturemiddlewares.NewHTTPMiddleware(apertureClient, "awesomeFeature", []regexp.Regexp{regexp.MustCompile("/health.*")}))