Open Spanner
SDKs

Go

Use Open Spanner from Go services.

Install:

go get github.com/ssubedir/open-spanner/sdk/go@latest

REST Example

Create a meter and record usage from a trusted Go service:

package main

import (
	"os"

	httptransport "github.com/go-openapi/runtime/client"
	"github.com/go-openapi/strfmt"

	"github.com/ssubedir/open-spanner/sdk/go/client"
	"github.com/ssubedir/open-spanner/sdk/go/client/meters"
	"github.com/ssubedir/open-spanner/sdk/go/client/usages"
	"github.com/ssubedir/open-spanner/sdk/go/models"
)

func main() {
	transport := httptransport.New("localhost:18081", client.DefaultBasePath, []string{"http"})
	transport.DefaultAuthentication = httptransport.BearerToken(os.Getenv("OPEN_SPANNER_API_KEY"))
	api := client.New(transport, strfmt.Default)

	meterName := "api_requests"

	if _, err := api.Meters.CreateMeter(
		meters.NewCreateMeterParams().WithRequest(&models.MeterCreateRequest{
			Name:               meterName,
			Description:        "API requests served",
			Unit:               "request",
			Aggregation:        "sum",
			EventRetentionDays: 90,
		}),
	); err != nil {
		panic(err)
	}

	if _, err := api.Usages.CreateUsage(
		usages.NewCreateUsageParams().WithRequest(&models.UsageCreateRequest{
			IdempotencyKey: "usage_001",
			Subject:        "org_123",
			Meter:          meterName,
			Quantity:       1,
			Metadata: map[string]any{
				"endpoint": "/v1/orders",
				"region":   "us-east",
			},
		}),
	); err != nil {
		panic(err)
	}
}

Create an API key in the dashboard first and expose it to your backend process as OPEN_SPANNER_API_KEY.

gRPC Stream Example

Use the stream client when a backend service continuously emits usage:

package main

import (
	"context"
	"os"
	"time"

	"github.com/ssubedir/open-spanner/sdk/go/stream"
)

func main() {
	ctx := context.Background()

	client, err := stream.NewClient("localhost:18090", os.Getenv("OPEN_SPANNER_API_KEY"))
	if err != nil {
		panic(err)
	}
	defer client.Close()

	_, err = client.Track(ctx, stream.Event{
		IdempotencyKey: "stream_usage_001",
		Subject:        "org_123",
		Meter:          "api_requests",
		Quantity:       1,
		Timestamp:      time.Now().UTC(),
		Metadata: map[string]any{
			"endpoint": "/v1/orders",
			"region":   "us-east",
		},
	})
	if err != nil {
		panic(err)
	}
}

Run The Full Examples

cd examples/rest/basic/go
go run main.go

cd examples/stream/basic/go
go run main.go

On this page